NSString sizeWithFont: constrainedToSize: il ritorno di altezza non corretto di display retina

StackOverflow https://stackoverflow.com/questions/4662441

  •  10-10-2019
  •  | 
  •  

Domanda

Credo di aver trovato un caso limite per sizeWithFont: constrainedToSize: dove, su un display retina, sarà a volte (sembra basato sulla parola wrapping) restituisce una linea più alta altezza 1 di quanto sia effettivamente necessario, e ancora più importante di quanto sia in realtà disegna.

Nota: il codice vero e proprio che sto usando è sepolto all'interno performante mano centrica cella codice vista tabella ad altezza variabile disegnato, così ho distillato la questione fino al livello più semplice un po 'di codice di esempio possibile. (Si prega di prendere nota di questo quando si cerca di rispondere qualcosa di diverso la mia domanda: -)

Questa UIView campione riempie di contenuti, le misure il testo adattandolo (tela), riempie che rect, poi pesca il testo.

In un dispositivo retina (o simulatore) l'altezza viene restituito 1 linea troppo alto, ma su un dispositivo di pre-retina (o simulatore) restituisce l'altezza corretta.

Io apprezzo molto avere una visione chiara chiunque può avere, in quanto è un bug mi piacerebbe fix!

Molto Grazie!

-Eric

- (void)drawRect:(CGRect)rect {
 NSString * theString = @"Lorem ipsum dolor sit ameyyet, consectetur adipiscing elit. Etiam vel justo leo. Curabitur porta, elit vel.";
 UIFont * theFont = [UIFont systemFontOfSize:12];
 CGSize theConstraint = CGSizeMake(rect.size.width - 20, rect.size.height - 20);
 CGSize theResultSize = [theString sizeWithFont:theFont constrainedToSize:theConstraint];

 // dump the measurements
 NSLog(@"returned a size h = %f, w = %f", theResultSize.height, theResultSize.width);

 // fill the whole rect
 CGContextRef context = UIGraphicsGetCurrentContext();
 [[UIColor yellowColor] set];
 CGContextFillRect(context, rect);

 // fill the measured rect
 CGRect theRect = CGRectMake(10, 10, theResultSize.width, theResultSize.height);
 context = UIGraphicsGetCurrentContext();
 [[UIColor cyanColor] set];
 CGContextFillRect(context, theRect);

 // draw the text
 [[UIColor blackColor] set];
 [theString drawInRect:theRect withFont:theFont];
}

Il progetto intero semplice è disponibile qui .

Simulator Immagini:
http: //files.droplr. com / file / 9.979.822 / aLDJ.Screen% 20shot% 202011-01-11% 20at% 2012% 3A34% 3A34.png http: //files.droplr. com / file / 9979822 / YpCM.Screen% 20shot% 202011-01-11% 20at% 2012% 3A36% 3A47.png

È stato utile?

Soluzione

Sembra essere un problema con il simulatore. Questo è ciò che ho avuto quando mi sono imbattuto con un simulatore di Retina su OS 4.3.2

entrare descrizione dell'immagine qui

Altri suggerimenti

In seguito è il metodo che uso per trovare l'altezza di etichetta per il contenuto del testo dinamico. Questo funziona bene nella mia app


- (float)getHeightFortheDynamicLabel:(NSString *)stringForTheLabel
{
    UITextView *aSampleTextView;
    // 30 is the minimum height
    aSampleTextView = [[UITextView alloc] initWithFrame:CGRectMake(0, 0, mywidth, 30)];
    aSampleTextView.text = stringForTheLabel;
    aSampleTextView.font = [UIFont systemFontOfSize:kMyFontSize];
    aSampleTextView.alpha = 0;
    [self.view addSubview:aSampleTextView];
    float textViewHeight = aSampleTextView.contentSize.height;
    [aSampleTextView removeFromSuperview];
    [aSampleTextView release];
    return  textViewHeight;
}

        NSString *strSubstring = @"asdfghjklasdfghjkl adsds";

        CGFloat maxWidth = 205.0;
        CGFloat maxHeight = 9999;
        CGSize maximumLabelSize = CGSizeMake(maxWidth,maxHeight);
        CGSize expectedLabelSize = [strSubstring sizeWithFont:[UIFont fontWithName:@"StagSans-Light" size:12] constrainedToSize:maximumLabelSize lineBreakMode:UILineBreakModeWordWrap];

        NSLog(@"returned a size h = %f, w = %f", expectedLabelSize.height, expectedLabelSize.width);

        return expectedLabelSize;
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top