Lebar Tata Letak Max Pilihan Otomatis tidak tersedia pada versi iOS sebelum 8.0

322

Saya membuka proyek iOS yang ada dengan Xcode6 beta6, dan Xcode mencantumkan peringatan berikut untuk file Storyboard dan Xib:

Lebar Tata Letak Max Pilihan Otomatis tidak tersedia pada versi iOS sebelum 8.0

Saya mencoba mengatasi peringatan dengan menetapkan lebar sebagai eksplisit seperti di bawah ini:

Namun ini tidak menyelesaikan peringatan. Bagaimana mereka bisa dihilangkan?

mono
sumber
3
Saya menggunakan XCode 6.1 dan memperbarui semua label saya ke Preferred Width = Eksplisit. Ini memecahkan masalah bagi saya.
djburdick

Jawaban:

373

Pembaruan 3:
Peringatan ini juga dapat dipicu oleh label yang telah numberOfLinesmenetapkan apa pun kecuali 1 jika target penempatan Anda diatur ke 7.1. Ini sepenuhnya dapat direproduksi dengan proyek tampilan tunggal baru.

Langkah-langkah untuk Mereproduksi:

  1. Buat proyek single-view, objektif-c baru
  2. Tetapkan Target Penerapan menjadi 7.1
  3. Buka storyboard proyek
  4. Letakkan label pada pengontrol tampilan yang disediakan
  5. Setel numberOfLines untuk label tersebut menjadi 2.
  6. Menyusun

Saya telah mengajukan radar berikut:
rdar: // masalah / 18700567

Pembaruan 2:
Sayangnya, ini adalah hal yang lagi dalam versi rilis Xcode 6. Perhatikan bahwa Anda dapat, sebagian besar, secara manual mengedit storyboard / xib Anda untuk memperbaiki masalah. Per Charles A. dalam komentar di bawah:

Perlu disebutkan bahwa Anda dapat dengan mudah secara tidak sengaja memperkenalkan peringatan ini, dan peringatan itu sendiri tidak membantu dalam menemukan label yang menjadi pelakunya. Ini disayangkan di storyboard yang kompleks. Anda dapat membuka storyboard sebagai file sumber dan mencari dengan regex <label(?!.*preferredMaxLayoutWidth)untuk menemukan label yang menghilangkan atribut / nilai yang lebih disukaiMaxLayoutWidth. Jika Anda menambahkan preferMaxLayoutWidth = "0" pada baris tersebut, itu sama dengan menandai secara eksplisit dan mengatur nilai 0.

Pembaruan 1:
Bug ini sekarang telah diperbaiki di Xcode 6 GM.

Jawaban Asli
Ini adalah bug di Xcode6-Beta6 dan XCode6-Beta7 dan dapat diabaikan dengan aman untuk saat ini.

Seorang insinyur Apple di forum Pengembang Apple harus ini mengatakan tentang bug:

Lebar tata letak maks yang diutamakan adalah properti tata letak otomatis pada UILabel yang memungkinkannya tumbuh secara vertikal secara vertikal agar sesuai dengan kontennya. Versi Xcode sebelum 6.0 akan mengatur preferMaxLayoutWidth untuk label multiline ke ukuran batas saat ini pada waktu desain. Anda perlu memperbaruiMaxLayoutWidth yang dipilih secara manual saat runtime jika tata letak horizontal Anda berubah.

iOS 8 menambahkan dukungan untuk penghitungan secara otomatisMaxLayoutWidth yang disukai saat runtime, yang membuat pembuatan label multiline menjadi lebih mudah. Pengaturan ini tidak kompatibel dengan iOS 7. Untuk mendukung iOS 7 dan iOS 8, Xcode 6 memungkinkan Anda untuk memilih "Otomatis" atau "Eksplisit" untuk memilih MaxPayoutWidth di inspektur ukuran. Anda harus:

Pilih "Otomatis" jika menargetkan iOS 8 untuk pengalaman terbaik. Pilih "Eksplisit" jika menargetkan <iOS 8. Anda kemudian dapat memasukkan nilai preferMaxLayoutWidth yang ingin Anda atur. Mengaktifkan "Eksplisit" secara default ke ukuran batas saat ini pada saat Anda menandai kotak.

