web-dev-qa-db-fra.com

Étiquettes de dimensionnement dynamique ios

J'ai essayé de chercher en ligne, mais je n'ai pas trouvé de réponse claire à mon problème, je suis donc venu vous demander votre avis d'expert. J'ai une vue avec 2 étiquettes dessus. La première étiquette est utilisée pour afficher l'abréviation d'un nom, 2-3 lettres. et la deuxième étiquette montre le nom complet.

La question que je me pose est de savoir s'il existe un moyen de dimensionner dynamiquement l'étiquette en fonction du type de police, de la taille et de la longueur de chaîne indiqués? Je demande parce que je voudrais que la deuxième étiquette soit proche de la première sans trop d'espace vide entre les deux ou sans que la première étiquette ne chevauche la seconde.

La raison pour laquelle ce n'est pas tout dans une seule étiquette est parce que la première étiquette doit avoir une police plus grande et un jeu de couleurs différent de la deuxième étiquette.

Tout conseil est grandement appréciée.

28
Seb

Vous pouvez calculer la taille dans laquelle votre chaîne apparaîtra, puis définir le cadre de votre UILabel à cette taille, voir le code suivant comme exemple -

//Calculate the expected size based on the font and linebreak mode of your label
CGSize maximumLabelSize = CGSizeMake(296,9999);

CGSize expectedLabelSize = [yourString sizeWithFont:yourLabel.font 
                        constrainedToSize:maximumLabelSize 
                        lineBreakMode:yourLabel.lineBreakMode]; 

//adjust the label the the new height.
CGRect newFrame = yourLabel.frame;
newFrame.size.height = expectedLabelSize.height;
yourLabel.frame = newFrame;

Mise à jour -

Utilisation sizeWithAttributes: à la place, qui prend maintenant un NSDictionary. Passez la paire avec la clé UITextAttributeFont et votre objet de police comme ceci:

CGSize size = [string sizeWithAttributes:
                       @{NSFontAttributeName:
                         [UIFont systemFontOfSize:17.0f]}];

Vérifiez Remplacement de la taille obsolèteWithFont: dans iOS 7? pour plus de détails

64
Saurabh

Cela fera également l'affaire et tiendra compte du texte attribué

label.attributedText = attrString;
CGSize maximumLabelSize = CGSizeMake(187,CGFLOAT_MAX);
CGSize requiredSize = [label sizeThatFits:maximumLabelSize];
CGRect labelFrame = label.frame;
labelFrame.size.height = requiredSize.height;
label.frame = labelFrame;
16
noRema

'sizeWithFont:' est obsolète: d'abord obsolète dans iOS 7.0.

essayez donc sizeWithAttributes

- (void)viewDidLoad
{
    [super viewDidLoad];

    label = [[UILabel alloc] initWithFrame:CGRectMake(20, 40, 300, 20)];

    label.backgroundColor = [UIColor blueColor];

     const CGFloat fontSize = 30;
     UIFont *regularFont = [UIFont systemFontOfSize:fontSize];
     UIColor *foregroundColor = [UIColor blackColor];

     attrs = [NSDictionary dictionaryWithObjectsAndKeys:
     regularFont, NSFontAttributeName,
     foregroundColor, NSForegroundColorAttributeName
     , nil];

     NSMutableAttributedString *attributedText = [[NSMutableAttributedString alloc]
     initWithString:@"Test Text"
     attributes:attrs];

     [label setAttributedText:attributedText];
     [self.view addSubview:label];
}

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
{
    CGSize expectedLabelSize = [label.text sizeWithAttributes:attrs]; // iOS 7 Code <--

    CGRect newFrame = label.frame;
    newFrame.size.width = expectedLabelSize.width;
    label.frame = newFrame;

    NSMutableAttributedString *attributedText = [[NSMutableAttributedString alloc]
                                                 initWithString:@"Longer Test Text"
                                                 attributes:attrs];

    [label setAttributedText:attributedText];
}
10
schirrmacher

Comme sizeWithFont: est déconseillé dans iOS 7 , vous devez utiliser sizeWithAttributes (comme l'explique Maver ici ). Afin de simplifier le code, vous pouvez ajouter une méthode que vous pouvez réutiliser comme ceci:

-(CGRect)rectForText:(NSString *)text 
           usingFont:(UIFont *)font 
       boundedBySize:(CGSize)maxSize
{
    NSAttributedString *attrString =
        [[NSAttributedString alloc] initWithString:text
                                        attributes:@{ NSFontAttributeName:font}];

    return [attrString boundingRectWithSize:maxSize
                                    options:NSStringDrawingUsesLineFragmentOrigin
                                    context:nil];
}

Et profitez-en

CGSize maximumLabelSize = CGSizeMake(280,9999);
UIFont *font = [UIFont systemFontOfSize:20];
CGRect titleRect = [self rectForText:post.title // <- your text here 
                           usingFont:font
                       boundedBySize:maximumLabelSize];
8
eduludi

En plus de la réponse de Saurabh. J'ai eu le même problème et vous devriez ajouter cette ligne
[yourLabel setNumberOfLines:0];
pour que tout le texte soit affiché en X lignes.

7
Slavcho