Xcode 6 memiliki fitur baru di mana font dan ukuran font masuk UILabel
, UITextField
dan UIButton
dapat diatur secara otomatis berdasarkan kelas ukuran konfigurasi perangkat saat ini, langsung di storyboard. Misalnya, Anda dapat menyetel UILabel
untuk menggunakan ukuran font 12 pada konfigurasi "lebar apa pun, tinggi ringkas" (seperti pada iPhone dalam lanskap) dan ukuran 18 pada konfigurasi "lebar reguler, tinggi reguler" (seperti di iPad ). Informasi lebih lanjut tersedia di sini:
developer.apple.com/size_class
Ini adalah fitur hebat dalam teori karena dapat membuatnya tidak perlu menyetel font berbeda secara terprogram pada fitur UI berdasarkan konfigurasi perangkat. Saat ini, saya memiliki beberapa kode bersyarat yang menetapkan font berdasarkan jenis perangkat, tetapi jelas, itu berarti saya harus mengatur font secara terprogram di mana saja di seluruh aplikasi. Jadi awalnya saya sangat senang dengan fitur ini, tetapi saya menemukan bahwa fitur ini memiliki masalah parah dalam penggunaan sebenarnya untuk saya (mungkin bug). Perhatikan bahwa saya membangun berdasarkan SDK 8 dan menetapkan target penerapan minimum iOS 8 , jadi ini tidak ada hubungannya dengan kompatibilitas dengan versi lama iOS.
Masalahnya adalah ini: Jika saya menetapkan ukuran font yang berbeda untuk kelas ukuran yang berbeda dan menggunakan font "Sistem" yang disediakan oleh iOS , semuanya berfungsi seperti yang diharapkan, dan ukuran font berubah berdasarkan kelas ukuran. Jika saya menggunakan font khusus yang disediakan oleh aplikasi saya (ya, saya sudah menyiapkannya dengan benar di bundel aplikasi saya, karena berfungsi secara terprogram) dan menyetel font khusus ke label di storyboard XCode 6 , yang juga berfungsi seperti yang diharapkan. Tapi ketika saya mencoba menggunakan ukuran font khusus yang berbeda untuk kelas ukuran yang berbeda, di storyboard, tiba-tiba tidak berfungsi. Satu-satunya perbedaan dalam konfigurasi adalah font yang saya pilih (font kustom vs. font Sistem). Sebaliknya, semua font muncul di fileperangkat dan simulator sebagai font sistem default pada ukuran default , terlepas dari kelas ukurannya (dan saya memverifikasi melalui debugger bahwa itu menggantikan font sistem untuk font sebenarnya yang ditentukan di storyboard). Jadi pada dasarnya, fitur kelas ukuran tampaknya rusak untuk font khusus. Selain itu, yang menarik, font khusus benar-benar menampilkan dan menyesuaikan ukuran dengan benar di panel "Pratinjau" XCode 6 untuk pengontrol tampilan: ia berhenti bekerja hanya saat berjalan pada sistem iOS yang sebenarnya (yang membuat saya berpikir bahwa saya mengonfigurasinya dengan benar) .
Saya mencoba beberapa font kustom yang berbeda, dan sepertinya tidak berhasil untuk salah satu font tersebut, tetapi selalu berfungsi jika saya menggunakan "Sistem".
Bagaimanapun, apakah ada orang lain yang melihat masalah ini di Xcode 6 ?
Ada gagasan tentang apakah ini bug di iOS 8, Xcode, atau sesuatu
Apa yang saya lakukan salah?
Satu-satunya solusi yang saya temukan, seperti yang saya katakan, adalah terus mengatur font secara terprogram seperti yang saya lakukan untuk sekitar tiga versi iOS karena itu berfungsi.
Tetapi saya ingin dapat menggunakan fitur ini jika saya bisa membuatnya berfungsi dengan font khusus. Menggunakan font Sistem tidak dapat diterima untuk desain kami.
INFO TAMBAHAN: Pada Xcode 8.0, bug telah diperbaiki.
sumber
Jawaban:
Perbaikan cepat:
1) Tetapkan font sebagai Sistem untuk kelas ukuran
2) Subclass UILabel dan timpa metode "layoutSubviews" seperti:
Ngomong-ngomong, ini adalah teknik yang sangat nyaman untuk font ikonik
sumber
self.label.font = ...
cara ini Anda dapat menggunakan font yang berbeda di tempat yang berbeda.Setelah mencoba semuanya, saya akhirnya menetapkan kombinasi solusi di atas. Menggunakan Xcode 7.2, Swift 2.
@IBInspectable
memungkinkan Anda mengatur ukuran font di StoryboarddidSet
pengamat, untuk menghindari perangkap darilayoutSubviews()
(loop tak terbatas untuk ketinggian baris tampilan tabel dinamis) danawakeFromNib()
(lihat komentar @ cocoaNoob)@IBDesignable
@IBDesignable
tidak berfungsitraitCollection
menurut artikel tumpukan lainnya iniUIScreen.mainScreen()
bukanself
per artikel tumpukan inisumber
Solusi untuk
UILabel
: pertahankan ukuran font yang sama di semua Kelas Ukuran, tetapi ubah tinggi label Anda sesuai di setiap Kelas Ukuran. Label Anda harus mengaktifkan tautan otomatis. Ini bekerja dengan baik dalam kasus saya.sumber
adjustsFontSizeToFitWidth
tampaknya hanya berfungsi untuk lebar (yang tidak dapat saya gunakan karena teks labelnya dinamis).Bug ini (dan bug terkait Xcode - Size Classes lainnya) membuat saya sangat sedih baru-baru ini karena saya harus melalui file storyboard besar yang meretas semuanya.
Untuk siapa pun yang berada dalam posisi ini, saya ingin menambahkan sesuatu di atas jawaban @ razor28 untuk mengurangi rasa sakit.
Di file header subclass kustom Anda, gunakan
IBInspectable
untuk atribut runtime Anda. Ini akan membuat atribut ini dapat diakses dari "Attributes Inspector", secara visual tepat di atas posisi default untuk pengaturan font.Contoh penggunaan:
Ini akan sangat membantu menghasilkan keluaran ini:
Manfaat tambahannya adalah sekarang kita tidak perlu menambahkan atribut runtime secara manual untuk setiap label. Ini adalah yang paling dekat yang bisa saya dapatkan dengan perilaku yang dimaksudkan XCode. Semoga perbaikan yang tepat sedang dalam perjalanan dengan iOS 9 musim panas ini.
sumber
Solusi serupa dengan @ razor28 tapi saya pikir sedikit lebih universal. Juga, berfungsi dengan baik pada versi iOS yang lebih lama
https://gist.github.com/softmaxsg/8a3ce30331f9f07f023e
sumber
Bug tersebut masih berlaku di XCode 7.0 GM.
Solusi Razor28 menyebabkan loop tak terbatas dalam beberapa kasus. Pengalaman saya telah menggunakannya dalam hubungannya dengan SwipeView .
Sebaliknya, saya menyarankan Anda:
1) Subclass UILabel dan timpa setFont:
2) Setel kelas kustom UILabels Anda dan kemudian setel kelas ukuran font dengan menggunakan font Sistem
sumber
Masalahnya masih ada bahwa Anda tidak dapat menggunakan fitur untuk mengatur Font untuk kelas ukuran yang berbeda dari pembuat antarmuka.
Cukup atur font berdasarkan perangkat yang Anda inginkan seperti di bawah ini:
Ini berfungsi dengan sempurna di semua perangkat.
sumber
Tak satu pun dari ini berhasil untuk saya, tetapi ini berhasil. Anda juga perlu menggunakan font sistem di IB
sumber
Masih belum ada jawaban yang benar. Kode ini berfungsi dengan baik untuk saya. Anda harus menonaktifkan ukuran font untuk kelas ukuran di pembuat antarmuka terlebih dahulu. Di IB Anda dapat menggunakan font khusus.
sumber
Kombinasi dari beberapa jawaban di atas sangat membantu. Inilah cara saya memecahkan bug IB melalui ekstensi UILabel Swift:
sumber
Saya menggunakan Swift, XCode 6.4. Jadi inilah yang saya lakukan
Goto Designer -> Identity Inspector -> Setel kelas ke ExUILabel
Lalu pergi ke Attribute inspector in designer dan atur nama font.
sumber
Saya telah menemukan perbaikan yang lebih cepat (saya berasumsi Anda selalu menggunakan satu font khusus Anda).
Buat kategori untuk UILabel dan sertakan dalam file menggunakan storyboard buggy dengan kelas ukuran dan pengaturan font khusus untuk berbagai kelas:
Cukup gunakan font khusus Anda di storyboard. Ketika juru bahasa buggy akan menggunakan font sistem, bukan milik Anda, kategori ini akan mengubahnya ke font khusus Anda.
sumber
Saya memiliki masalah yang sama dan menemukan satu yang tidak terlalu jelas, tetapi solusi yang bagus!
sumber
sumber