Peringatan akan muncul jika (1) Anda menggunakan tata letak otomatis, (2) "Otomatis" diatur untuk label multiline [Anda dapat memeriksanya di pemeriksa ukuran untuk label], dan (3) target penyebaran Anda <iOS 8.

Kelihatannya masalahnya adalah peringatan ini muncul untuk dokumen non-autolayout. Jika Anda melihat peringatan ini dan tidak menggunakan tata letak otomatis, Anda dapat mengabaikan peringatan itu.

Sebagai alternatif, Anda dapat mengatasi masalah ini dengan menggunakan inspektur file di storyboard atau xib dalam pertanyaan dan mengubah "Builds for" menjadi "Builds for iOS 8.0 dan kemudian" Inspektur file Xcode

memmons
sumber
15
Perlu disebutkan bahwa Anda dapat dengan mudah secara tidak sengaja memperkenalkan peringatan ini, dan peringatan itu sendiri tidak membantu dalam menemukan label yang menjadi pelakunya. Ini disayangkan di storyboard yang kompleks. Anda dapat membuka storyboard sebagai file sumber dan mencari dengan regex <label(?!.*preferredMaxLayoutWidth)untuk menemukan label yang menghilangkan preferredMaxLayoutWidthatribut / nilai. Jika Anda menambahkan preferredMaxLayoutWidth="0"garis-garis tersebut, itu sama dengan menandai secara eksplisit dan mengatur nilainya 0.
Charles A.
6
Apakah ada cara secara sistematis untuk mengkonfigurasi UILabel untuk secara otomatis menyesuaikan preferMaxLayoutWidth, tanpa benar-benar mensubklasifikasikan atau mengimplementasikannya di suatu tempat di layoutSubviews? Jika ini adalah perilaku yang dapat diaktifkan oleh IB, itu menunjukkan ada nilai properti atau sihir yang dapat ditetapkan. Tetapi tidak ada dalam dokumen atau header API yang mengatakan itu.
alga
2
@CharlesA. Saya telah menguji dengan proyek kosong dan menemukan atribut label lain yang akan memicu peringatan ini: jika numberOfLinesdiatur ke apa pun kecuali 1, peringatan akan terjadi terlepas dari apakah Anda telah preferredMaxLayoutWidthmenyetel atau tidak.
memmons
2
@ MichaelG.Emmons Aneh, saya tidak dapat mereproduksi ini dengan proyek bersih dan target penyebaran yang ditetapkan ke 7.1. Setelah saya mengatur preferredMaxLayoutWidthke 0 eksplisit, peringatan itu hilang terlepas dari numberOfLinesnilainya. Tapi mungkin ini sudah diperbaiki di pembaruan Xcode pagi ini?
Charles A.
2
Jadi ... adalah satu-satunya solusi untuk mengatur jumlah baris menjadi 1 dan mengubahnya dari kode? ini sepertinya tidak profesional
jomafer
315

Untuk menemukan label masalah di papan cerita besar, ikuti langkah-langkah saya di bawah ini.

  1. Dalam Issue Navigator xCode klik kanan pada kesalahan dan pilih "Reveal In Log". (Catatan: @Sam menyarankan di bawah ini, lihat di navigator laporan xCode . Juga @Rivera mencatat dalam komentar bahwa "Pada Xcode 6.1.1, mengklik peringatan akan secara otomatis membuka dan menyorot label yang bertentangan". Saya belum menguji ini ).

masukkan deskripsi gambar di sini

  1. Ini akan menampilkan kesalahan dengan kode di akhir file storyboard Anda. Salin nilai setelah .storyboard

masukkan deskripsi gambar di sini

  1. Selanjutnya, ungkapkan storyboard Anda sebagai file sumber. masukkan deskripsi gambar di sini

  2. Cari. Anda harus dapat mengetahui label apa itu dari sini dengan cukup mudah dengan melihat kontennya. masukkan deskripsi gambar di sini

Setelah Anda menemukan label solusi yang bekerja untuk saya adalah mengatur "lebar yang disukai" menjadi 0.

masukkan deskripsi gambar di sini

