Je veux afficher une image à côté d'un UILabel, cependant UILabel est variable et la longueur du texte, donc je ne sais pas où placer l'image. Comment puis-je accomplir?
Réponses
Trop de publicités?CGSize expectedLabelSize = [yourString sizeWithFont:yourLabel.font
constrainedToSize:maximumLabelSize
lineBreakMode:yourLabel.lineBreakMode];
Qu'est-ce que -[NSString sizeWithFont:forWidth:lineBreakMode:] bon?
cette question est peut-être votre réponse, il a travaillé pour moi.
Pour 2014, j'ai édité dans cette nouvelle version, basée sur l'ultra-pratique commentaire par Norbert ci-dessous! Ce n'est tout. Cheers
// 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);
La réponse sélectionnée est correcte pour iOS 6 et ci-dessous.
Dans iOS 7, sizeWithFont:constrainedToSize:lineBreakMode:
a été désapprouvée. Il est maintenant recommandé que vous utilisez 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
pas CGSize
. Espérons que ce sera de l'aide à des gens à l'utiliser dans iOS 7.
Voici quelque chose qui m'est venu après l'application de quelques principes de l'autre AFIN de les postes, y compris Aaron lien:
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, je vais ajouter un code pin personnalisé pour un MKAnnotation classe qui redimensionne un UILabel en fonction de la taille du texte. Il ajoute également une image sur le côté gauche de la vue, de sorte que vous voyez une partie du code de la gestion de l'espacement approprié pour traiter l'image et le rembourrage.
La clé est d'utiliser CGSize titleSize = [myAnnotation.THETEXT sizeWithFont:[UIFont systemFontOfSize:12]];
, puis de redéfinir la vue de ses dimensions. Vous pouvez appliquer cette logique à tout point de vue.
Bien qu'Aaron réponse qui fonctionne pour certains, cela n'a pas fonctionné pour moi. C'est beaucoup plus détaillée que vous devriez essayer immédiatement avant d'aller ailleurs si vous voulez une image plus dynamique avec une image et redimensionnable UILabel. J'ai déjà fait tout le travail pour vous!!