NSString sizeWithFont: constrainedToSize: retour hauteur incorrecte sur les écrans de la rétine

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

  •  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

Était-ce utile?

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

entrer image description ici

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;
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top