BTW, Anda selalu dapat dengan cepat mendapatkan id item antarmuka dengan memilih item dan melihat di bawah inspektur pengidentifikasi. Sangat berguna.

masukkan deskripsi gambar di sini

smileBot
sumber
36
Ini harus menjadi jawaban yang diterima! Ini sebenarnya memecahkan masalah. Bahkan membantu menemukan masalah lain di Storyboard yang tidak muncul secara normal. Satu hal: Saya menemukan bahwa Navigator Laporan jauh lebih dapat diandalkan daripada mengklik kanan pada "Reveal in Log"
Sam Spencer
1
Suka jawaban ini, sangat sederhana dan tetap peringatannya. Terima kasih banyak!
Ethan Parker
1
Terima kasih soooo muchhhhhh :)
SR Nayak
2
Mengapa Anda mengatur lebar yang disukai ke nol daripada ke lebar yang ditunjukkan pada pembuat antarmuka?
Biclops
9
Jawaban yang luar biasa! Anda dapat mencari id objek secara langsung dari tampilan IB dari Storyboard. Lakukan saja Ctrl-f. Tidak perlu membukanya sebagai kode sumber dan kemudian harus beralih kembali ke tampilan IB untuk mengubah lebar yang diinginkan.
AndroidDev
36

Anda dapat memperbaiki masalah ini tanpa membuka storyboard sebagai sumber . Peringatan ini dipicu oleh UILabels jika numberOfLines! = 1 dan target penerapan adalah <8.0

BAGAIMANA CARA MENEMUKANNYA?

  1. Pergi ke Issue Navigator (CMD + 8) dan Pilih dibangun terbaru dengan peringatan masukkan deskripsi gambar di sini
  2. Temukan peringatan ( cari " Automatic Layout Max Preferred ") dan tekan tombol Perluas di sebelah kanan
    masukkan deskripsi gambar di sini
  3. Temukan ID Objek dari UILabel masukkan deskripsi gambar di sini
  4. Buka Storyboard dan SEARCH (CMD + f) untuk objek. Ini akan MEMILIH DAN MENYOROT UILabel
  5. Tetapkan Lebar Pilihan = 0 "Eksplisit" seperti yang disarankan orang lain
Tibidabo
sumber
23

Solusinya cukup sederhana

Cukup aktifkan Builds untuk iOS 8 dan Selanjutnya

masukkan deskripsi gambar di sini

Alejandro Luengo
sumber
cukup sederhana dan destruktif. Hanya 85% pengguna iOS yang menggunakan iOS8 + developer.apple.com/support/app-store
aryaxt
6
@aryaxt Saya minta maaf untuk mengatakan Anda salah. Anda dapat menetapkan target penempatan dalam pengaturan proyek ke iOS 7 atau lebih rendah dan mengubah Build for di Dokumen IB ke iOS 8 dan yang lebih baru dan AKAN bekerja di iOS 7. Harap verifikasi dan hapus downvote. Anda dapat memeriksanya di sini developer.apple.com/library/ios/recipes/…
Alejandro Luengo
1
Seperti biasa, jawaban terbaik bukan yang diterima ... :) Cheers!
HepaKKes
UPDATE untuk iOS9.3 dan lebih tinggi: perangkat iOS7 tidak lagi membuat storyboard dengan pengaturan di atas. Ini digunakan untuk bekerja sebelum pembaruan 9.3. Sepertinya Apple mengubah sesuatu dalam proses otomatis pra-rilis mereka.
pechar
4

Sekarang versi Xcode saya adalah 6.1. Tapi aku juga mendapat peringatan ini. itu sangat mengganggu saya. setelah mencari lagi dan lagi. Saya menemukan solusinya.

Alasan: Anda harus menetapkan Garis UILabel Anda> 1 di Storyboard Anda.

Solusi: atur atribut UILabel Lines Anda menjadi 1 di Storyboard. restart Xcode Anda. Ini bekerja untuk saya, semoga bisa membantu lebih banyak orang.

Jika Anda benar-benar perlu menunjukkan kata-kata Anda lebih dari 1 baris. Anda harus melakukannya dalam kode.

