Duża część mojej aplikacji składa się z widoków internetowych, które zapewniają funkcjonalność niedostępną jeszcze przez implementacje natywne. Zespół internetowy nie planuje zaimplementować mrocznego motywu dla witryny. W związku z tym moja aplikacja będzie wyglądać trochę na pół / na pół z obsługą trybu ciemnego na iOS 13.
Czy można zrezygnować z obsługi trybu ciemnego, aby nasza aplikacja zawsze wyświetlała tryb światła pasujący do motywu witryny?
ios
ios13
ios-darkmode
SeanR
źródło
źródło
UIUserInterfaceStyle
naLight
w swojej Info.Plist. Zobacz developer.apple.com/library/archive/documentation/General/…Odpowiedzi:
Po pierwsze, oto wpis Apple związany z rezygnacją z trybu ciemnego. Treść pod tym linkiem jest napisana dla Xcode 11 i iOS 13 :
Ta sekcja dotyczy użytkowania Xcode 11
Podejście nr 1
Użyj następującego klucza w pliku info.plist :
I przypisz mu wartość
Light
.Kod XML dla
UIUserInterfaceStyle
zadania:Podejście nr 2
Możesz ustawić
overrideUserInterfaceStyle
na podstawiewindow
zmiennej aplikacji .W zależności od sposobu utworzenia projektu może to być
AppDelegate
plik lub plikSceneDelegate
.Dokumentacja Apple dla overrideUserInterfaceStyle
Jak będzie wyglądał powyższy kod w Xcode 11:
Ta sekcja dotyczy użytkowania Xcode 10.x.
Jeśli używasz Xcode 11 do przesyłania, możesz bezpiecznie zignorować wszystko poniżej tego wiersza.
Ponieważ odpowiedni interfejs API nie istnieje w systemie iOS 12, podczas próby użycia powyższych wartości wystąpią błędy:
Do ustawienia
overrideUserInterfaceStyle
w swoimUIViewController
Można to obsłużyć w Xcode 10, testując wersję kompilatora i wersję iOS:
Możesz zmodyfikować powyższy fragment kodu, aby działał z całą aplikacją dla Xcode 10, dodając następujący kod do swojego
AppDelegate
pliku.Jednak ustawienie Plist nie powiedzie się, gdy używasz Xcode w wersji 10.x:
Podziękowania dla @Aron Nelson , @Raimundas Sakalauskas , @NSLeader i rmaddy za ulepszenie tej odpowiedzi za pomocą ich opinii.
źródło
overrideUserInterfaceStyle
wviewDidLoad
każdej kontrolera widoku, można ustawić go raz w głównym oknie aplikacji. O wiele łatwiej, jeśli chcesz, aby cała aplikacja zachowywała się w jeden sposób.#if compiler(>=5.1)
Zamiast tego użyjresponds(to:)
isetValue
Według sesji Apple „Wprowadzenie ciemnościach MODE na iOS” ( https://developer.apple.com/videos/play/wwdc2019/214/ poczynając od 31:13) możliwe jest zestaw
overrideUserInterfaceStyle
doUIUserInterfaceStyleLight
lubUIUserInterfaceStyleDark
na dowolnym kontrolerze widoku lub widoku , które będą używane wtraitCollection
dowolnym kontrolerze widoku podrzędnego lub widoku.Jak już wspomniano przez SeanR można ustawić
UIUserInterfaceStyle
naLight
lubDark
w pliku plist Twojej aplikacji, aby zmienić ten dla całej aplikacji.źródło
Jeśli nie używasz Xcode 11 lub nowszego (tj. IOS 13 lub nowszego SDK), twoja aplikacja nie zdecydowała się automatycznie na obsługę trybu ciemnego. Dlatego nie ma potrzeby rezygnacji z trybu ciemnego.
Jeśli używasz Xcode 11 lub nowszego, system automatycznie włączył tryb ciemny dla Twojej aplikacji. Istnieją dwa sposoby wyłączenia trybu ciemnego w zależności od preferencji. Możesz go całkowicie wyłączyć lub wyłączyć dla dowolnego określonego okna, widoku lub kontrolera widoku.
Wyłącz tryb ciemny całkowicie dla swojej aplikacji
Możesz wyłączyć tryb ciemny, włączając
UIUserInterfaceStyle
klucz o wartości jakLight
w pliku Info.plist aplikacji. Ignoruje to preferencje użytkownika i zawsze nadaje aplikacji lekki wygląd.Wyłącz tryb ciemny dla Window, View lub View Controller
Możesz wymusić wyświetlanie interfejsu zawsze w jasnym lub ciemnym stylu, ustawiając
overrideUserInterfaceStyle
właściwość odpowiedniego okna, widoku lub kontrolera widoku.Wyświetl kontrolery:
Wyświetlenia:
Okno:
Przeczytaj więcej tutaj: Wybieranie określonego stylu interfejsu dla aplikacji na iOS
źródło
********** Najłatwiejszy sposób dla Xcode 11 i nowszych ***********
Dodaj to wcześniej do info.plist
</dict></plist>
źródło
Myślę, że znalazłem rozwiązanie. Początkowo poskładałem go razem z UIUserInterfaceStyle - Lista właściwości informacji i UIUserInterfaceStyle - UIKit , ale teraz znalazłem to faktycznie udokumentowane przy wyborze konkretnego stylu interfejsu dla aplikacji na iOS .
W swoim
info.plist
ustawUIUserInterfaceStyle
( Styl interfejsu użytkownika ) na 1 (UIUserInterfaceStyle.light
).EDYCJA: Zgodnie z odpowiedzią dorbeetle
UIUserInterfaceStyle
może być bardziej odpowiednie ustawienieLight
.źródło
[UIInterfaceStyle] '2' is not a recognized value for UIUserInterfaceStyle. Defaulting to Light.
Powyższa odpowiedź działa, jeśli chcesz zrezygnować z całej aplikacji. Jeśli pracujesz nad biblioteką z interfejsem użytkownika i nie masz luksusu w edytowaniu .plist, możesz to zrobić również za pomocą kodu.
Jeśli kompilujesz przy użyciu zestawu SDK dla systemu iOS 13, możesz po prostu użyć następującego kodu:
Szybki:
Obj-C:
JEDNAK , jeśli chcesz, aby Twój kod kompilował się z iOS 12 SDK (który jest obecnie najnowszym stabilnym SDK), powinieneś skorzystać z selektorów. Kod z selektorami:
Swift (XCode wyświetli ostrzeżenia dla tego kodu, ale na razie jest to jedyny sposób, ponieważ właściwość nie istnieje w zestawie SDK 12, dlatego nie zostanie skompilowana):
Obj-C:
źródło
overrideUserInterfaceStyle
należy ta właściwość .Najnowsza aktualizacja-
Jeśli używasz Xcode 10.x, domyślnie
UIUserInterfaceStyle
jest tolight
iOS 13.x. Po uruchomieniu na urządzeniu z systemem iOS 13 będzie działać tylko w trybie światła.Nie trzeba jawnie dodawać
UIUserInterfaceStyle
klucza w pliku Info.plist, ponieważ dodanie go spowoduje błąd podczas sprawdzania poprawności aplikacji, mówiąc:Dodaj tylko
UIUserInterfaceStyle
klucz w pliku Info.plist, gdy używasz Xcode 11.x.źródło
Jeśli dodasz
UIUserInterfaceStyle
klucz do pliku plist, być może Apple odrzuci kompilację wydania, jak wspomniano tutaj: https://stackoverflow.com/a/56546554/7524146 W każdym razie denerwujące jest jawne informowanie każdego kontrolera ViewControllerself.overrideUserInterfaceStyle = .light
. Ale możesz użyć tego spokoju kodu dla swojegowindow
obiektu głównego :Zauważ, że nie możesz tego zrobić wewnątrz,
application(application: didFinishLaunchingWithOptions:)
ponieważ ten selektor nie zareagujetrue
na tym wczesnym etapie. Ale możesz to zrobić później. To bardzo proste, jeśli używasz niestandardowegoAppPresenter
lubAppRouter
zajęć w swojej aplikacji zamiast automatycznego uruchamiania interfejsu użytkownika w AppDelegate.źródło
Możesz wyłączyć tryb ciemny w całej aplikacji w Xcode 11:
Dodaj poniżej
Info.plist będzie wyglądać jak poniżej ...
źródło
- Dla całej aplikacji (okno):
Możesz uzyskać okno z
SceneDelegate
- W przypadku pojedynczego kontrolera ViewController:
Można ustawić dowolny
viewController
, nawet wewnątrz viewController nim siebie- W przypadku pojedynczego widoku:
Możesz ustawić dowolny
view
, nawet wewnątrz widoku, który samMoże być konieczne użycie,
if #available(iOS 13.0, *) { ,,, }
jeśli obsługujesz wcześniejsze wersje iOS.źródło
Oprócz innych odpowiedzi, z mojego rozumienia następujących rzeczy, musisz tylko przygotować się do trybu ciemnego podczas kompilacji z pakietem iOS 13 SDK (używając XCode 11).
Połączyć
źródło
Tak, możesz pominąć dodając następujący kod w viewDidLoad:
źródło
Moja aplikacja nie obsługuje obecnie trybu ciemnego i używa jasnego koloru paska aplikacji. Byłem w stanie zmusić zawartość paska stanu do ciemnego tekstu i ikon, dodając następujący klucz do mojego
Info.plist
:Znajdź inne możliwe wartości tutaj: https://developer.apple.com/documentation/uikit/uistatusbarstyle
źródło
Wersja C celu
źródło
Oto kilka porad i wskazówek, których możesz użyć w swojej aplikacji do obsługi lub obejścia trybu ciemności.
Pierwsza wskazówka: aby zastąpić styl ViewController
możesz zastąpić styl interfejsu UIViewController przez
Druga wskazówka: dodawanie klucza w info.plist
Po prostu możesz dodać nowy klucz
w aplikacji info.plist i ustaw jego wartość na Jasny lub Ciemny. spowoduje to zastąpienie domyślnego stylu aplikacji do podanej wartości. Nie musisz dodawać overrideUserInterfaceStyle = .light tej linii w każdym viewController, tylko jedna linia w info.plist to jest to.
źródło
Wystarczy dodać następujący klucz do
info.plist
pliku:źródło
źródło
Szybki 5
Dwa sposoby przełączania trybu ciemnego na jasny:
źródło
Chciałbym skorzystać z tego rozwiązania, ponieważ właściwość okna może zostać zmieniona podczas cyklu życia aplikacji. Dlatego przypisanie „overrideUserInterfaceStyle = .light” musi zostać powtórzone. UIWindow.appearance () pozwala nam ustawić wartość domyślną, która będzie używana dla nowo tworzonych obiektów UIWindow.
źródło
Wystarczy dodać tę linię w pliku info.plist:
To zmusi aplikację do działania tylko w trybie lekkim.
źródło
źródło
Możesz: dodać ten nowy klucz UIUserInterfaceStyle do Info.plist i ustawić jego wartość na Light. i sprawdź, czy kontroler alertów pojawia się w trybie światła.
UIUserInterfaceStyle Light Jeśli wymuszasz tryb jasnego / ciemnego w całej aplikacji, niezależnie od ustawień użytkownika, dodając klucz UIUserInterfaceStyle do pliku Info.plist i ustawiając jego wartość na Jasną lub Ciemną.
źródło
To pytanie ma tak wiele odpowiedzi, raczej używając go
info.plist
możesz ustawić wAppDelegate
następujący sposób:Test na Xcode 11.3, iOS 13.3
źródło
Właściwie właśnie napisałem kod, który pozwoli ci globalnie zrezygnować z trybu ciemnego w kodzie bez konieczności instalowania każdego kontrolera viw w twojej aplikacji. Prawdopodobnie można to poprawić, rezygnując z poszczególnych klas, zarządzając listą klas. Dla mnie chcę, aby użytkownicy zobaczyli, czy podoba im się interfejs trybu ciemnego dla mojej aplikacji, a jeśli im się to nie podoba, mogą go wyłączyć. Pozwoli im to kontynuować korzystanie z trybu ciemnego dla pozostałych aplikacji.
Wybór użytkownika jest dobry (Ahem, patrząc na ciebie Apple, tak powinieneś był go wdrożyć).
Jak to działa, to tylko kategoria UIViewController. Podczas ładowania zastępuje natywną metodę viewDidLoad taką, która sprawdzi flagę globalną, aby sprawdzić, czy tryb ciemny jest wyłączony dla wszystkich, czy nie.
Ponieważ jest on uruchamiany podczas ładowania UIViewController, powinien automatycznie uruchomić się i domyślnie wyłączyć tryb ciemny. Jeśli to nie jest to, czego potrzebujesz, musisz wcześniej gdzieś tam wejść i ustawić flagę, albo po prostu ustawić flagę domyślną.
Nie napisałem jeszcze nic, by odpowiedzieć na to, że użytkownik włącza lub wyłącza flagę. Jest to w zasadzie przykładowy kod. Jeśli chcemy, aby użytkownik z tym współdziałał, wszystkie kontrolery widoku będą musiały się ponownie załadować. Nie wiem, jak to zrobić odręcznie, ale prawdopodobnie wysłanie jakiegoś powiadomienia załatwi sprawę. Tak więc teraz to globalne włączanie / wyłączanie dla trybu ciemnego będzie działać tylko podczas uruchamiania lub ponownego uruchamiania aplikacji.
Teraz nie wystarczy spróbować wyłączyć tryb ciemny w każdym widoku kontrolera MFING w swojej ogromnej aplikacji. Jeśli używasz zasobów kolorów, jesteś całkowicie bez kości. Od ponad 10 lat rozumiemy niezmienne obiekty jako niezmienne. Kolory, które otrzymujesz z katalogu zasobów kolorów, mówią, że są to UIColor, ale są to kolory dynamiczne (zmienne) i będą się zmieniać pod tobą, gdy system zmieni się z trybu ciemnego na jasny. To ma być funkcja. Ale oczywiście nie ma przełącznika głównego, który prosi te rzeczy o zaprzestanie wprowadzania tej zmiany (o ile wiem teraz, może ktoś może to poprawić).
Rozwiązanie składa się z dwóch części:
kategoria publiczna na UIViewController, która daje pewne metody użyteczności i wygody ... na przykład nie sądzę, że Apple pomyślał o tym, że niektórzy z nas mieszają kod internetowy z naszymi aplikacjami. Jako takie mamy arkusze stylów, które należy przełączać w oparciu o tryb ciemny lub jasny. Dlatego musisz albo zbudować jakiś dynamiczny obiekt arkusza stylów (co byłoby dobre), albo po prostu zapytać, jaki jest obecny stan (zły, ale łatwy).
ta kategoria podczas ładowania zastąpi metodę viewDidLoad klasy UIViewController i przechwytuje połączenia. Nie wiem, czy to łamie zasady sklepu z aplikacjami. Jeśli tak, prawdopodobnie istnieją inne sposoby, ale można to uznać za dowód koncepcji. Możesz na przykład utworzyć jedną podklasę wszystkich głównych typów kontrolerów widoku i sprawić, że wszystkie własne kontrolery widoku odziedziczą po nich, a następnie możesz użyć idei kategorii DarkMode i wywołać ją, aby wymusić rezygnację ze wszystkich kontrolerów widoku. Jest brzydszy, ale nie złamie żadnych zasad. Wolę używać środowiska wykonawczego, ponieważ właśnie do tego zostało stworzone środowisko wykonawcze. Więc w mojej wersji po prostu dodajesz kategorię, ustawiasz zmienną globalną na kategorię, czy chcesz, aby blokowała tryb ciemny, i zrobi to.
Jak już wspomniano, jeszcze nie wyszedłeś z lasu, innym problemem jest to, że UIColor zasadniczo robi wszystko, do diabła, czego chce. Więc nawet jeśli kontrolery widoku blokują tryb ciemny, UIColor nie wie, gdzie i jak go używasz, więc nie można go dostosować. W rezultacie możesz go poprawnie pobrać, ale w pewnym momencie wróci do ciebie. Może wkrótce może później. Tak więc można to zrobić, przydzielając go dwukrotnie za pomocą CGColor i zmieniając go w kolor statyczny. Oznacza to, że jeśli użytkownik wróci i ponownie włączy tryb ciemny na stronie ustawień (chodzi o to, aby działał tak, aby użytkownik miał kontrolę nad aplikacją ponad resztą systemu), wszystkie te statyczne kolory wymagają wymiany. Jak dotąd pozostaje to do rozwiązania przez kogoś innego. Najłatwiejszym sposobem na zrobienie tego jest ustawienie domyślnej wartości „ wyłączając tryb ciemny, podziel przez zero, aby zawiesić aplikację, ponieważ nie możesz jej zamknąć i powiedzieć użytkownikowi, aby po prostu zrestartował. To prawdopodobnie narusza również wytyczne sklepu z aplikacjami, ale to pomysł.
Kategoria UIColor nie musi być ujawniana, działa po prostu wywołując colorNamed: ... jeśli nie powiedziałeś klasie DarkMode ViewController, aby blokowała tryb ciemny, będzie działała idealnie zgodnie z oczekiwaniami. Próba zrobienia czegoś eleganckiego zamiast standardowego kodu sphaghetti z jabłkiem, co oznacza, że będziesz musiał zmodyfikować większość aplikacji, jeśli chcesz programowo zrezygnować z trybu ciemnego lub go przełączyć. Teraz nie wiem, czy istnieje lepszy sposób na programową zmianę Info.plist, aby w razie potrzeby wyłączyć tryb ciemny. O ile dobrze rozumiem, jest to funkcja czasu kompilacji, a następnie jesteś bez kości.
Oto kod, którego potrzebujesz. Powinieneś wpaść i po prostu użyć jednej metody, aby ustawić styl interfejsu użytkownika lub ustawić wartość domyślną w kodzie. Możesz dowolnie używać, modyfikować, robić, co chcesz z tym do dowolnego celu i nie udziela się gwarancji, a ja nie wiem, czy przejdzie do sklepu z aplikacjami. Ulepszenia bardzo mile widziane.
Uczciwe ostrzeżenie Nie używam ARC ani innych metod trzymania w ręku.
Istnieje zestaw funkcji narzędziowych, których używa do wykonywania wymiany metod. Oddzielny plik. Jest to jednak standard i podobny kod można znaleźć w dowolnym miejscu.
Kopiuję i wklejam to z kilku plików, ponieważ q-runtime.h jest moją biblioteką wielokrotnego użytku i to tylko część tego. Jeśli coś się nie kompiluje, daj mi znać.
źródło