Я хочу відобразити зображення поруч з UILabel, проте UILabel має змінну довжину тексту, тому я не знаю, де розмістити зображення. Як я можу це досягти?
Я хочу відобразити зображення поруч з UILabel, проте UILabel має змінну довжину тексту, тому я не знаю, де розмістити зображення. Як я можу це досягти?
Відповіді:
CGSize expectedLabelSize = [yourString sizeWithFont:yourLabel.font
constrainedToSize:maximumLabelSize
lineBreakMode:yourLabel.lineBreakMode];
Що таке - [NSString sizeWithFont: forWidth: lineBreakMode:] добре?
на це запитання може бути ваша відповідь, він працював на мене.
У 2014 році я редагував цю нову версію, грунтуючись на надзвичайно зручному коментарі Норберта нижче! Це все робить. Ура
// 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
Це дасть вам розмір вмісту мітки, тому ви можете просто отримати ширину звідти.
yourLabel.intrinsicContentSize.width
чудово працює, перевірте відповідь нижче.
Вибрана відповідь правильна для iOS 6 та нижче.
У прошивці 7, sizeWithFont:constrainedToSize:lineBreakMode:
були застарілими . Тепер рекомендується використовувати boundingRectWithSize:options:attributes:context:
.
CGRect expectedLabelSize = [yourString boundingRectWithSize:sizeOfRect
options:<NSStringDrawingOptions>
attributes:@{
NSFontAttributeName: yourString.font
AnyOtherAttributes: valuesForAttributes
}
context:(NSStringDrawingContext *)];
Зауважте, що повернене значення - це CGRect
не a CGSize
. Сподіваємось, це допоможе людям, які використовують його в iOS 7.
У iOS8 розмірWithFont застарілий, будь ласка, зверніться до
CGSize yourLabelSize = [yourLabel.text sizeWithAttributes:@{NSFontAttributeName : [UIFont fontWithName:yourLabel.font size:yourLabel.fontSize]}];
Ви можете додати всі потрібні атрибути в sizeWithAttributes. Інші атрибути, які ви можете встановити:
- NSForegroundColorAttributeName
- NSParagraphStyleAttributeName
- NSBackgroundColorAttributeName
- NSShadowAttributeName
і так далі. Але, певно, вам не знадобляться інші
Swift 4 відповідь, хто використовує обмеження
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 Відповідь, хто використовує обмеження
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;
Ось, що я придумав, застосувавши кілька принципів інших публікацій щодо ПП, включаючи посилання Аарона:
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];
У цьому прикладі я додаю спеціальний штифт до класу MKAnnotation, який змінює розмір UILabel відповідно до розміру тексту. Він також додає зображення в лівій частині подання, тому ви бачите частину коду, що керує належним інтервалом для обробки зображення та накладки.
Ключовим моментом є використання CGSize titleSize = [myAnnotation.THETEXT sizeWithFont:[UIFont systemFontOfSize:12]];
та повторне визначення розмірів подання. Ви можете застосувати цю логіку до будь-якого виду.
Хоча відповідь Аарона для деяких працює, для мене це не спрацювало. Це набагато більш детальне пояснення, що вам слід спробувати негайно, перш ніж кудись поїхати, якщо ви хочете більш динамічний вигляд із зображенням та зміною UILabel. Я вже зробив всю роботу за вас !!
[yourString boundingRectWithSize:maximumLabelSize options:NSStringDrawingUsesLineFragmentOrigin attributes:@{ NSFontAttributeName:yourLabel.font } context:nil];