Je souhaite afficher une image à côté d'un UILabel, mais UILabel a une longueur de texte variable. Je ne sais donc pas où placer l'image. Comment puis-je accomplir cela?
CGSize expectedLabelSize = [yourString sizeWithFont:yourLabel.font
constrainedToSize:maximumLabelSize
lineBreakMode:yourLabel.lineBreakMode];
Qu'est-ce que - [NSString sizeWithFont: forWidth: lineBreakMode:] convient-il?
cette question pourrait avoir votre réponse, cela a fonctionné pour moi.
Pour 2014, j'ai édité dans cette nouvelle version, basée sur le commentaire ultra-pratique de Norbert ci-dessous! Cela fait tout. À votre santé
// yourLabel is your UILabel.
float widthIs =
[self.yourLabel.text
boundingRectWithSize:self.yourLabel.frame.size
options:NSStringDrawingUsesLineFragmentOrigin
attributes:@{ NSFontAttributeName:self.yourLabel.font }
context:nil]
.size.width;
NSLog(@"the width of yourLabel is %f", widthIs);
yourLabel.intrinsicContentSize.width
pour Objective-C/Swift
En rapide
yourLabel.intrinsicContentSize().width
La réponse sélectionnée est correcte pour iOS 6 et inférieur.
Dans iOS 7, sizeWithFont:constrainedToSize:lineBreakMode:
a été obsolète. Il est maintenant recommandé d'utiliser boundingRectWithSize:options:attributes:context:
.
CGRect expectedLabelSize = [yourString boundingRectWithSize:sizeOfRect
options:<NSStringDrawingOptions>
attributes:@{
NSFontAttributeName: yourString.font
AnyOtherAttributes: valuesForAttributes
}
context:(NSStringDrawingContext *)];
Notez que la valeur de retour est un CGRect
et non un CGSize
. Espérons que cela aidera les utilisateurs de iOS 7.
Dans iOS8, sizeWithFont est obsolète, veuillez vous référer à
CGSize yourLabelSize = [yourLabel.text sizeWithAttributes:@{NSFontAttributeName : [UIFont fontWithName:yourLabel.font size:yourLabel.fontSize]}];
Vous pouvez ajouter tous les attributs souhaités dans sizeWithAttributes. Autres attributs que vous pouvez définir:
- NSForegroundColorAttributeName
- NSParagraphStyleAttributeName
- NSBackgroundColorAttributeName
- NSShadowAttributeName
etc. Mais vous n'aurez probablement pas besoin des autres
CGRect rect = label.frame;
rect.size = [label.text sizeWithAttributes:@{NSFontAttributeName : [UIFont fontWithName:label.font.fontName size:label.font.pointSize]}];
label.frame = rect;
Swift 4 Answer qui utilise Constraint
label.text = "Hello World"
var rect: CGRect = label.frame //get frame of label
rect.size = (label.text?.size(attributes: [NSFontAttributeName: UIFont(name: label.font.fontName , size: label.font.pointSize)!]))! //Calculate as per label font
labelWidth.constant = rect.width // set width to Constraint outlet
Voici quelque chose que je suis venu après avoir appliqué quelques principes autres SO posts, y compris le lien de Aaron:
AnnotationPin *myAnnotation = (AnnotationPin *)annotation;
self = [super initWithAnnotation:myAnnotation reuseIdentifier:reuseIdentifier];
self.backgroundColor = [UIColor greenColor];
self.frame = CGRectMake(0,0,30,30);
imageView = [[UIImageView alloc] initWithImage:myAnnotation.THEIMAGE];
imageView.frame = CGRectMake(3,3,20,20);
imageView.layer.masksToBounds = NO;
[self addSubview:imageView];
[imageView release];
CGSize titleSize = [myAnnotation.THETEXT sizeWithFont:[UIFont systemFontOfSize:12]];
CGRect newFrame = self.frame;
newFrame.size.height = titleSize.height + 12;
newFrame.size.width = titleSize.width + 32;
self.frame = newFrame;
self.layer.borderColor = [UIColor colorWithRed:0 green:.3 blue:0 alpha:1.0f].CGColor;
self.layer.borderWidth = 3.0;
UILabel *infoLabel = [[UILabel alloc] initWithFrame:CGRectMake(26,5,newFrame.size.width-32,newFrame.size.height-12)];
infoLabel.text = myAnnotation.title;
infoLabel.backgroundColor = [UIColor clearColor];
infoLabel.textColor = [UIColor blackColor];
infoLabel.textAlignment = UITextAlignmentCenter;
infoLabel.font = [UIFont systemFontOfSize:12];
[self addSubview:infoLabel];
[infoLabel release];
Dans cet exemple, j'ajoute une broche personnalisée à une classe MKAnnotation qui redimensionne un UILabel en fonction de la taille du texte. Il ajoute également une image sur le côté gauche de la vue, ce qui vous permet de voir une partie du code gérer l'espacement approprié pour gérer l'image et le remplissage.
La clé est d'utiliser CGSize titleSize = [myAnnotation.THETEXT sizeWithFont:[UIFont systemFontOfSize:12]];
puis redéfinissez les dimensions de la vue. Vous pouvez appliquer cette logique à n’importe quelle vue.
Bien que la réponse d'Aaron fonctionne pour certains, cela ne fonctionna pas pour moi. Ceci est une explication beaucoup plus détaillée que vous devriez essayer immédiatement avant d'aller ailleurs si vous voulez une vue plus dynamique avec une image et UILabel redimensionnable. J'ai déjà fait tout le travail pour vous !!