Ben UILabel yanında bir görüntü görüntülemek istiyorum, ancak UILabel değişken metin uzunluğu vardır, bu yüzden görüntü nereye yerleştirmek bilmiyorum. Bunu nasıl başarabilirim?
Ben UILabel yanında bir görüntü görüntülemek istiyorum, ancak UILabel değişken metin uzunluğu vardır, bu yüzden görüntü nereye yerleştirmek bilmiyorum. Bunu nasıl başarabilirim?
Yanıtlar:
CGSize expectedLabelSize = [yourString sizeWithFont:yourLabel.font
constrainedToSize:maximumLabelSize
lineBreakMode:yourLabel.lineBreakMode];
- [NSString sizeWithFont: forWidth: lineBreakMode:] ne işe yarar?
bu sorunun cevabı olabilir, benim için çalıştı.
2014 için, aşağıdaki Norbert'in ultra kullanışlı yorumuna dayanarak bu yeni sürümde düzenledim! Bu her şeyi yapar. Şerefe
// 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
Bu size etiket içeriğinin boyutunu verecektir, böylece genişliği oradan alabilirsiniz.
yourLabel.intrinsicContentSize.width
harika çalışıyor, aşağıdaki cevabı kontrol edin.
Seçilen cevap iOS 6 ve önceki sürümler için doğrudur.
İOS 7'de, sizeWithFont:constrainedToSize:lineBreakMode:
olmuştur kaldırılmış . Şimdi kullanmanız tavsiye edilir boundingRectWithSize:options:attributes:context:
.
CGRect expectedLabelSize = [yourString boundingRectWithSize:sizeOfRect
options:<NSStringDrawingOptions>
attributes:@{
NSFontAttributeName: yourString.font
AnyOtherAttributes: valuesForAttributes
}
context:(NSStringDrawingContext *)];
Dönüş değerinin a CGRect
olmadığını unutmayın CGSize
. Umarım bu iOS 7'de kullanan insanlar için biraz yardımcı olacaktır.
İOS8 boyutundaWithFont kullanımdan kaldırıldı, lütfen
CGSize yourLabelSize = [yourLabel.text sizeWithAttributes:@{NSFontAttributeName : [UIFont fontWithName:yourLabel.font size:yourLabel.fontSize]}];
SizeWithAttributes boyutunda istediğiniz tüm nitelikleri ekleyebilirsiniz. Ayarlayabileceğiniz diğer özellikler:
- NSForegroundColorAttributeName
- NSParagraphStyleAttributeName
- NSBackgroundColorAttributeName
- NSShadowAttributeName
ve bunun gibi. Ama muhtemelen diğerlerine ihtiyacınız olmayacak
Kısıtlama kullanan Swift 4 Cevap
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
Kısıtlama kullanan Swift 5 Cevap
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;
Aaron'un bağlantısı da dahil olmak üzere diğer SO yayınlarının birkaç ilkesini uyguladıktan sonra ortaya koyduğum bir şey:
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];
Bu örnekte, bir MKAnnotation sınıfına metin boyutuna göre bir UILabel'ı yeniden boyutlandıran özel bir iğne ekliyorum. Ayrıca görünümün sol tarafına bir görüntü ekler, böylece görüntüyü ve dolguyu işlemek için uygun aralığı yöneten bazı kodları görürsünüz.
Anahtar CGSize titleSize = [myAnnotation.THETEXT sizeWithFont:[UIFont systemFontOfSize:12]];
görünümün boyutlarını kullanmak ve daha sonra yeniden tanımlamaktır. Bu mantığı herhangi bir görünüme uygulayabilirsiniz.
Aaron'un cevabı bazılarına rağmen, benim için işe yaramadı. Bu, bir görüntü ve yeniden boyutlandırılabilir UILabel ile daha dinamik bir görünüm istiyorsanız, başka bir yere gitmeden hemen önce denemeniz gereken çok daha ayrıntılı bir açıklamadır. Senin için zaten tüm işleri yaptım !!
[yourString boundingRectWithSize:maximumLabelSize options:NSStringDrawingUsesLineFragmentOrigin attributes:@{ NSFontAttributeName:yourLabel.font } context:nil];