Ich möchte ein Bild neben einem UILabel anzeigen, aber UILabel hat eine variable Textlänge, sodass ich nicht weiß, wo ich das Bild platzieren soll. Wie kann ich das erreichen?
CGSize expectedLabelSize = [yourString sizeWithFont:yourLabel.font
constrainedToSize:maximumLabelSize
lineBreakMode:yourLabel.lineBreakMode];
Wofür ist - [NSString sizeWithFont: forWidth: lineBreakMode:] gut?
diese Frage könnte Ihre Antwort haben, es hat bei mir funktioniert.
Für 2014 habe ich diese neue Version bearbeitet, basierend auf dem ultra-praktischen 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);
yourLabel.intrinsicContentSize.width
für Objective-C/Swift
In Swift
yourLabel.intrinsicContentSize().width
Die ausgewählte Antwort ist für iOS 6 und niedriger korrekt.
In iOS 7 wird sizeWithFont:constrainedToSize:lineBreakMode:
war veraltet. Es wird jetzt empfohlen, dass Sie boundingRectWithSize:options:attributes:context:
.
CGRect expectedLabelSize = [yourString boundingRectWithSize:sizeOfRect
options:<NSStringDrawingOptions>
attributes:@{
NSFontAttributeName: yourString.font
AnyOtherAttributes: valuesForAttributes
}
context:(NSStringDrawingContext *)];
Beachten Sie, dass der Rückgabewert ein CGRect
und kein CGSize
ist. Hoffentlich hilft das den Leuten, die es in iOS 7 verwenden.
In iOS8 ist sizeWithFont veraltet, siehe
CGSize yourLabelSize = [yourLabel.text sizeWithAttributes:@{NSFontAttributeName : [UIFont fontWithName:yourLabel.font size:yourLabel.fontSize]}];
Sie können alle gewünschten Attribute in sizeWithAttributes hinzufügen. Andere Attribute, die Sie festlegen können:
- NSForegroundColorAttributeName
- NSParagraphStyleAttributeName
- NSBackgroundColorAttributeName
- NSShadowAttributeName
und so weiter. Aber wahrscheinlich wirst du die anderen nicht 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 Answer, 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
Folgendes habe ich mir ausgedacht, nachdem ich ein paar andere Grundsätze angewendet hatte SO), einschließlich Aarons 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 füge ich einer MKAnnotation-Klasse einen benutzerdefinierten Pin hinzu, mit dem die Größe eines UILabels entsprechend der Textgröße geändert wird. Es wird auch ein Bild auf der linken Seite der Ansicht hinzugefügt, sodass Sie einen Teil des Codes sehen, der den richtigen Abstand verwaltet, um das Bild und die Auffüllung zu handhaben.
Der Schlüssel ist, CGSize titleSize = [myAnnotation.THETEXT sizeWithFont:[UIFont systemFontOfSize:12]];
Zu verwenden und dann die Dimensionen der Ansicht neu zu definieren. Sie können diese Logik auf jede Ansicht anwenden.
Obwohl Aarons Antwort für einige funktioniert, hat sie für mich nicht funktioniert. Dies ist eine weitaus detailliertere Erklärung, die Sie unmittelbar vor dem Wechsel zu einem anderen Ort ausprobieren sollten, wenn Sie eine dynamischere Ansicht mit einem Bild und einer anpassbaren UILabel-Größe wünschen. Ich habe schon die ganze Arbeit für dich getan !!