Voglio visualizzare un'immagine accanto a un UILabel, tuttavia UILabel ha una lunghezza del testo variabile, quindi non so dove posizionare l'immagine. Come posso ottenere questo?
Voglio visualizzare un'immagine accanto a un UILabel, tuttavia UILabel ha una lunghezza del testo variabile, quindi non so dove posizionare l'immagine. Come posso ottenere questo?
Risposte:
CGSize expectedLabelSize = [yourString sizeWithFont:yourLabel.font
constrainedToSize:maximumLabelSize
lineBreakMode:yourLabel.lineBreakMode];
Cosa è - [NSString sizeWithFont: forWidth: lineBreakMode:] buono per?
questa domanda potrebbe avere la tua risposta, ha funzionato per me.
Per il 2014, ho modificato in questa nuova versione, in base al commento ultra pratico di Norbert qui sotto! Questo fa tutto. Saluti
// 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);
self.yourLabel.intrinsicContentSize
questo ti darà la dimensione del contenuto dell'etichetta, quindi puoi semplicemente ottenere la larghezza da lì.
yourLabel.intrinsicContentSize.width
grandi opere, controllo risposta qui sotto.
yourLabel.intrinsicContentSize.width
per Objective-C / Swift
La risposta selezionata è corretta per iOS 6 e versioni precedenti.
In iOS 7, sizeWithFont:constrainedToSize:lineBreakMode:
è stato deprecato . Si consiglia ora di utilizzare boundingRectWithSize:options:attributes:context:
.
CGRect expectedLabelSize = [yourString boundingRectWithSize:sizeOfRect
options:<NSStringDrawingOptions>
attributes:@{
NSFontAttributeName: yourString.font
AnyOtherAttributes: valuesForAttributes
}
context:(NSStringDrawingContext *)];
Si noti che il valore restituito è un CGRect
non a CGSize
. Spero che sarà di qualche aiuto per le persone che lo usano in iOS 7.
Nella dimensione iOS8, WithFont è obsoleto, fare riferimento a
CGSize yourLabelSize = [yourLabel.text sizeWithAttributes:@{NSFontAttributeName : [UIFont fontWithName:yourLabel.font size:yourLabel.fontSize]}];
È possibile aggiungere tutti gli attributi desiderati in sizeWithAttributes. Altri attributi che puoi impostare:
- NSForegroundColorAttributeName
- NSParagraphStyleAttributeName
- NSBackgroundColorAttributeName
- NSShadowAttributeName
e così via. Ma probabilmente non avrai bisogno degli altri
Swift 4 Rispondi a chi sta usando Vincolo
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
Swift 5 Rispondi a chi sta usando Vincolo
label.text = "Hello World"
var rect: CGRect = label.frame //get frame of label
rect.size = (label.text?.size(withAttributes: [NSAttributedString.Key.font: UIFont(name: label.font.fontName , size: label.font.pointSize)!]))! //Calculate as per label font
labelWidth.constant = rect.width // set width to Constraint outlet
CGRect rect = label.frame;
rect.size = [label.text sizeWithAttributes:@{NSFontAttributeName : [UIFont fontWithName:label.font.fontName size:label.font.pointSize]}];
label.frame = rect;
Ecco qualcosa che mi è venuto in mente dopo aver applicato alcuni principi altri post SO, incluso il link di 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];
In questo esempio, sto aggiungendo un pin personalizzato a una classe MKAnnotation che ridimensiona un UILabel in base alle dimensioni del testo. Aggiunge anche un'immagine sul lato sinistro della vista, in modo da vedere parte del codice che gestisce la spaziatura corretta per gestire l'immagine e il riempimento.
La chiave è usare CGSize titleSize = [myAnnotation.THETEXT sizeWithFont:[UIFont systemFontOfSize:12]];
e quindi ridefinire le dimensioni della vista. È possibile applicare questa logica a qualsiasi vista.
Sebbene la risposta di Aaron funzioni per alcuni, non ha funzionato per me. Questa è una spiegazione molto più dettagliata che dovresti provare immediatamente prima di andare altrove se desideri una vista più dinamica con un'immagine e UILabel ridimensionabile. Ho già fatto tutto il lavoro per te !!
[yourString boundingRectWithSize:maximumLabelSize options:NSStringDrawingUsesLineFragmentOrigin attributes:@{ NSFontAttributeName:yourLabel.font } context:nil];