NSString sizeWithFont: constrainedToSize: retour hauteur incorrecte sur les écrans de la rétine
-
10-10-2019 - |
Question
Je crois que je l'ai trouvé un cas limite pour sizeWithFont: constrainedToSize: où, sur un écran de la rétine, il sera parfois (il semble basé sur l'emballage de mot) renvoie un plus grand de la hauteur de ligne 1 que ce qui est réellement nécessaire, et plus important que ce qui est il tire en fait.
NOTE: Le code réel J'utilise est enterré dans la main centrée sur table dressée hauteur performante variable de vue code de cellule, donc j'ai distillé la question jusqu'à aussi simple un peu de code échantillon possible. (S'il vous plaît prendre note de ce en essayant de quelque chose d'autre réponse que ma question: -)
Cet échantillon UIView remplit le contenu de ce, les mesures que le texte en forme (emballé), remplit ce rect, puis dessine le texte.
Sur un dispositif de rétine (ou simulateur) la hauteur est retournée une ligne trop grand, mais sur un dispositif de pré-rétine (ou simulateur), il renvoie la hauteur correcte.
J'apprécierais toute connaissance quiconque peut avoir, car il est un bug que je voudrais résoudre le problème!
Merci Beaucoup!
-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];
}
L'ensemble projet simple, est disponible .
Images Simulator:
http: //files.droplr. com / fichiers / 9979822 / aLDJ.Screen% 20shot% 202011-01-11% 20at% 2012% 3A34% 3A34.png
http: //files.droplr. com / fichiers / 9979822 / YpCM.Screen% 20shot% 202011-01-11% 20at% 2012% 3A36% 3A47.png
La solution
Il semble être un problème avec votre simulateur. Voilà ce que je suis quand je l'ai couru avec un simulateur Retina sur OS 4.3.2
Autres conseils
Après est la méthode que je l'utilise pour trouver la hauteur de l'étiquette pour le contenu de texte dynamique. Cela fonctionne très bien dans mon application
- (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;