Setelah secara masif melihat ke dalam celaka ini. Kami telah jujur menemukan hal paling sederhana untuk dilakukan adalah hanya membuat kelas baru (sepele), untuk setiap kontrol. Jadi untuk UIButton, buat SJButton. Jangan lupa untuk mengganti initWithFrame dan initWithCode. Untuk setiap kontrol (katakanlah UIButton, dll.) Atur warna atau apa pun yang Anda suka. Ambil dengan hati-hati katakan ukurannya (yaitu ukuran yang akan SET DI STORYBOARD) dalam kode int, dan kemudian (seperti yang Anda inginkan) gunakan ukuran itu (dan atur, katakanlah, font, warna - apa pun). Itu hanya beberapa baris kode, sangat rapi, dan menghemat waktu Anda dalam jangka panjang.
Fattie
@ JoBlow Terima kasih telah memposting temuan Anda - hampir menghabiskan waktu mencari jawaban sendiri
jj.
@ jj- Benar. Jangan lupa kamu pasti HARUS menggunakannya IBDesignablehari ini. Semoga ini bisa membantu. Juga pertimbangkan QA yang menarik ini: stackoverflow.com/a/38000466/294884
Fattie
Jawaban:
158
Tampaknya dimungkinkan di iOS 5 menggunakan proxy UIAppearance.
Itu akan mengatur font menjadi apa pun font khusus Anda untuk semua UILabel di aplikasi Anda. Anda harus mengulanginya untuk setiap kontrol (UIButton, UILabel, dll.).
Ingat Anda harus memasukkan nilai UIAppFonts di info Anda. Daftar dan sertakan nama font yang Anda masukkan.
Terima kasih atas tanggapannya. Saya bisa membuatnya bekerja. Apakah Anda tahu jika ada cara untuk menentukan font tanpa menentukan ukuran font? Saya memiliki label di aplikasi saya yang tidak memiliki ukuran font yang sama.
Brandon
23
Bisakah saya melakukan ini tanpa mengesampingkan ukuran titik setiap instance?
Michael Forrest
17
setFont:metode sudah usang
Anand
12
@ Dan apakah Anda yakin tentang ini? Saya tidak melihatnya ditandai sebagai usang UILabel. Itu sudah usang UIButtontetapi menggunakan font untuk titleLabelproperti sebagai gantinya UILabel, jadi hanya mengatur font dengan proxy penampilan UILabelharus baik-baik saja.
Singkatnya, ini fungsi pertukaran ekstensi standar init(coder:), systemFont(ofSize:), boldSystemFont(ofSize:), italicSystemFont(ofSize:)dengan metode kebiasaan saya.
Perhatikan bahwa itu tidak sepenuhnya diterapkan, tetapi Anda dapat bertukar lebih banyak metode berdasarkan implementasi saya.
importUIKitstructAppFontName{staticlet regular ="CourierNewPSMT"staticlet bold ="CourierNewPS-BoldMT"staticlet italic ="CourierNewPS-ItalicMT"}
extension UIFontDescriptor.AttributeName{staticlet nsctFontUIUsage =UIFontDescriptor.AttributeName(rawValue:"NSCTFontUIUsageAttribute")}
extension UIFont{staticvar isOverrided:Bool=false@objcclass func mySystemFont(ofSize size:CGFloat)->UIFont{returnUIFont(name:AppFontName.regular, size: size)!}@objcclass func myBoldSystemFont(ofSize size:CGFloat)->UIFont{returnUIFont(name:AppFontName.bold, size: size)!}@objcclass func myItalicSystemFont(ofSize size:CGFloat)->UIFont{returnUIFont(name:AppFontName.italic, size: size)!}@objc convenience init(myCoder aDecoder:NSCoder){
guard
let fontDescriptor = aDecoder.decodeObject(forKey:"UIFontDescriptor")as?UIFontDescriptor,let fontAttribute = fontDescriptor.fontAttributes[.nsctFontUIUsage]as?Stringelse{self.init(myCoder: aDecoder)return}var fontName =""switch fontAttribute {case"CTFontRegularUsage":
fontName =AppFontName.regular
case"CTFontEmphasizedUsage","CTFontBoldUsage":
fontName =AppFontName.bold
case"CTFontObliqueUsage":
fontName =AppFontName.italic
default:
fontName =AppFontName.regular
}self.init(name: fontName, size: fontDescriptor.pointSize)!}class func overrideInitialize(){
guard self==UIFont.self,!isOverrided else{return}// Avoid method swizzling run twice and revert to original initialize function
isOverrided =trueiflet systemFontMethod = class_getClassMethod(self,#selector(systemFont(ofSize:))),let mySystemFontMethod = class_getClassMethod(self,#selector(mySystemFont(ofSize:))) {
method_exchangeImplementations(systemFontMethod, mySystemFontMethod)}iflet boldSystemFontMethod = class_getClassMethod(self,#selector(boldSystemFont(ofSize:))),let myBoldSystemFontMethod = class_getClassMethod(self,#selector(myBoldSystemFont(ofSize:))) {
method_exchangeImplementations(boldSystemFontMethod, myBoldSystemFontMethod)}iflet italicSystemFontMethod = class_getClassMethod(self,#selector(italicSystemFont(ofSize:))),let myItalicSystemFontMethod = class_getClassMethod(self,#selector(myItalicSystemFont(ofSize:))) {
method_exchangeImplementations(italicSystemFontMethod, myItalicSystemFontMethod)}iflet initCoderMethod = class_getInstanceMethod(self,#selector(UIFontDescriptor.init(coder:))), // Trick to get over the lack of UIFont.init(coder:))let myInitCoderMethod = class_getInstanceMethod(self,#selector(UIFont.init(myCoder:))) {
method_exchangeImplementations(initCoderMethod, myInitCoderMethod)}}}classAppDelegate:UIResponder,UIApplicationDelegate{// Avoid warning of Swift// Method 'initialize()' defines Objective-C class method 'initialize', which is not guaranteed to be invoked by Swift and will be disallowed in future versionsoverride init(){super.init()UIFont.overrideInitialize()}...}
jawaban Terbaik!! secara otomatis mengganti font sistem, brilian
Kappe
2
Jika seseorang memiliki masalah dengan baris "NSCTFontUIUsageAttribute": if let fontAttribute = fontDescriptor.fontAttributes[.nsctFontUIUsage] as? String {lakukan trik untuk saya.
Pengetahuan
1
tampaknya tidak berfungsi dengan UILabels yang mengatur gaya teks (tebal, judul, judul, dll.) ... hanya berfungsi dengan font yang memiliki ukuran dan set font sistem tertentu. @ nahung89
aviran
1
Ini juga mengganti beberapa font UI sistem. Misalnya, daftar saran keyboard dan lembar tindakan. Tidak tahu apakah ini akan menyebabkan Apple menolak aplikasi
Henry H Miao
1
Sudah setahun sejak jawaban ini diposting. Adakah yang punya cara Apple "asli" untuk mencapai ini?
Greg Hilston
75
Ada juga solusi lain yang akan menggantikan systemFont.
Ini lebih merupakan peretasan. Saya belum menambahkan daftar aplikasi saya dengan peretasan ini, karena tidak menggunakan metode pribadi. Jika Anda menginginkan solusi yang lebih kuat, saya juga menyarankan Anda untuk memeriksa ini: github.com/0xced/FontReplacer
Hugues BR
2
Ini baik Apple hanya tidak ingin Anda menggunakan fungsi tidak berdokumen. Anda diizinkan untuk "memutar" metode yang bersifat publik.
mxcl
4
Ketika suatu kategori memiliki metode dengan tanda tangan yang sama dengan kelas itu memperluas perilaku tidak terdefinisi. Untuk mengganti metode kelas, Anda harus menggunakan metode swizzling (yang juga bukan ide yang baik).
GreatWiz
1
Seperti yang telah ditunjukkan oleh orang lain, solusi ini, walaupun kemungkinan besar akan efektif sebagian besar waktu, secara teknis memperkenalkan potensi perilaku yang tidak terdefinisi. Jika Anda tidak ingin mengambil risiko, metode swizzling mungkin merupakan pilihan yang lebih baik. Jawabannya di sini memberikan solusi yang sama melalui swizzling: stackoverflow.com/questions/19542942/…
Nathan Hosselton
64
Jika Anda menggunakan Swift, Anda dapat membuat ekstensi UILabel:
Catatan: jika Anda menemukan bahwa subtitle tebal tidak berfungsi, mungkin nama font default tidak mengandung "Medium". Ganti string itu untuk pertandingan lain sesuai kebutuhan (terima kasih kepada Mason dalam komentar di bawah).
Satu kelemahan dari ini yang saya temukan adalah ketika saya memulai peringatan dengan UIAlertController, tombol dengan gaya .Cancel sama dengan tombol dengan gaya .Default (setidaknya saat menggunakan GillSans). Sedangkan .Cancel biasanya merupakan font berat reguler, dan .Default akan dicetak tebal. Ada ide?
Mason G. Zhwiti
Maaf, maksud saya label .Cancel biasanya akan tebal, dan Default biasanya akan menjadi berat reguler.
Mason G. Zhwiti
2
@ MasonG.Zhwiti Dalam hal ini, saya mungkin akan mengatur UILabelekstensi untuk mengambil nama font tambahan untuk dicetak tebal. Kemudian di setlakukan pemeriksaan untuk melihat apakah "Bold" ada dalam nama font dan abaikan set di satu kasus, dan gunakan di yang lain. Saya akan mengedit dan menambahkan contoh.
Sandy Chapman
@SandyChapman Terima kasih! Saya mencoba teknik baru ini, dan itu masuk akal, tetapi sepertinya itu tidak berhasil bagi saya. Saya menggunakan GillSans dan GillSans-Bold pada simulator iOS 8.3. Sudahkah Anda menguji teknik ini?
Mason G. Zhwiti
2
@SandyChapman Saya tahu apa yang terjadi. Font default untuk iOS 8 cenderung HelveticaNeueInterface-Regular atau (untuk huruf tebal) HelveticaNeueInterface-MediumP4. Jadi mencari "Bold" tidak pernah cocok dengan apa pun. Saya mengubahnya menjadi rangeOfString("Medium")dan berhasil.
Mason G. Zhwiti
23
Berkembang dari Hugues, BR menjawab tetapi dengan menggunakan metode swizzling, saya tiba pada solusi yang berhasil mengubah semua font menjadi font yang diinginkan di aplikasi saya.
Pendekatan dengan Dynamic Type harus seperti yang Anda cari di iOS 7. Solusi berikut ini tidak menggunakan Dynamic Type.
Catatan:
kode di bawah ini, dalam kondisi yang disajikan, tidak pernah diajukan kepada Apple;
ada versi yang lebih pendek yang melewati pengajuan Apple, yaitu tanpa - initWithCoder:penggantian. Namun itu tidak akan mencakup semua kasus;
kode berikut hadir dalam kelas yang saya gunakan untuk mengatur gaya aplikasi saya yang disertakan oleh kelas AppDelegate saya sehingga tersedia di mana-mana dan untuk semua instance UIFont;
Saya menggunakan Zapfino di sini hanya untuk membuat perubahan lebih terlihat;
setiap perbaikan yang Anda temukan pada kode ini dipersilahkan.
Solusi ini menggunakan dua metode berbeda untuk mencapai hasil akhir. Yang pertama adalah mengganti metode kelas UIFont + systemFontWithSize:dan mirip dengan yang menggunakan alternatif saya (di sini saya menggunakan "Zapfino" untuk tidak meninggalkan keraguan bahwa penggantian berhasil).
Metode lainnya adalah mengganti - initWithCoder:metode pada UIFont untuk menggantikan kemunculan CTFontRegularUsagedan serupa dengan alternatif saya. Metode terakhir ini diperlukan karena saya telah menemukan bahwa UILabelobjek yang dikodekan dalam file NIB tidak memeriksa + systemFontWithSize:metode untuk mendapatkan font sistem mereka dan sebaliknya mengkodekan mereka sebagai UICTFontDescriptorobjek. Saya sudah mencoba menimpa - awakeAfterUsingCoder:tetapi entah bagaimana ia dipanggil untuk setiap objek yang disandikan di storyboard saya dan menyebabkan crash. Mengganti - awakeFromNibtidak akan mengizinkan saya membaca NSCoderobjek.
Bagaimana Anda menggunakan implementasi ini di iOS6 yang tidak memiliki UIFontDescriptor
Utku Yıldırım
Saya telah menggunakan kunci dekoder "UIFontTraits" untuk memeriksa apakah font yang diberikan tebal atau miring dan ganti dengan variasi saya sendiri. Dapatkan dari intisari ini di sini gist.github.com/Daij-Djan/5046612 .
Fábio Oliveira
Terima kasih atas jawaban saya menggunakan solusi lain untuk saat ini. Saya akan memeriksanya ketika saya membutuhkannya lagi :)
Utku Yıldırım
2
terima kasih @ FábioOliveira, ini bekerja seperti pesona! Hanya satu hal lagi yang perlu Anda letakkan #import <objc / runtime.h> di header, jika tidak, Anda akan mendapatkan kesalahan dengan menggunakan kelas 'Metode' (kesalahan yang saya dapatkan di
XCode
Untuk beberapa alasan, di iOS 8, modals ( UIAlertController) tidak mengubah font.
Randomblue
13
Untuk melengkapi jawaban Sandy Chapman , berikut adalah solusi di Objective-C (letakkan kategori ini di mana saja yang ingin Anda ubah UILabelAppearance):
Hai, maksud Anda "di mana saja", kode itu harus ditambahkan di setiap view controller, dan apakah setiap UILabel digunakan di controller, di mana Anda ingin mengubah font?
Jules
Tidak, Anda harus meletakkan kode ini sekali , di mana saja dalam proyek Anda; di delegasi app Anda misalnya.
Damien Debin
1
@ DamenDebin Saya ingin menggunakan huruf tebal untuk huruf tebal tetapi ini berubah menjadi tebal. Ada jalan lain?
Lol. Saya tidak tahu bahwa Swift mengizinkan menggunakan ini. Btw, saya akan memperbarui ke jawaban di atas. @Ucotta terima kasih!
nahung89
4
Untuk Swift 5
Semua jawaban di atas sudah benar tetapi saya telah melakukan dengan sedikit cara berbeda yang sesuai dengan ukuran perangkat . Di sini, di kelas ATFontManager, saya telah membuat ukuran font default yang didefinisikan di bagian atas kelas sebagai defaultFontSize , ini adalah ukuran font
iphone plus dan Anda dapat mengubah sesuai dengan kebutuhan Anda.
Kelas ini mengacu pada detektor perangkat untuk memberikan ukuran font yang sesuai menurut perangkat.
classATDeviceDetector{var iPhone:Bool{returnUIDevice().userInterfaceIdiom ==.phone
}var ipad :Bool{returnUIDevice().userInterfaceIdiom ==.pad
}let isRetina =UIScreen.main.scale >=2.0enumScreenType:String{case iPhone4
case iPhone5
case iPhone6AndIphone7
case iPhone6PAndIPhone7P
case iPhoneX
case iPadMini
case iPadPro
case iPadPro10Inch
case iPhoneOrIPadSmallSizeUnknown
case iPadUnknown
case unknown
}structScreenSize{staticlet SCREEN_WIDTH =UIScreen.main.bounds.size.width
staticlet SCREEN_HEIGHT =UIScreen.main.bounds.size.height
staticlet SCREEN_MAX_LENGTH = max(ScreenSize.SCREEN_WIDTH,ScreenSize.SCREEN_HEIGHT)staticlet SCREEN_MIN_LENGTH = min(ScreenSize.SCREEN_WIDTH,ScreenSize.SCREEN_HEIGHT)}var screenType:ScreenType{switchScreenSize.SCREEN_MAX_LENGTH {case0..<568.0:return.iPhone4
case568.0:return.iPhone5
case667.0:return.iPhone6AndIphone7
case736.0:return.iPhone6PAndIPhone7P
case812.0:return.iPhoneX
case568.0..<812.0:return.iPhoneOrIPadSmallSizeUnknown
case1112.0:return.iPadPro10Inch
case1024.0:return.iPadMini
case1366.0:return.iPadPro
case812.0..<1366.0:return.iPadUnknown
default:return.unknown
}}}
Cara Penggunaan. Semoga ini bisa membantu.
//for default
label.font =ATFontManager.setFont()//if you want to provide as your demand. Here **iPhone7PlusFontSize** variable is denoted as font size for *iphone 7plus and iphone 6 plus*, and it **ATFontManager** class automatically handle.
label.font =ATFontManager.setFont(iPhone7PlusFontSize:15, andFontName:FontName.HelveticaNeue.rawValue)
Tak satu pun dari solusi ini bekerja secara universal di seluruh aplikasi. Satu hal yang saya temukan untuk membantu mengelola font di Xcode adalah membuka Storyboard sebagai kode Sumber (Control-klik storyboard di File navigator> "Open as"> "Source"), dan kemudian melakukan pencarian-dan-ganti.
Jenis font selalu diatur dalam kode dan nib / storyboard.
Untuk kodenya, seperti kata Hugues BR , melakukannya dalam kategori dapat memecahkan masalah.
Untuk nib / storyboard, kita dapat Method Swizzling awakeFromNib untuk mengubah jenis font karena elemen UI dari nib / storyboard selalu memanggilnya sebelum ditampilkan di layar.
Saya kira Anda tahu Aspek . Ini adalah perpustakaan untuk pemrograman AOP, berdasarkan Metode Swizzling. Kami membuat kategori untuk UILabel, UIButton, UITextView untuk mengimplementasikannya.
@sheshnath dapatkah Anda memberi kami lebih banyak info kerusakan?
Javier Amor Penas
1
maaf kesalahan adalah dari sisi saya, font tidak terdaftar di info.plist
shesh nath
@ midhunp Bisakah Anda lebih eksplisit sehingga tidak bekerja untuk Anda? Ini bekerja dengan baik untuk saya dengan huruf tebal.
Javier Amor Penas
2
Mungkin tidak, Anda mungkin akan memiliki sendiri pengaturan font pada kontrol Anda, tetapi Anda dapat membuat proses lebih mudah dengan memusatkan dari mana Anda mendapatkan jenis font dari, misalnya memiliki delegasi aplikasi atau beberapa kelas umum lainnya memiliki metode yang mengembalikan font, dan apa pun yang perlu mengatur font dapat memanggil metode itu, yang akan membantu jika Anda perlu mengubah font Anda, Anda akan mengubahnya di satu tempat daripada di mana-mana Anda mengatur font ... Alternatif lain dapat membuat subclass dari Elemen UI Anda yang secara otomatis akan mengatur font, tapi itu mungkin berlebihan ..
sebagai catatan, inilah yang saya lakukan, tetapi @Randall membutuhkan perwakilan, dan memberikan jawaban yang baik. Saya hanya perlu mendukung kurang dari 5,0
Sam Jarman
4
Saya tidak setuju dengan apa yang Anda lakukan. Jawaban yang Anda pilih tidak valid ketika pertanyaan Anda ditandai iphone-sdk-4.0.
Paulo Casaretto
@ Sam Jarman, jawaban Randall di bawah ini benar - dapatkah Anda menandainya seperti itu untuk pengunjung masa depan?
Bill
1
NUI adalah alternatif untuk proxy UIAppearance. Ini memberi Anda kontrol atas font (dan banyak atribut lainnya) dari sejumlah besar jenis elemen UI di seluruh aplikasi Anda dengan hanya memodifikasi lembar gaya, yang dapat digunakan kembali di beberapa aplikasi.
Setelah menambahkan NUILabelkelas ke label Anda, Anda dapat dengan mudah mengontrol font mereka di style sheet:
LabelFontNameStringHelvetica
Jika Anda memiliki label dengan ukuran font yang berbeda, Anda bisa mengontrol ukurannya menggunakan label NUI, LargeLabel, dan SmallLabel, atau bahkan dengan cepat membuat kelas Anda sendiri.
atur font untuk seluruh aplikasi dan Tambahkan UIAppFontskunci 'pada Info.plist, path harus jalur di mana file font Anda .ttf terletak. Bagi saya itu ada di dalam folder' font 'dalam proyek saya.
Catatan: Font dan warna yang dideklarasikan di Parent VC diimplementasikan di CustomFontLabel. Keuntungannya adalah kita dapat mengubah properti uilabel / sembarang tampilan secara bersamaan dalam beberapa perubahan sederhana di Parent VC.
2) 'untuk' pengulangan UIView untuk sub tampilan. Ini hanya berfungsi pada VC tertentu.
IBDesignable
hari ini. Semoga ini bisa membantu. Juga pertimbangkan QA yang menarik ini: stackoverflow.com/a/38000466/294884Jawaban:
Tampaknya dimungkinkan di iOS 5 menggunakan proxy UIAppearance.
Itu akan mengatur font menjadi apa pun font khusus Anda untuk semua UILabel di aplikasi Anda. Anda harus mengulanginya untuk setiap kontrol (UIButton, UILabel, dll.).
Ingat Anda harus memasukkan nilai UIAppFonts di info Anda. Daftar dan sertakan nama font yang Anda masukkan.
sumber
setFont:
metode sudah usangUILabel
. Itu sudah usangUIButton
tetapi menggunakan font untuktitleLabel
properti sebagai gantinyaUILabel
, jadi hanya mengatur font dengan proxy penampilanUILabel
harus baik-baik saja.Cepat 5
Berdasarkan jawaban Fábio Oliveira ( https://stackoverflow.com/a/23042694/2082851 ), saya membuat swift saya sendiri 4.
Singkatnya, ini fungsi pertukaran ekstensi standar
init(coder:)
,systemFont(ofSize:)
,boldSystemFont(ofSize:)
,italicSystemFont(ofSize:)
dengan metode kebiasaan saya.Perhatikan bahwa itu tidak sepenuhnya diterapkan, tetapi Anda dapat bertukar lebih banyak metode berdasarkan implementasi saya.
sumber
if let fontAttribute = fontDescriptor.fontAttributes[.nsctFontUIUsage] as? String {
lakukan trik untuk saya.UILabel
s yang mengatur gaya teks (tebal, judul, judul, dll.) ... hanya berfungsi dengan font yang memiliki ukuran dan set font sistem tertentu. @ nahung89Ada juga solusi lain yang akan menggantikan systemFont.
Cukup buat kategori
UIFont + SystemFontOverride.h
UIFont + SystemFontOverride.m
Ini akan menggantikan implementasi default dan sebagian besar UIControls menggunakan systemFont.
sumber
Jika Anda menggunakan Swift, Anda dapat membuat ekstensi UILabel:
Dan kemudian di mana Anda melakukan proksi penampilan Anda:
Ada kode Objective-C setara menggunakan
UI_APPEARANCE_SELECTOR
pada properti dengan namasubstituteFontName
.Tambahan
Untuk kasus di mana Anda ingin mengatur font tebal dan reguler secara terpisah:
Kemudian untuk proksi penampilan UIA Anda:
Catatan: jika Anda menemukan bahwa subtitle tebal tidak berfungsi, mungkin nama font default tidak mengandung "Medium". Ganti string itu untuk pertandingan lain sesuai kebutuhan (terima kasih kepada Mason dalam komentar di bawah).
sumber
UILabel
ekstensi untuk mengambil nama font tambahan untuk dicetak tebal. Kemudian diset
lakukan pemeriksaan untuk melihat apakah "Bold" ada dalam nama font dan abaikan set di satu kasus, dan gunakan di yang lain. Saya akan mengedit dan menambahkan contoh.rangeOfString("Medium")
dan berhasil.Berkembang dari Hugues, BR menjawab tetapi dengan menggunakan metode swizzling, saya tiba pada solusi yang berhasil mengubah semua font menjadi font yang diinginkan di aplikasi saya.
Pendekatan dengan Dynamic Type harus seperti yang Anda cari di iOS 7. Solusi berikut ini tidak menggunakan Dynamic Type.
Catatan:
- initWithCoder:
penggantian. Namun itu tidak akan mencakup semua kasus;Solusi ini menggunakan dua metode berbeda untuk mencapai hasil akhir. Yang pertama adalah mengganti metode kelas UIFont
+ systemFontWithSize:
dan mirip dengan yang menggunakan alternatif saya (di sini saya menggunakan "Zapfino" untuk tidak meninggalkan keraguan bahwa penggantian berhasil).Metode lainnya adalah mengganti
- initWithCoder:
metode pada UIFont untuk menggantikan kemunculanCTFontRegularUsage
dan serupa dengan alternatif saya. Metode terakhir ini diperlukan karena saya telah menemukan bahwaUILabel
objek yang dikodekan dalam file NIB tidak memeriksa+ systemFontWithSize:
metode untuk mendapatkan font sistem mereka dan sebaliknya mengkodekan mereka sebagaiUICTFontDescriptor
objek. Saya sudah mencoba menimpa- awakeAfterUsingCoder:
tetapi entah bagaimana ia dipanggil untuk setiap objek yang disandikan di storyboard saya dan menyebabkan crash. Mengganti- awakeFromNib
tidak akan mengizinkan saya membacaNSCoder
objek.sumber
UIAlertController
) tidak mengubah font.Untuk melengkapi jawaban Sandy Chapman , berikut adalah solusi di Objective-C (letakkan kategori ini di mana saja yang ingin Anda ubah
UILabel
Appearance
):File antarmuka, harusnya menyatakan metode ini secara publik untuk digunakan nanti dari tempat-tempat seperti delegasi aplikasi Anda:
Kemudian, Anda dapat mengubah
Appearance
dengan:sumber
KOMENTAR UNTUK SWIFT 3.0 DAN SWIFT WARNING
Anda dapat menghapus pesan peringatan di baris:
Dengan menggantinya dengan:
sumber
Untuk Swift 5
Semua jawaban di atas sudah benar tetapi saya telah melakukan dengan sedikit cara berbeda yang sesuai dengan ukuran perangkat . Di sini, di kelas ATFontManager, saya telah membuat ukuran font default yang didefinisikan di bagian atas kelas sebagai defaultFontSize , ini adalah ukuran font iphone plus dan Anda dapat mengubah sesuai dengan kebutuhan Anda.
Saya telah menambahkan nama font tertentu, untuk lebih Anda bisa menambahkan nama font dan ketik di sini.
Kelas ini mengacu pada detektor perangkat untuk memberikan ukuran font yang sesuai menurut perangkat.
Cara Penggunaan. Semoga ini bisa membantu.
sumber
Tak satu pun dari solusi ini bekerja secara universal di seluruh aplikasi. Satu hal yang saya temukan untuk membantu mengelola font di Xcode adalah membuka Storyboard sebagai kode Sumber (Control-klik storyboard di File navigator> "Open as"> "Source"), dan kemudian melakukan pencarian-dan-ganti.
sumber
Jenis font selalu diatur dalam kode dan nib / storyboard.
Untuk kodenya, seperti kata Hugues BR , melakukannya dalam kategori dapat memecahkan masalah.
Untuk nib / storyboard, kita dapat Method Swizzling awakeFromNib untuk mengubah jenis font karena elemen UI dari nib / storyboard selalu memanggilnya sebelum ditampilkan di layar.
Saya kira Anda tahu Aspek . Ini adalah perpustakaan untuk pemrograman AOP, berdasarkan Metode Swizzling. Kami membuat kategori untuk UILabel, UIButton, UITextView untuk mengimplementasikannya.
UILabel:
UIButton:
UITextField:
UITextView:
Itu saja, Anda bisa mengubah HelveticaNeue-light menjadi makro dengan nama font Anda.
sumber
Saya membuat konversi tipografi saya sendiri untuk Swift 4 setelah meninjau beberapa posting, mencakup sebagian besar kasus, seperti:
1st Tambahkan font ke proyek estructure dan ke file .plist (dengan nama yang sama):
Kemudian
Akhirnya panggil ke metode yang dibuat di
Appdelegate
seperti berikut:sumber
Mungkin tidak, Anda mungkin akan memiliki sendiri pengaturan font pada kontrol Anda, tetapi Anda dapat membuat proses lebih mudah dengan memusatkan dari mana Anda mendapatkan jenis font dari, misalnya memiliki delegasi aplikasi atau beberapa kelas umum lainnya memiliki metode yang mengembalikan font, dan apa pun yang perlu mengatur font dapat memanggil metode itu, yang akan membantu jika Anda perlu mengubah font Anda, Anda akan mengubahnya di satu tempat daripada di mana-mana Anda mengatur font ... Alternatif lain dapat membuat subclass dari Elemen UI Anda yang secara otomatis akan mengatur font, tapi itu mungkin berlebihan ..
sumber
NUI adalah alternatif untuk proxy UIAppearance. Ini memberi Anda kontrol atas font (dan banyak atribut lainnya) dari sejumlah besar jenis elemen UI di seluruh aplikasi Anda dengan hanya memodifikasi lembar gaya, yang dapat digunakan kembali di beberapa aplikasi.
Setelah menambahkan
NUILabel
kelas ke label Anda, Anda dapat dengan mudah mengontrol font mereka di style sheet:Jika Anda memiliki label dengan ukuran font yang berbeda, Anda bisa mengontrol ukurannya menggunakan label NUI, LargeLabel, dan SmallLabel, atau bahkan dengan cepat membuat kelas Anda sendiri.
sumber
Saya menggunakan jenis kelas font seperti ini di swift. Menggunakan kelas ekstensi font.
sumber
Untuk Xamarin.iOS di dalam
FinishedLaunching()
kode put AppDelegate seperti ini: -atur font untuk seluruh aplikasi dan Tambahkan
UIAppFonts
kunci 'pada Info.plist, path harus jalur di mana file font Anda .ttf terletak. Bagi saya itu ada di dalam folder' font 'dalam proyek saya.sumber
Seperti @Randall menyebutkan
UIApperance
proxy iOS 5.0+ dapat digunakan untuk menyesuaikan tampilan semua instance kelas, baca lebih lanjut .Xcodes auto complete tidak menampilkan semua properti yang tersedia dan mungkin membuat kesalahan, tetapi Anda bisa mengetiknya dan akan dikompilasi.
sumber
Kami telah mencapai hal yang sama di Swift -Xcode 7.2 menggunakan Parent View Controller dan Child view controller (Inheritance).
File - Baru - kelas Cocoa Touch - ParentViewController.
Buat pengontrol tampilan anak dan kaitkan dengan StoryBoard VC, tambahkan textLabel.
ATAU Buat kelas UILabel khusus (Metode sub-klasifikasi) dan kaitkan label yang diperlukan untuk itu.
Catatan: Font dan warna yang dideklarasikan di Parent VC diimplementasikan di CustomFontLabel. Keuntungannya adalah kita dapat mengubah properti uilabel / sembarang tampilan secara bersamaan dalam beberapa perubahan sederhana di Parent VC.
2) 'untuk' pengulangan UIView untuk sub tampilan. Ini hanya berfungsi pada VC tertentu.
sumber