Saya ingin menampilkan gambar di sebelah UILabel, namun UILabel memiliki panjang teks variabel, jadi saya tidak tahu di mana harus menempatkan gambar. Bagaimana saya bisa mencapai ini?
Saya ingin menampilkan gambar di sebelah UILabel, namun UILabel memiliki panjang teks variabel, jadi saya tidak tahu di mana harus menempatkan gambar. Bagaimana saya bisa mencapai ini?
Jawaban:
CGSize expectedLabelSize = [yourString sizeWithFont:yourLabel.font
constrainedToSize:maximumLabelSize
lineBreakMode:yourLabel.lineBreakMode];
Apa itu - [NSString sizeWithFont: forWidth: lineBreakMode:] bagus untuk?
pertanyaan ini mungkin punya jawaban Anda, itu berhasil untuk saya.
Untuk 2014, saya mengedit dalam versi baru ini, berdasarkan komentar ultra-praktis oleh Norbert di bawah ini! Ini melakukan segalanya. Bersulang
// 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
Ini akan memberi Anda ukuran konten label, sehingga Anda bisa mendapatkan lebar dari sana.
yourLabel.intrinsicContentSize.width
bagus, periksa jawaban di bawah ini.
Jawaban yang dipilih benar untuk iOS 6 dan di bawah.
Di iOS 7, sizeWithFont:constrainedToSize:lineBreakMode:
sudah usang . Sekarang disarankan Anda menggunakan boundingRectWithSize:options:attributes:context:
.
CGRect expectedLabelSize = [yourString boundingRectWithSize:sizeOfRect
options:<NSStringDrawingOptions>
attributes:@{
NSFontAttributeName: yourString.font
AnyOtherAttributes: valuesForAttributes
}
context:(NSStringDrawingContext *)];
Perhatikan bahwa nilai kembali CGRect
bukan a CGSize
. Semoga itu akan menjadi bantuan bagi orang yang menggunakannya di iOS 7.
Di iOS8 sizeWithFont telah ditinggalkan, lihat
CGSize yourLabelSize = [yourLabel.text sizeWithAttributes:@{NSFontAttributeName : [UIFont fontWithName:yourLabel.font size:yourLabel.fontSize]}];
Anda bisa menambahkan semua atribut yang Anda inginkan di sizeWithAttributes. Atribut lain yang dapat Anda atur:
- NSForegroundColorAttributeName
- NSParagraphStyleAttributeName
- NSBackgroundColorAttributeName
- NSShadowAttributeName
dan seterusnya. Tapi mungkin Anda tidak akan membutuhkan yang lain
Swift 4 Jawab yang menggunakan Kendala
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 Jawab yang menggunakan Kendala
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;
Inilah sesuatu yang saya buat setelah menerapkan beberapa prinsip posting SO lainnya, termasuk tautan Aaron:
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];
Dalam contoh ini, saya menambahkan pin khusus ke kelas MKAnnotation yang mengubah ukuran UILabel sesuai dengan ukuran teks. Ini juga menambahkan gambar di sisi kiri tampilan, sehingga Anda melihat beberapa kode mengelola spasi yang tepat untuk menangani gambar dan bantalan.
Kuncinya adalah menggunakan CGSize titleSize = [myAnnotation.THETEXT sizeWithFont:[UIFont systemFontOfSize:12]];
dan kemudian mendefinisikan kembali dimensi tampilan. Anda dapat menerapkan logika ini untuk tampilan apa pun.
Meskipun jawaban Harun bekerja untuk beberapa orang, itu tidak berhasil untuk saya. Ini adalah penjelasan yang jauh lebih terperinci yang harus Anda coba segera sebelum pergi ke tempat lain jika Anda ingin tampilan yang lebih dinamis dengan gambar dan UILabel yang dapat diubah ukurannya. Saya sudah melakukan semua pekerjaan untuk Anda !!
[yourString boundingRectWithSize:maximumLabelSize options:NSStringDrawingUsesLineFragmentOrigin attributes:@{ NSFontAttributeName:yourLabel.font } context:nil];