Ich möchte ein Bild neben einem UILabel anzeigen, UILabel hat jedoch eine variable Textlänge, sodass ich nicht weiß, wo das Bild platziert werden soll. Wie kann ich das erreichen?
Ich möchte ein Bild neben einem UILabel anzeigen, UILabel hat jedoch eine variable Textlänge, sodass ich nicht weiß, wo das Bild platziert werden soll. Wie kann ich das erreichen?
Antworten:
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 äußerst 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);
self.yourLabel.intrinsicContentSize
Dadurch erhalten Sie die Größe des Etiketteninhalts, sodass Sie nur die Breite von dort erhalten können.
yourLabel.intrinsicContentSize.width
super, siehe Antwort unten.
yourLabel.intrinsicContentSize.width
für Objective-C / Swift
Die ausgewählte Antwort ist für iOS 6 und niedriger korrekt.
In iOS 7 sizeWithFont:constrainedToSize:lineBreakMode:
wurde veraltet . Es wird jetzt empfohlen, dass Sie verwenden 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 a CGRect
nicht a ist CGSize
. 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 werden Sie die anderen nicht brauchen
Swift 4 Antworte, wer Constraint verwendet
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 Antworte, wer Constraint verwendet
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;
Folgendes habe ich mir ausgedacht, nachdem ich einige Prinzipien anderer SO-Beiträge angewendet hatte, 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, der die Größe eines UILabels entsprechend der Textgröße ändert. Außerdem wird auf der linken Seite der Ansicht ein Bild hinzugefügt, sodass Sie einen Teil des Codes sehen, der den richtigen Abstand für das Bild und das Auffüllen verwaltet.
Der Schlüssel besteht darin, CGSize titleSize = [myAnnotation.THETEXT sizeWithFont:[UIFont systemFontOfSize:12]];
die Abmessungen der Ansicht zu verwenden und anschließend 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 sofort ausprobieren sollten, bevor Sie irgendwohin gehen, wenn Sie eine dynamischere Ansicht mit einem Bild und einem UILabel mit veränderbarer Größe wünschen. Ich habe schon die ganze Arbeit für dich gemacht !!
[yourString boundingRectWithSize:maximumLabelSize options:NSStringDrawingUsesLineFragmentOrigin attributes:@{ NSFontAttributeName:yourLabel.font } context:nil];