Sebagian besar aplikasi saya terdiri dari tampilan web untuk menyediakan fungsionalitas yang belum tersedia melalui implementasi asli. Tim web tidak memiliki rencana untuk menerapkan tema gelap untuk situs web. Dengan demikian, aplikasi saya akan terlihat setengah / setengah dengan dukungan Mode Gelap di iOS 13.
Apakah mungkin untuk memilih keluar dari dukungan Mode Gelap sehingga aplikasi kami selalu menunjukkan mode cahaya agar sesuai dengan tema situs web?
ios
ios13
ios-darkmode
SeanR
sumber
sumber
UIUserInterfaceStyle
keLight
dalam Info.Plist Anda. Lihat developer.apple.com/library/archive/documentation/General/…Jawaban:
Pertama, di sini adalah entri Apple terkait dengan memilih keluar dari mode gelap. Konten di tautan ini ditulis untuk Xcode 11 & iOS 13 :
Bagian ini berlaku untuk penggunaan Xcode 11
Pendekatan # 1
Gunakan kunci berikut dalam file info.plist Anda :
Dan berikan nilai
Light
.The XML untuk
UIUserInterfaceStyle
tugas:Pendekatan # 2
Anda dapat mengatur
overrideUserInterfaceStyle
terhadapwindow
variabel aplikasi .Bergantung pada bagaimana proyek Anda dibuat, ini mungkin dalam
AppDelegate
file atauSceneDelegate
.Dokumentasi Apple untuk overrideUserInterfaceStyle
Bagaimana kode di atas akan terlihat dalam Xcode 11:
Bagian ini berlaku untuk penggunaan Xcode 10.x
Jika Anda menggunakan Xcode 11 untuk pengiriman Anda, Anda dapat dengan aman mengabaikan semua yang ada di bawah baris ini.
Karena API yang relevan tidak ada di iOS 12, Anda akan mendapatkan kesalahan ketika mencoba menggunakan nilai yang diberikan di atas:
Untuk pengaturan
overrideUserInterfaceStyle
diUIViewController
Ini dapat ditangani dalam Xcode 10 dengan menguji versi kompiler dan versi iOS:
Anda dapat memodifikasi cuplikan di atas agar bekerja melawan seluruh aplikasi untuk Xcode 10, dengan menambahkan kode berikut ke
AppDelegate
file Anda .Namun, pengaturan plist akan gagal saat menggunakan Xcode versi 10.x:
Penghargaan untuk @Aron Nelson , @Raimundas Sakalauskas , @NSLeader dan rmaddy untuk meningkatkan jawaban ini dengan umpan balik mereka.
sumber
overrideUserInterfaceStyle
diviewDidLoad
setiap controller tampilan, Anda dapat mengaturnya sekali pada jendela utama aplikasi. Jauh lebih mudah jika Anda ingin seluruh aplikasi berperilaku satu arah.#if compiler(>=5.1)
sebagai gantinyaresponds(to:)
dansetValue
Menurut sesi Apple tentang "Menerapkan Mode Gelap di iOS" ( https://developer.apple.com/videos/play/wwdc2019/214/ mulai dari 31:13) dimungkinkan untuk mengatur
overrideUserInterfaceStyle
keUIUserInterfaceStyleLight
atauUIUserInterfaceStyleDark
pada pengontrol tampilan atau tampilan , yang akan digunakantraitCollection
untuk subview atau view controller.Seperti yang telah disebutkan oleh SeanR, Anda dapat mengatur
UIUserInterfaceStyle
keLight
atauDark
dalam file plist aplikasi Anda untuk mengubahnya ke seluruh aplikasi Anda.sumber
Jika Anda tidak menggunakan Xcode 11 atau lebih baru (i, e iOS 13 atau lebih baru SDK), aplikasi Anda belum secara otomatis memilih untuk mendukung mode gelap. Jadi, tidak perlu keluar dari mode gelap.
Jika Anda menggunakan Xcode 11 atau lebih baru, sistem telah secara otomatis mengaktifkan mode gelap untuk aplikasi Anda. Ada dua pendekatan untuk menonaktifkan mode gelap tergantung pada preferensi Anda. Anda dapat menonaktifkannya sepenuhnya atau menonaktifkannya untuk jendela tertentu, tampilan, atau pengontrol tampilan.
Nonaktifkan Mode Gelap Sepenuhnya untuk Aplikasi Anda
Anda dapat menonaktifkan mode gelap dengan memasukkan
UIUserInterfaceStyle
kunci dengan nilai sepertiLight
dalam file Info.plist aplikasi Anda. Ini mengabaikan preferensi pengguna dan selalu menerapkan tampilan ringan untuk aplikasi Anda.Nonaktifkan mode gelap untuk Window, View, atau View Controller
Anda dapat memaksa antarmuka Anda untuk selalu tampil dalam gaya terang atau gelap dengan mengatur
overrideUserInterfaceStyle
properti jendela, tampilan, atau pengontrol tampilan yang sesuai.Lihat pengontrol:
Dilihat:
Jendela:
Baca lebih lanjut di sini: Memilih Gaya Antarmuka Tertentu untuk Aplikasi iOS Anda
sumber
********** Cara termudah untuk Xcode 11 ke atas ***********
Tambahkan ini ke info.plist sebelumnya
</dict></plist>
sumber
Saya pikir saya sudah menemukan solusinya. Saya awalnya menyatukannya dari UIUserInterfaceStyle - Daftar Informasi Properti dan UIUserInterfaceStyle - UIKit , tetapi sekarang telah menemukannya didokumentasikan pada Memilih gaya antarmuka spesifik untuk aplikasi iOS Anda .
Di
info.plist
set AndaUIUserInterfaceStyle
( Gaya Antarmuka Pengguna ) ke 1 (UIUserInterfaceStyle.light
).EDIT: Sesuai jawaban dorbeetle, pengaturan yang lebih tepat untuk
UIUserInterfaceStyle
mungkinLight
.sumber
[UIInterfaceStyle] '2' is not a recognized value for UIUserInterfaceStyle. Defaulting to Light.
Jawaban di atas berfungsi jika Anda ingin menyisih dari seluruh aplikasi. Jika Anda bekerja pada lib yang memiliki UI, dan Anda tidak memiliki mengedit .plist, Anda dapat melakukannya melalui kode juga.
Jika Anda mengompilasi dengan iOS 13 SDK, Anda dapat menggunakan kode berikut:
Cepat:
Obj-C:
NAMUN , jika Anda ingin kode Anda dikompilasi iOS 12 SDK juga (yang saat ini masih SDK stabil terbaru), Anda harus menggunakan penyeleksi. Kode dengan pemilih:
Swift (XCode akan menampilkan peringatan untuk kode ini, tetapi itulah satu-satunya cara untuk melakukannya untuk saat ini karena properti tidak ada di SDK 12 karena itu tidak akan dikompilasi):
Obj-C:
sumber
overrideUserInterfaceStyle
milik properti apa .Pembaruan Terbaru-
Jika Anda menggunakan Xcode 10.x, maka defaultnya
UIUserInterfaceStyle
adalahlight
untuk iOS 13.x. Saat dijalankan pada perangkat iOS 13, itu hanya akan berfungsi dalam Mode Ringan.Tidak perlu menambahkan
UIUserInterfaceStyle
kunci secara eksplisit dalam file Info.plist, menambahkannya akan memberikan kesalahan ketika Anda memvalidasi aplikasi Anda, mengatakan:Hanya tambahkan
UIUserInterfaceStyle
kunci dalam file Info.plist saat menggunakan Xcode 11.x.sumber
Jika Anda akan menambahkan
UIUserInterfaceStyle
kunci ke file plist, mungkin Apple akan menolak rilis rilis seperti yang disebutkan di sini: https://stackoverflow.com/a/56546554/7524146 Pokoknya itu menjengkelkan untuk secara eksplisit memberi tahu setiap ViewControllerself.overrideUserInterfaceStyle = .light
. Tetapi Anda dapat menggunakan ketenangan kode ini sekali untukwindow
objek root Anda :Hanya perhatikan Anda tidak dapat melakukan ini di dalam
application(application: didFinishLaunchingWithOptions:)
karena pemilih ini tidak akan meresponstrue
pada tahap awal itu. Tetapi Anda bisa melakukannya nanti. Ini sangat mudah jika Anda menggunakan kustomAppPresenter
atauAppRouter
kelas di aplikasi Anda daripada memulai UI di AppDelegate secara otomatis.sumber
Anda dapat mematikan Mode Gelap di seluruh aplikasi dalam Xcode 11:
Tambahkan di bawah seperti
Info.plist akan terlihat seperti di bawah ini ...
sumber
- Untuk seluruh Aplikasi (Jendela):
Anda bisa mendapatkan jendela dari
SceneDelegate
- Untuk satu ViewController:
Anda dapat mengatur apa saja
viewController
, bahkan di dalam viewController sendiri- Untuk satu Tampilan:
Anda dapat mengatur apa saja
view
, bahkan di dalam tampilan itu sendiriAnda mungkin perlu menggunakan
if #available(iOS 13.0, *) { ,,, }
jika Anda mendukung versi iOS sebelumnya.sumber
Terlepas dari tanggapan lain, dari pemahaman saya tentang hal berikut, Anda hanya perlu mempersiapkan mode Gelap saat dikompilasi dengan iOS 13 SDK (menggunakan XCode 11).
Tautan
sumber
Ya, Anda dapat melewati dengan menambahkan kode berikut di viewDidLoad:
sumber
Aplikasi saya tidak mendukung mode gelap seperti sekarang dan menggunakan warna bilah aplikasi terang. Saya dapat memaksa konten bilah status ke teks dan ikon gelap dengan menambahkan kunci berikut ke saya
Info.plist
:Temukan nilai lain yang mungkin di sini: https://developer.apple.com/documentation/uikit/uistatusbarstyle
sumber
Versi obyektif-c
sumber
Berikut adalah beberapa tips dan trik yang dapat Anda gunakan di aplikasi Anda untuk mendukung atau melewati mode gelap.
Kiat pertama: Untuk mengganti gaya ViewController
Anda dapat mengganti gaya antarmuka UIViewController dengan
Kiat kedua: Menambahkan kunci di info.plist
Cukup Anda dapat menambahkan kunci baru
di info.plist aplikasi Anda dan atur nilainya menjadi Terang atau Gelap. ini akan menimpa gaya default aplikasi ke nilai yang Anda berikan. Anda tidak perlu menambahkan overrideUserInterfaceStyle = .light baris ini di setiap viewController, cukup satu baris di info.plist itu saja.
sumber
Cukup tambahkan kunci berikut di
info.plist
file Anda :sumber
sumber
Cepat 5
Dua cara untuk beralih dari mode gelap ke terang:
sumber
Saya akan menggunakan solusi ini karena properti jendela dapat diubah selama siklus hidup aplikasi. Jadi menugaskan "overrideUserInterfaceStyle = .light" perlu diulang. UIWindow.appearance () memungkinkan kami untuk menetapkan nilai default yang akan digunakan untuk objek UIWindow yang baru dibuat.
sumber
Cukup tambahkan baris ini dalam file info.plist:
Ini akan memaksa aplikasi untuk berjalan dalam mode cahaya saja.
sumber
sumber
Anda dapat melakukannya: tambahkan kunci UIUserInterfaceStyle baru ini ke Info.plist dan tetapkan nilainya ke Light. dan periksa pengontrol peringatan muncul dengan mode cahaya.
UIUserInterfaceStyle Light Jika Anda memaksa mode terang / gelap di seluruh aplikasi Anda terlepas dari pengaturan pengguna dengan menambahkan kunci UIUserInterfaceStyle ke file Info.plist Anda dan mengatur nilainya ke Cahaya atau Gelap.
sumber
Pertanyaan ini memiliki begitu banyak jawaban, alih-alih menggunakannya
info.plist
Anda dapat mengaturnyaAppDelegate
seperti ini:Uji pada Xcode 11.3, iOS 13.3
sumber
Sebenarnya saya hanya menulis beberapa kode yang akan memungkinkan Anda untuk secara global memilih keluar dari mode gelap dalam kode tanpa harus memasang setiap pengontrol viw tunggal dalam aplikasi Anda. Ini mungkin dapat disempurnakan untuk memilih keluar dari kelas berdasarkan kelas dengan mengelola daftar kelas. Bagi saya, yang saya inginkan adalah agar pengguna melihat apakah mereka menyukai antarmuka mode gelap untuk aplikasi saya, dan jika mereka tidak menyukainya, mereka dapat mematikannya. Ini akan memungkinkan mereka untuk terus menggunakan mode gelap untuk sisa aplikasi mereka.
Pilihan pengguna baik (Ahem, melihat Anda Apple, ini adalah bagaimana Anda seharusnya menerapkannya).
Jadi cara kerjanya adalah hanya kategori UIViewController. Ketika dimuat itu menggantikan metode viewDidLoad asli dengan yang akan memeriksa bendera global untuk melihat apakah mode gelap dinonaktifkan untuk semuanya atau tidak.
Karena dipicu pada pemuatan UIViewController maka secara otomatis akan memulai dan menonaktifkan mode gelap secara default. Jika ini bukan yang Anda inginkan, maka Anda harus masuk ke suatu tempat lebih awal dan mengatur bendera, atau hanya mengatur bendera default.
Saya belum menulis apa pun untuk menanggapi pengguna mengaktifkan atau menonaktifkan bendera. Jadi ini pada dasarnya adalah contoh kode. Jika kami ingin pengguna berinteraksi dengan ini, semua pengontrol tampilan perlu memuat ulang. Saya tidak tahu bagaimana melakukan itu begitu saja, tetapi mungkin mengirimkan beberapa pemberitahuan akan berhasil. Jadi saat ini, mode on / off global ini untuk mode gelap hanya akan berfungsi saat startup atau restart aplikasi.
Sekarang, itu tidak hanya cukup untuk mencoba mematikan mode gelap di setiap viewController MFING tunggal di aplikasi besar Anda. Jika Anda menggunakan aset warna, Anda sepenuhnya bertulang. Kami selama 10+ tahun telah memahami objek yang tidak dapat berubah menjadi tidak berubah. Warna yang Anda dapatkan dari katalog aset warna mengatakan bahwa itu adalah UIColor tetapi warnanya dinamis (bisa berubah) dan akan berubah di bawah Anda saat sistem berubah dari mode gelap ke terang. Itu seharusnya menjadi fitur. Tetapi tentu saja tidak ada master beralih untuk meminta hal-hal ini berhenti membuat perubahan ini (sejauh yang saya tahu sekarang, mungkin seseorang dapat meningkatkan ini).
Jadi solusinya ada dalam dua bagian:
kategori publik di UIViewController yang memberikan beberapa metode utilitas dan kenyamanan ... misalnya saya tidak berpikir apple telah memikirkan fakta bahwa sebagian dari kita mencampur kode web ke dalam aplikasi kita. Karena itu kami memiliki stylesheet yang perlu diubah berdasarkan mode gelap atau terang. Jadi, Anda perlu membangun semacam objek stylesheet dinamis (yang akan baik) atau hanya bertanya seperti apa keadaan saat ini (buruk tapi mudah).
kategori ini saat dimuat akan menggantikan metode viewDidLoad dari kelas UIViewController dan mencegat panggilan. Saya tidak tahu apakah itu melanggar aturan toko aplikasi. Jika ya, ada beberapa cara lain yang mungkin tetapi Anda dapat menganggapnya sebagai bukti konsep. Misalnya Anda dapat membuat satu subkelas dari semua jenis pengontrol tampilan utama dan membuat semua pengontrol tampilan Anda mewarisi dari itu, dan kemudian Anda dapat menggunakan ide kategori DarkMode dan memanggilnya untuk memaksa memilih keluar dari semua pengontrol tampilan Anda. Itu lebih buruk tetapi tidak akan melanggar aturan apa pun. Saya lebih suka menggunakan runtime karena itulah yang harus dilakukan runtime. Jadi dalam versi saya, Anda hanya menambahkan kategori, Anda menetapkan variabel global pada kategori untuk apakah Anda ingin memblokir mode gelap, dan itu akan melakukannya.
Anda belum keluar dari hutan, seperti yang disebutkan, masalah lainnya adalah UIColor pada dasarnya melakukan apa pun yang diinginkannya. Jadi, bahkan jika pengontrol tampilan Anda memblokir mode gelap, UIColor tidak tahu di mana atau bagaimana Anda menggunakannya jadi tidak bisa beradaptasi. Sebagai hasilnya, Anda dapat mengambilnya dengan benar tetapi kemudian akan mengembalikan Anda di beberapa titik di masa depan. Mungkin sebentar lagi nanti. Jadi cara mengatasinya adalah dengan mengalokasikannya dua kali menggunakan CGColor dan mengubahnya menjadi warna statis. Ini berarti jika pengguna Anda kembali dan mengaktifkan kembali mode gelap pada halaman pengaturan Anda (ide di sini adalah untuk membuat ini berfungsi sehingga pengguna memiliki kontrol atas aplikasi Anda di atas dan di atas sisa sistem), semua warna-warna statis perlu diganti. Sejauh ini yang tersisa untuk dipecahkan orang lain. Cara mudah untuk melakukannya adalah dengan membuat default bahwa Anda kembali memilih keluar dari mode gelap, bagi dengan nol untuk crash aplikasi karena Anda tidak dapat keluar dan memberitahu pengguna untuk hanya me-restart itu. Itu mungkin melanggar pedoman toko aplikasi juga tapi itu ide.
Kategori UIColor tidak perlu diekspos, itu hanya berfungsi memanggil colorNamed: ... jika Anda tidak memberi tahu kelas DarkMode ViewController untuk memblokir mode gelap, itu akan berfungsi dengan baik seperti yang diharapkan. Mencoba membuat sesuatu yang elegan alih-alih kode sphaghetti apel standar yang berarti Anda harus memodifikasi sebagian besar aplikasi Anda jika Anda ingin secara sistematis memilih keluar dari mode gelap atau mengubahnya. Sekarang saya tidak tahu apakah ada cara yang lebih baik untuk secara sistematis mengubah Info.plist untuk mematikan mode gelap sesuai kebutuhan. Sejauh pemahaman saya itu adalah fitur waktu kompilasi dan setelah itu Anda boned.
Jadi di sini adalah kode yang Anda butuhkan. Harus drop in dan cukup gunakan satu metode untuk mengatur Gaya UI atau mengatur default dalam kode. Anda bebas untuk menggunakan, memodifikasi, melakukan apa pun yang Anda inginkan dengan tujuan ini dan tidak ada garansi yang diberikan dan saya tidak tahu apakah itu akan melewati app store. Perbaikan sangat disambut.
Peringatan yang adil saya tidak menggunakan ARC atau metode pegangan lainnya.
Ada satu set fungsi utilitas yang digunakan untuk melakukan metode swapping. File terpisah. Ini adalah hal standar dan Anda dapat menemukan kode serupa di mana saja.
Saya menyalin dan menempelkan ini dari beberapa file sejak q-runtime.h adalah pustaka yang dapat digunakan kembali dan ini hanya sebagian saja. Jika ada sesuatu yang tidak dikompilasi, beri tahu saya.
sumber