//the words will show in UILabel
NSString *testString = @"Today I wanna set the line to multiple lines. bla bla ......  Today I wanna set the line to multiple lines. bla bla ......"
[self.UserNameLabel setNumberOfLines:0];
self.UserNameLabel.lineBreakMode = NSLineBreakByWordWrapping;
UIFont *font = [UIFont systemFontOfSize:12];
//Here I set the Label max width to 200, height to 60
CGSize size = CGSizeMake(200, 60);
CGRect labelRect = [testString boundingRectWithSize:size options:NSStringDrawingUsesLineFragmentOrigin attributes:[NSDictionary dictionaryWithObject:font forKey:NSFontAttributeName] context:nil];
self.UserNameLabel.frame = CGRectMake(self.UserNameLabel.frame.origin.x, self.UserNameLabel.frame.origin.y, labelRect.size.width, labelRect.size.height);
self.UserNameLabel.text = testString;
ronan
sumber
3
"Jika Anda benar-benar harus menunjukkan kata-kata Anda lebih dari 1 baris. Anda harus melakukannya dalam kode." Ini troll, kan?
webstersx
@webstersx saya pikir dia serius
Jasper
4

Untuk meringkas, bagi saya mengikuti dua instruksi di atas untuk mengubah contoh di mana numberOfLines = 0 ke 1 atau lebih besar, dan secara manual menambahkan preferMaxLayoutWidth = "0" ke setiap instance dari label di dalam sumber storyboard memperbaiki semua peringatan saya.

Lynn S
sumber
Bung kamu adalah WIZZARD! Bekerja bahkan dengan UIScrollerView seperti yang diharapkan. SOLUSI TERBAIK sejauh ini karena saya dapat meninggalkan target penempatan Nib saya di iOS7.0
Yaro
3

Karena saya tidak memiliki 50 reputasi, Stackoverflow tidak akan membiarkan saya mengomentari jawaban terbaik kedua. Menemukan trik lain untuk menemukan label pelakunya di Storyboard.

Jadi, begitu Anda tahu id label, buka storyboard Anda di tab terpisah dengan tampilan pengontrol yang ditampilkan dan lakukan saja perintah F dan perintah V dan akan langsung membawa Anda ke label itu :)

Junaid Ahmed
sumber
Maksud Anda mencari id label dalam proyek.
Borzh
2

Saya membuatnya bekerja dengan memilih tata letak asli saya dalam pemilihan W / H. Storyboard berfungsi seperti yang diharapkan dan kesalahan hilang.

Pastikan juga Anda mengembangkan untuk iOS 8.0. Periksa itu dari pengaturan umum proyek.

Di sinilah Anda harus menekan.

AarneHuttunen
sumber
1

Saya memiliki masalah ini dan dapat memperbaikinya dengan menambahkan batasan untuk menentukan maks dengan label.

Ketika menjatuhkan label multiline di sana tidak ada batasan yang ditetapkan untuk menegakkan lebar di dalam tampilan induk. Di sinilah PreferredMaxWidth baru berperan. Di iOS 7 dan sebelumnya Anda harus menentukan sendiri lebar maks. Saya hanya menambahkan batasan 10px ke sisi kiri dan kanan label.

Anda juga dapat menambahkan batasan <= width yang juga memperbaiki masalah.

Jadi ini sebenarnya bukan bug, Anda hanya perlu menentukan sendiri lebar maks. Opsi eksplisit yang disebutkan dalam jawaban lain juga akan berfungsi saat Anda menetapkan nilai lebar ini namun Anda harus mengubah nilai ini jika Anda ingin lebar maks berubah berdasarkan lebar induk (seperti Anda telah secara eksplisit mengatur lebar).

Solusi saya di atas memastikan lebar selalu dipertahankan tidak peduli seberapa besar pandangan orang tua.

Matthew Cawley
sumber
1

Untuk beberapa alasan, bahkan jika mengubah Target Penempatan iOS ke 8.0 atau lebih tinggi, file Xib tidak mengadopsi perubahan itu dan tetap dengan pengaturan sebelumnya di inspektur File

Pemeriksa file di Xib setelah mengubah target Penerapan iOS

Karena itu, Anda harus mengubahnya secara manual untuk setiap Xib Setelah perubahan manual

Setelah selesai, peringatan akan hilang :-)

Gutty1
sumber