43 votes

Vous adaptez un UILabel?

Comment pourrait-on modifier le fragment de code suivant (dans un tableView:cellForRowAtIndexPath: UITableViewController méthode) de la "09a - PrefsTable" recette du Chapitre 6 de L'iPhone Developer Cookbook:

if (row == 1) { 
    // Create a big word-wrapped UILabel 
    cell = [tableView dequeueReusableCellWithIdentifier:@"libertyCell"]; 
    if (!cell) { 
        cell = [[[UITableViewCell alloc] initWithFrame:CGRectZero reuseIdentifier:@"libertyCell"] autorelease]; 
        [cell addSubview:[[UILabel alloc] initWithFrame:CGRectMake(20.0f, 10.0f, 280.0f, 330.0f)]]; 
    } 
    UILabel *sv = [[cell subviews] lastObject]; 
    sv.text =  @"When in the Course of human events, it becomes necessary for one people to dissolve the political bands which have connected them with another, and to assume among the powers of the earth, the separate and equal station to which the Laws of Nature and of Nature's God entitle them, a decent respect to the opinions of mankind requires that they should declare the causes which impel them to the separation."; 
    sv.textAlignment = UITextAlignmentCenter; 
    sv.lineBreakMode = UILineBreakModeWordWrap; 
    sv.numberOfLines = 9999; 
    return cell; 
}

...pour la taille de la "sv" UILabel sous-vue et la "cellule" UITableViewCell à être classé juste assez grand pour contenir le texte (et de travailler avec plus ou moins de texte, et d'autres types d'alignement du texte)? J'ai regardé la UILabel textRectForBounds:limitedToNumberOfLines: la méthode, mais la documentation indique qu'il ne doit pas être appelée directement (et ne doit être remplacée). J'ai testé la UIView sizeToFit méthode, sans succès.

Mise à jour: j'ai posé une nouvelle question au sujet de mon problème avec le NSString -sizeWithFont:forWidth:lineBreakMode: la méthode.

98voto

BadPirate Points 11614

Je devais le faire assez pour que je demande à UILabel de le faire pour moi:

 @interface UILabel (BPExtensions)
- (void)sizeToFitFixedWidth:(CGFloat)fixedWidth;
@end

@implementation UILabel (BPExtensions)


- (void)sizeToFitFixedWidth:(CGFloat)fixedWidth
{
    self.frame = CGRectMake(self.frame.origin.x, self.frame.origin.y, fixedWidth, 0);
    self.lineBreakMode = NSLineBreakByWordWrapping;
    self.numberOfLines = 0;
    [self sizeToFit];
}
@end
 

alors d'avoir une étiquette pour avoir une hauteur multiligne variable mais une largeur fixe simplement:

[myLabel sizeToFitFixedWidth:kSomeFixedWidth];

17voto

Kevin Ballard Points 88866

Vous devez utiliser la méthode -sizeWithFont:forWidth:lineBreakMode: NSString pour récupérer les métriques de dimensionnement associées pour votre étiquette.

10voto

Ben Alpert Points 30381

Changez également la propriété numberOfLines en 0 si vous allez utiliser ce code.

5voto

pix0r Points 17854

NSString 's -sizeWithFont:forWidth:lineBreakMode: n'exécute pas réellement le retour à la ligne. Utilisez plutôt -sizeWithFont:constrainedToSize:lineBreakMode: pour obtenir une valeur de largeur ET hauteur précise pour la chaîne.

4voto

Sebastian Points 1363

Essaye ça:

 sv.text =  @"When in the Course of human events, it becomes necessary for one people to dissolve the political bands which have connected them with another, and to assume among the powers of the earth, the separate and equal station to which the Laws of Nature and of Nature's God entitle them, a decent respect to the opinions of mankind requires that they should declare the causes which impel them to the separation."; 
sv.textAlignment = UITextAlignmentCenter; 
sv.lineBreakMode = UILineBreakModeWordWrap; 
sv.numberOfLines = 0;
[sv sizeToFit]; 
 

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X