Wie UILabel berechnen Breite auf Textlänge basiert?
-
30-09-2019 - |
Frage
Ich möchte neben einem UILabel um ein Bild anzuzeigen, jedoch UILabel hat variable Textlänge, so dass ich weiß nicht, wo das Bild zu platzieren. Wie kann ich das erreichen?
Lösung
CGSize expectedLabelSize = [yourString sizeWithFont:yourLabel.font
constrainedToSize:maximumLabelSize
lineBreakMode:yourLabel.lineBreakMode];
Was ist - [NSString sizeWithFont: forWidth: linebreak:] gut für ? a>
Diese Frage könnte Ihre Antwort hat, es funktionierte für mich.
Für 2014 habe ich in dieser neuen Version bearbeitet, basierend auf dem ultra-handlichen Kommentar von Norbert unten! Das macht alles. Prost
// 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);
Andere Tipps
yourLabel.intrinsicContentSize.width
für Objective-C / Swift
In swift
yourLabel.intrinsicContentSize().width
Die gewählte Antwort ist richtig für iOS 6 und unten.
In iOS 7, sizeWithFont:constrainedToSize:lineBreakMode:
wurde deprecated . Es wird nun empfohlen, dass Sie boundingRectWithSize:options:attributes:context:
verwenden.
CGRect expectedLabelSize = [yourString boundingRectWithSize:sizeOfRect
options:<NSStringDrawingOptions>
attributes:@{
NSFontAttributeName: yourString.font
AnyOtherAttributes: valuesForAttributes
}
context:(NSStringDrawingContext *)];
Beachten Sie, dass der Rückgabewert ist ein CGRect
kein CGSize
. Hoffentlich würde von einiger Hilfe für Menschen sein, indem es in iOS 7.
In iOS8 sizeWithFont veraltet ist, lesen Sie bitte
CGSize yourLabelSize = [yourLabel.text sizeWithAttributes:@{NSFontAttributeName : [UIFont fontWithName:yourLabel.font size:yourLabel.fontSize]}];
können Sie alle Attribute hinzufügen, die Sie in sizeWithAttributes möchten. Andere Attribute können Sie einstellen:
- NSForegroundColorAttributeName
- NSParagraphStyleAttributeName
- NSBackgroundColorAttributeName
- NSShadowAttributeName
und so weiter. Aber wahrscheinlich werden Sie nicht die anderen brauchen
CGRect rect = label.frame;
rect.size = [label.text sizeWithAttributes:@{NSFontAttributeName : [UIFont fontWithName:label.font.fontName size:label.font.pointSize]}];
label.frame = rect;
Swift 4 Antwort, die Constraint verwenden
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
Hier ist etwas, kam ich mit nach ein paar Prinzipien anderen SO Beiträge Anwendung, darunter Aaron Link:
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 diesem Beispiel, ich bin das Hinzufügen eines benutzerdefinierten Stift zu einer MKAnnotation Klasse, die eine UILabel entsprechend der Textgröße skaliert. Es fügt auch ein Bild auf der linken Seite der Ansicht, so dass Sie einen Teil der Verwaltung von Code den richtigen Abstand sehen, das Bild und Polsterung zu behandeln.
Der Schlüssel ist CGSize titleSize = [myAnnotation.THETEXT sizeWithFont:[UIFont systemFontOfSize:12]];
zu verwenden und dann die Dimensionen Sicht neu zu definieren. Sie können diese Logik zu jeder Ansicht gelten.
Obwohl Aaron Antwort für einige funktioniert, ist es nicht für mich arbeiten. Dies ist eine weit detailliertere Erklärung, dass Sie sofort, bevor sie anderswo versuchen sollten, wenn Sie eine dynamische Ansicht mit einem Bild und veränderbare UILabel wollen. Ich habe schon die ganze Arbeit für Sie !!