126 votes

Comment vérifier si UILabel est tronqué?

J'ai un UILabel qui peuvent être de longueurs différentes en fonction de si oui ou non mon application est en cours d'exécution en mode portrait ou en mode paysage sur iPhone ou iPad. Lorsque le texte est trop long à afficher sur une seule ligne et il tronque je veux que l'utilisateur soit en mesure de le presser pour obtenir un popup en plein texte.

Comment puis-je vérifier pour voir si l' UILabel est le fait de tronquer le texte? Est-il même possible? Maintenant je suis en vérifiant, pour différentes longueurs, selon le mode que je suis, mais il ne fonctionne pas super bien.

121voto

progrmr Points 32412

Vous pouvez calculer la largeur de la chaîne et de voir si la largeur est supérieure à label.bounds.size.width

NSString UIKit Ajouts a plusieurs méthodes pour le calcul de la taille de la chaîne avec une police spécifique. Toutefois, si vous avez un minimumFontSize pour votre étiquette qui permet de réduire la taille du texte en bas de cette taille. Vous souhaiterez peut-être utiliser sizeWithFont:minFontSize:actualFontSize:forWidth:lineBreakMode: dans ce cas.

CGSize size = [label.text sizeWithFont:label.font];
if (size.width > label.bounds.size.width) {
   ...
}

21voto

Martin Points 3170

Si votre étiquette est multiligne, vous pouvez utiliser ce code:

 CGSize perfectSize = [mylabel.text sizeWithFont:mylabel.font constrainedToSize:CGSizeMake(mylabel.bounds.size.width, NSIntegerMax) lineBreakMode:mylabel.lineBreakMode];
if (perfectSize.height > mylabel.bounds.size.height) {
    NSLog(@"TOO MUCH");
}
 

14voto

DongXu Points 152

vous pouvez créer une catégorie avec UILabel

 - (BOOL)isTextTruncated

{
    CGRect testBounds = self.bounds;
    testBounds.size.height = NSIntegerMax;
    CGRect limitActual = [self textRectForBounds:[self bounds] limitedToNumberOfLines:self.numberOfLines];
    CGRect limitTest = [self textRectForBounds:testBounds limitedToNumberOfLines:self.numberOfLines + 1];
    return limitTest.size.height>limitActual.size.height;
}
 

10voto

iDev Points 2203

Utilisez cette méthode pour rechercher lable tronqué dans iOS 7 et supérieur.

   - (BOOL)isTruncated:(UILabel *)label{
        CGSize sizeOfText = [label.text boundingRectWithSize: CGSizeMake(label.bounds.size.width, CGFLOAT_MAX)
                                                     options: (NSStringDrawingUsesLineFragmentOrigin|NSStringDrawingUsesFontLeading)
                                                  attributes: [NSDictionary dictionaryWithObject:label.font forKey:NSFontAttributeName] context: nil].size;

        if (self.frame.size.height < ceilf(sizeOfText.height)) {
            return YES;
        }
        return NO;
    }
 

0voto

Raz Points 969

Parce que toutes les réponses ci-dessus utilisent des méthodes amorties, j'ai pensé que cela pourrait être utile:

 - (BOOL)isLabelTruncated:(UILabel *)label
{
    BOOL isTruncated = NO;

    CGRect labelSize = [label.text boundingRectWithSize:CGSizeFromString(label.text) options:NSStringDrawingUsesLineFragmentOrigin attributes:@{NSFontAttributeName : label.font} context:nil];

    if (labelSize.size.width / labelSize.size.height > label.numberOfLines) {

        isTruncated = YES;
    }

    return isTruncated;
}
 

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