Saya memiliki UILabel
spasi dengan dua baris teks. Terkadang, ketika teks terlalu pendek, teks ini ditampilkan di tengah vertikal label.
Bagaimana cara menyelaraskan teks agar selalu berada di atas UILabel
?
sumber
Saya memiliki UILabel
spasi dengan dua baris teks. Terkadang, ketika teks terlalu pendek, teks ini ditampilkan di tengah vertikal label.
Bagaimana cara menyelaraskan teks agar selalu berada di atas UILabel
?
Tidak ada cara untuk mengatur vertikal-align pada UILabel
, tetapi Anda bisa mendapatkan efek yang sama dengan mengubah bingkai label. Saya telah membuat label saya berwarna oranye sehingga Anda dapat melihat dengan jelas apa yang terjadi.
Inilah cara cepat dan mudah untuk melakukan ini:
[myLabel sizeToFit];
Jika Anda memiliki label dengan teks yang lebih panjang yang akan menghasilkan lebih dari satu baris, setel numberOfLines
ke 0
(nol di sini berarti jumlah baris yang tidak terbatas).
myLabel.numberOfLines = 0;
[myLabel sizeToFit];
Versi yang lebih panjang
Saya akan membuat label saya dalam kode sehingga Anda dapat melihat apa yang terjadi. Anda dapat mengatur sebagian besar ini di Interface Builder juga. Setup saya adalah Aplikasi Berbasis Tampilan dengan gambar latar belakang yang saya buat di Photoshop untuk menunjukkan margin (20 poin). Labelnya adalah warna oranye yang menarik sehingga Anda dapat melihat apa yang terjadi dengan dimensi.
- (void)viewDidLoad
{
[super viewDidLoad];
// 20 point top and left margin. Sized to leave 20 pt at right.
CGRect labelFrame = CGRectMake(20, 20, 280, 150);
UILabel *myLabel = [[UILabel alloc] initWithFrame:labelFrame];
[myLabel setBackgroundColor:[UIColor orangeColor]];
NSString *labelText = @"I am the very model of a modern Major-General, I've information vegetable, animal, and mineral";
[myLabel setText:labelText];
// Tell the label to use an unlimited number of lines
[myLabel setNumberOfLines:0];
[myLabel sizeToFit];
[self.view addSubview:myLabel];
}
Beberapa batasan penggunaan sizeToFit
ikut bermain dengan teks rata tengah atau kanan. Inilah yang terjadi:
// myLabel.textAlignment = NSTextAlignmentRight;
myLabel.textAlignment = NSTextAlignmentCenter;
[myLabel setNumberOfLines:0];
[myLabel sizeToFit];
Label masih berukuran dengan sudut kiri atas yang diperbaiki. Anda dapat menyimpan lebar label asli dalam variabel dan mengaturnya setelahnya sizeToFit
, atau memberinya lebar tetap untuk mengatasi masalah ini:
myLabel.textAlignment = NSTextAlignmentCenter;
[myLabel setNumberOfLines:0];
[myLabel sizeToFit];
CGRect myFrame = myLabel.frame;
// Resize the frame's width to 280 (320 - margins)
// width could also be myOriginalLabelFrame.size.width
myFrame = CGRectMake(myFrame.origin.x, myFrame.origin.y, 280, myFrame.size.height);
myLabel.frame = myFrame;
Perhatikan bahwa sizeToFit
akan menghormati lebar minimum label awal Anda. Jika Anda mulai dengan label 100 lebar dan memanggilnya sizeToFit
, itu akan memberi Anda kembali label (mungkin sangat tinggi) dengan 100 (atau sedikit kurang) lebar. Anda mungkin ingin mengatur label ke lebar minimum yang Anda inginkan sebelum mengubah ukuran.
Beberapa hal lain yang perlu diperhatikan:
Apakah lineBreakMode
dihormati tergantung pada bagaimana pengaturannya. NSLineBreakByTruncatingTail
(default) diabaikan setelahnya sizeToFit
, seperti halnya dua mode pemotongan lainnya (kepala dan tengah). NSLineBreakByClipping
juga diabaikan. NSLineBreakByCharWrapping
bekerja seperti biasa. Lebar bingkai masih menyempit agar pas dengan huruf paling kanan.
Mark Amery memberikan perbaikan untuk NIB dan Storyboard menggunakan Tata Letak Otomatis di komentar:
Jika label Anda termasuk dalam nib atau storyboard sebagai subview dari
view
ViewController yang menggunakan autolayout, maka memasukkansizeToFit
panggilan Anda ke dalamviewDidLoad
tidak akan berhasil, karena ukuran autolayout dan posisi subview setelahviewDidLoad
dipanggil dan akan segera membatalkan efek dari AndasizeToFit
panggilan. Namun, panggilansizeToFit
dari dalamviewDidLayoutSubviews
akan berhasil.
Ini menggunakan NSString
metode sizeWithFont:constrainedToSize:lineBreakMode:
untuk menghitung tinggi bingkai yang dibutuhkan agar pas dengan string, kemudian menetapkan asal dan lebar.
Ubah ukuran bingkai untuk label menggunakan teks yang ingin Anda masukkan. Dengan begitu Anda dapat mengakomodasi sejumlah garis.
CGSize maximumSize = CGSizeMake(300, 9999);
NSString *dateString = @"The date today is January 1st, 1999";
UIFont *dateFont = [UIFont fontWithName:@"Helvetica" size:14];
CGSize dateStringSize = [dateString sizeWithFont:dateFont
constrainedToSize:maximumSize
lineBreakMode:self.dateLabel.lineBreakMode];
CGRect dateFrame = CGRectMake(10, 10, 300, dateStringSize.height);
self.dateLabel.frame = dateFrame;
adjustsFontSizeToFitWidth
kemudian gunakan sizeToFit kemudian atur bingkai label ke 0, 0, theWidthYouWant, label.frame.size.height (yang merupakan ketinggian baru ditentukan oleh sizeToFit) MAKA berlakuadjustsFontSizeToFitWidth
Setel teks baru:
Setel
maximum number
baris ke 0 (otomatis):Setel bingkai label ke ukuran maksimum:
Panggilan
sizeToFit
untuk mengurangi ukuran bingkai sehingga isinya pas:Bingkai label sekarang cukup tinggi dan cukup lebar untuk disesuaikan dengan teks Anda. Kiri atas harus tidak berubah. Saya telah menguji ini hanya dengan teks rata kiri atas. Untuk penyejajaran lainnya, Anda mungkin harus memodifikasi frame sesudahnya.
Juga, label saya memiliki pembungkusan kata diaktifkan.
sumber
Mengacu pada solusi ekstensi:
harus diganti oleh
Diperlukan ruang tambahan di setiap baris baru yang ditambahkan, karena
UILabels
pengembalinya trailing iPhone tampaknya diabaikan :(Demikian pula, alignBottom juga harus diperbarui dengan
@" \n@%"
di tempat"\n@%"
(untuk inisialisasi siklus harus diganti dengan "untuk (int i = 0 ..." juga).Ekstensi berikut ini berfungsi untuk saya:
Kemudian panggil
[yourLabel alignTop];
atau[yourLabel alignBottom];
setelah setiap tugas teks Label Anda.sumber
VerticalAlign
antara kurung setelah@implementation UILabel
. Menjadi orang baru di Objective-C saya belum pernah menjalankan sintaks ini sebelumnya. Apa ini namanya?sizeWithFont:constrainedToSize:lineBreakMode:
dan sizeWithFont: keduanya disusutkan di iOS7. Juga, kategori ini hanya berfungsi pada label ketika numberOfLines lebih besar dari 0.Kalau-kalau ada bantuan untuk siapa pun, saya memiliki masalah yang sama tetapi mampu memecahkan masalah hanya dengan beralih dari menggunakan
UILabel
ke menggunakanUITextView
. Saya menghargai ini bukan untuk semua orang karena fungsinya sedikit berbeda.Jika Anda beralih menggunakan
UITextView
, Anda dapat mematikan semua properti Scroll View dan Interaksi Pengguna Diaktifkan ... Ini akan memaksa itu untuk bertindak lebih seperti label.sumber
UITextView
memberi saya hasil yang diinginkan segera.Tanpa muss, tidak repot
Tidak ada muss, tidak ada Objective-c, tidak ada keributan selain Swift 3:
Cepat 4.2
sumber
Seperti jawaban di atas, tetapi itu tidak benar, atau mudah untuk menampar ke dalam kode jadi saya membersihkannya sedikit. Tambahkan ekstensi ini ke file .h dan .m atau tempelkan tepat di atas implementasi yang ingin Anda gunakan:
Dan kemudian untuk menggunakan, masukkan teks Anda ke label, dan kemudian panggil metode yang sesuai untuk menyelaraskannya:
atau
sumber
Cara yang bahkan lebih cepat (dan lebih kotor) untuk melakukannya adalah dengan mengatur mode jeda baris UILabel ke "Klip" dan menambahkan sejumlah baris baru.
Solusi ini tidak akan bekerja untuk semua orang - khususnya, jika Anda masih ingin menunjukkan "..." di akhir string Anda jika melebihi jumlah baris yang Anda tampilkan, Anda harus menggunakan salah satu dari bit kode yang lebih panjang - tetapi untuk banyak kasus ini akan memberi Anda apa yang Anda butuhkan.
sumber
UILineBreakModeWordWrap
sebagai gantinya.Pendekatan termudah menggunakan Storyboard:
Sematkan Label di StackView dan atur dua atribut berikut dari StackView di Attribute Inspector:
1
Axis
sampaiHorizontal
,2-
Alignment
keTop
sumber
UILabel
ke dalam beberapaUIView
subclass (dataranUIView
biasanya cukup) dan biarkan label itu tumbuh ke bawah arah. Terima kasih!UILabel
dan biarkan StackView melakukan tugasnya. Terima kasih!Alih-alih
UILabel
Anda dapat menggunakanUITextField
yang memiliki opsi perataan vertikal:sumber
Saya sudah berjuang dengan yang ini untuk waktu yang lama dan saya ingin berbagi solusi.
Ini akan memberi Anda
UILabel
yang akan menyusutkan teks secara otomatis ke 0,5 skala dan memusatkan teks secara vertikal. Opsi ini juga tersedia di Storyboard / IB.sumber
Buat kelas baru
LabelTopAlign
file .h
file .m
Edit
Berikut ini adalah implementasi sederhana yang melakukan hal yang sama:
sumber
sizeToFit
solusi ini sebenarnya membuat teksUILabel
menempatkan apa pun di atas, bahkan jika Anda secara dinamis mengganti teks yang lebih pendek dengan yang lebih lama atau sebaliknya.Di Interface Builder
UILabel
ke ukuran Teks sebesar mungkinLines
ke '0' di Atribut InspekturDalam kode Anda
sizeToFit
label AndaCuplikan Kode:
sumber
Untuk UI Adaptif (iOS8 atau setelahnya), Penyelarasan Vertikal UILabel harus diatur dari StoryBoard dengan Mengubah properti
noOfLines
= 0` danDiedit:
dan kendala-kendala berikut cukup untuk mencapai hasil yang diinginkan.
sumber
Buat subkelas UILabel. Bekerja seperti pesona:
Seperti yang dibahas di sini .
sumber
Saya menulis fungsi util untuk mencapai tujuan ini. Anda dapat melihatnya:
.Cara Penggunaan? (Jika lblHello dibuat oleh pembangun Antarmuka, maka saya lewati beberapa detail atribut UILabel)
Saya juga menulisnya di blog saya sebagai artikel: http://fstoke.me/blog/?p=2819
sumber
Saya perlu beberapa saat untuk membaca kode, serta kode di halaman yang diperkenalkan, dan menemukan bahwa mereka semua mencoba untuk mengubah ukuran bingkai label, sehingga perataan vertikal pusat default tidak akan muncul.
Namun, dalam beberapa kasus kami ingin label untuk menempati semua ruang itu, bahkan jika label memiliki begitu banyak teks (misalnya beberapa baris dengan tinggi yang sama).
Di sini, saya menggunakan cara alternatif untuk menyelesaikannya, cukup dengan menempelkan baris baru ke akhir label (harap dicatat bahwa saya benar-benar mewarisi
UILabel
, tetapi tidak perlu):sumber
Apa yang saya lakukan di aplikasi saya adalah untuk mengatur properti garis UILabel ke 0 serta untuk membuat batasan bawah dari UILabel dan pastikan sedang diatur ke> = 0 seperti yang ditunjukkan pada gambar di bawah ini.
sumber
Saya mengambil saran di sini dan membuat tampilan yang dapat membungkus sebuah UILabel dan akan mengukurnya dan mengatur jumlah baris sehingga bagian atas selaras. Sederhananya UILabel sebagai subview:
sumber
Anda dapat menggunakan TTTAttributedLabel , ini mendukung perataan vertikal.
sumber
Saya telah menemukan jawaban atas pertanyaan ini sekarang agak ketinggalan zaman, jadi menambahkan ini untuk penggemar tata letak otomatis di luar sana.
Tata letak otomatis membuat masalah ini cukup sepele. Dengan asumsi kami menambahkan label
UIView *view
, kode berikut akan menyelesaikan ini:Tinggi label akan dihitung secara otomatis (menggunakannya
intrinsicContentSize
) dan label akan diposisikan ujung ke ujung secara horizontal, di bagian atasview
.sumber
Saya telah menggunakan banyak metode di atas, dan hanya ingin menambahkan pendekatan cepat dan kotor yang saya gunakan:
Pastikan jumlah baris baru dalam string akan menyebabkan teks apa pun mengisi ruang vertikal yang tersedia, dan mengatur label UIL untuk memotong teks yang meluap.
Karena kadang-kadang cukup baik cukup baik .
sumber
UITextView
itu dapat dipanggildlopen
untuk mendukung input teks. Ini dapat menyebabkan kelambatan utama pada utas UI, sehingga pendekatan ini jauh lebih hebat!Saya ingin memiliki label yang dapat memiliki multi-baris, ukuran font minimum, dan terpusat secara horizontal dan vertikal dalam tampilan induknya. Saya menambahkan label saya ke tampilan saya secara terprogram:
Dan kemudian ketika saya ingin mengubah teks label saya ...
Semoga itu bisa membantu seseorang!
sumber
FXLabel (on github) melakukan ini di luar kotak dengan mengatur
label.contentMode
keUIViewContentModeTop
. Komponen ini tidak dibuat oleh saya, tetapi merupakan komponen yang sering saya gunakan dan memiliki banyak fitur, dan tampaknya berfungsi dengan baik.sumber
bagi siapa pun yang membaca ini karena teks di dalam label Anda tidak terpusat secara vertikal, perlu diingat bahwa beberapa jenis font tidak dirancang sama. misalnya, jika Anda membuat label dengan ukuran zapfino 16, Anda akan melihat teksnya tidak terpusat sempurna secara vertikal.
namun, bekerja dengan helvetica akan memusatkan teks Anda secara vertikal.
sumber
Gunakan
textRect(forBounds:limitedToNumberOfLines:)
.sumber
Subkelas UILabel dan batasi persegi panjang gambar, seperti ini:
Saya mencoba solusi yang melibatkan pad baris baru dan mengalami perilaku yang salah dalam beberapa kasus. Dalam pengalaman saya, lebih mudah untuk membatasi gambar persegi seperti di atas daripada mengacaukan
numberOfLines
.PS Anda dapat membayangkan dengan mudah mendukung UIViewContentMode dengan cara ini:
sumber
Jika Anda menggunakan pembayaran otomatis, atur konten vertikalHuggingPriority menjadi 1000, baik dalam kode atau IB. Di IB, Anda mungkin harus menghapus batasan ketinggian dengan menetapkan prioritasnya ke 1 dan kemudian menghapusnya.
sumber
Selama Anda tidak melakukan apapun tugas yang kompleks, Anda dapat menggunakan
UITextView
bukanUILabels
.Nonaktifkan gulir.
Jika Anda ingin teks ditampilkan sepenuhnya hanya pengguna
sizeToFit
dansizeThatFits:
metodesumber
Dengan cepat,
let myLabel : UILabel!
Untuk membuat teks dari Label Anda agar sesuai dengan layar dan itu di atas
myLabel.sizeToFit()
Untuk membuat font label Anda agar sesuai dengan lebar layar atau ukuran lebar tertentu.
myLabel.adjustsFontSizeToFitWidth = YES
dan beberapa Penjajaran teks untuk label:
myLabel.textAlignment = .center
myLabel.textAlignment = .left
myLabel.textAlignment = .right
myLabel.textAlignment = .Natural
myLabel.textAlignment = .Justified
sumber
[myLabel sizeToFit]
. Terima kasih!Ini adalah solusi lama, gunakan autolayout di iOS> = 6
Solusi saya:
sumber