Grande parte do meu aplicativo consiste em visualizações da Web para fornecer funcionalidades ainda não disponíveis em implementações nativas. A equipe da web não tem planos de implementar um tema sombrio para o site. Dessa forma, meu aplicativo ficará meio / meio com o suporte ao Modo escuro no iOS 13.
É possível desativar o suporte ao Modo escuro para que nosso aplicativo sempre mostre o modo claro para combinar com o tema do site?
ios
ios13
ios-darkmode
SeanR
fonte
fonte
UIUserInterfaceStyle
comoLight
na sua Info.Plist. Veja developer.apple.com/library/archive/documentation/General/…Respostas:
Primeiro, aqui está a entrada da Apple relacionada à saída do modo escuro. O conteúdo deste link foi escrito para o Xcode 11 e iOS 13 :
Esta seção se aplica ao uso do Xcode 11
Abordagem # 1
Use a seguinte chave no seu arquivo info.plist :
E atribua a ele um valor de
Light
.O XML para a
UIUserInterfaceStyle
atribuição:Abordagem # 2
Você pode definir
overrideUserInterfaceStyle
awindow
variável do aplicativo .Dependendo de como seu projeto foi criado, isso pode estar no
AppDelegate
arquivo ou no arquivoSceneDelegate
.Documentação da Apple para overrideUserInterfaceStyle
Como será o código acima no Xcode 11:
Esta seção se aplica ao uso do Xcode 10.x
Se você estiver usando o Xcode 11 para enviar, poderá ignorar com segurança tudo abaixo desta linha.
Como a API relevante não existe no iOS 12, você receberá erros ao tentar usar os valores fornecidos acima:
Para definir
overrideUserInterfaceStyle
em seuUIViewController
Isso pode ser tratado no Xcode 10 testando a versão do compilador e a versão do iOS:
Você pode modificar o trecho acima para funcionar com todo o aplicativo do Xcode 10, adicionando o seguinte código ao seu
AppDelegate
arquivo.No entanto, a configuração plist falhará ao usar o Xcode versão 10.x:
Os nossos agradecimentos a @Aron Nelson , @Raimundas Sakalauskas , @NSLeader e rmaddy por melhorarem essa resposta com seus comentários.
fonte
overrideUserInterfaceStyle
emviewDidLoad
todos os controladores de exibição, você pode configurá-lo uma vez na janela principal do aplicativo. Muito mais fácil se você quiser que o aplicativo inteiro se comporte de uma maneira.#if compiler(>=5.1)
vezresponds(to:)
esetValue
De acordo com a sessão da Apple sobre "Implementando o Modo Escuro no iOS" ( https://developer.apple.com/videos/play/wwdc2019/214/ a partir das 31:13), é possível definir
overrideUserInterfaceStyle
paraUIUserInterfaceStyleLight
ouUIUserInterfaceStyleDark
em qualquer controlador de exibição ou exibição , que será usado notraitCollection
para qualquer subview ou view controller.Como já mencionado pelo SeanR, você pode definir
UIUserInterfaceStyle
paraLight
ouDark
no arquivo plist do seu aplicativo para alterar isso em todo o aplicativo.fonte
Se você não estiver usando o Xcode 11 ou posterior (i, e iOS 13 ou posterior SDK), seu aplicativo não optou automaticamente pelo suporte ao modo escuro. Portanto, não há necessidade de sair do modo escuro.
Se você estiver usando o Xcode 11 ou posterior, o sistema ativou automaticamente o modo escuro para seu aplicativo. Existem duas abordagens para desativar o modo escuro, dependendo da sua preferência. Você pode desativá-lo totalmente ou desativá-lo para qualquer janela, exibição ou controlador específico.
Desativar o modo escuro totalmente para o seu aplicativo
Você pode desativar o modo escuro incluindo a
UIUserInterfaceStyle
chave com um valor, comoLight
no arquivo Info.plist do seu aplicativo. Isso ignora a preferência do usuário e sempre aplica uma aparência leve ao seu aplicativo.Desativar o modo escuro para Window, View ou View Controller
Você pode forçar sua interface a sempre aparecer em um estilo claro ou escuro, definindo o
overrideUserInterfaceStyle
propriedade da janela, exibição ou controlador de exibição apropriado.Ver controladores:
Visualizações:
Janela:
Leia mais aqui: Escolhendo um estilo de interface específico para seu aplicativo para iOS
fonte
********** A maneira mais fácil para o Xcode 11 e superior ***********
Adicione isso ao info.plist antes
</dict></plist>
fonte
Eu acho que encontrei a solução. Inicialmente, eu o reuni em UIUserInterfaceStyle - Information Property List e UIUserInterfaceStyle - UIKit , mas agora o encontrei realmente documentado em Escolhendo um estilo de interface específico para o seu aplicativo iOS .
No seu
info.plist
, definaUIUserInterfaceStyle
( Estilo da interface do usuário ) como 1 (UIUserInterfaceStyle.light
).EDIT: Conforme resposta do dorbeetle,
UIUserInterfaceStyle
pode ser uma configuração mais apropriadaLight
.fonte
[UIInterfaceStyle] '2' is not a recognized value for UIUserInterfaceStyle. Defaulting to Light.
A resposta acima funciona se você quiser desativar todo o aplicativo. Se você está trabalhando na lib que possui interface do usuário e não tem o luxo de editar o .plist, também pode fazê-lo via código.
Se você estiver compilando no iOS 13 SDK, poderá simplesmente usar o seguinte código:
Rápido:
Obj-C:
NO ENTANTO , se você deseja que seu código seja compilado no iOS 12 SDK também (que ainda é o SDK estável mais recente), você deve recorrer ao uso de seletores. Código com seletores:
Swift (o XCode mostrará avisos para esse código, mas essa é a única maneira de fazê-lo por enquanto, pois a propriedade não existe no SDK 12 e, portanto, não será compilada):
Obj-C:
fonte
overrideUserInterfaceStyle
pertence.Última atualização-
Se você estiver usando o Xcode 10.x, o padrão
UIUserInterfaceStyle
é olight
iOS 13.x. Quando executado em um dispositivo iOS 13, ele funcionará apenas no Modo Luz.Não há necessidade de adicionar explicitamente a
UIUserInterfaceStyle
chave no arquivo Info.plist, pois isso causará um erro ao validar seu aplicativo, dizendo:Adicione apenas a
UIUserInterfaceStyle
chave no arquivo Info.plist ao usar o Xcode 11.x.fonte
Se você adicionar uma
UIUserInterfaceStyle
chave ao arquivo plist, possivelmente a Apple rejeitará a compilação de versão conforme mencionado aqui: https://stackoverflow.com/a/56546554/7524146 De qualquer forma, é irritante dizer explicitamente a cada ViewControllerself.overrideUserInterfaceStyle = .light
. Mas você pode usar essa paz de código uma vez para o seuwindow
objeto raiz :Observe que você não pode fazer isso
application(application: didFinishLaunchingWithOptions:)
por dentro, pois esse seletor não responderátrue
no estágio inicial. Mas você pode fazer isso mais tarde. É super fácil se você estiver usando classeAppPresenter
ou personalizadoAppRouter
no seu aplicativo em vez de iniciar a interface do usuário no AppDelegate automaticamente.fonte
Você pode desativar o Modo escuro em todo o aplicativo no Xcode 11:
Adicionar abaixo como
Info.plist será semelhante abaixo ...
fonte
- Para todo o aplicativo (janela):
Você pode obter a janela de
SceneDelegate
- Para um único ViewController:
Você pode definir qualquer
viewController
, mesmo dentro do viewController-lo auto- Para uma única visualização:
Você pode definir qualquer
view
, mesmo dentro da vista, autoPode ser necessário usar
if #available(iOS 13.0, *) { ,,, }
se você suporta versões anteriores do iOS.fonte
Além de outras respostas, pelo que entendi a seguir, você só precisa se preparar para o modo Escuro ao compilar com o iOS 13 SDK (usando o XCode 11).
Ligação
fonte
Sim, você pode pular adicionando o seguinte código em viewDidLoad:
fonte
Meu aplicativo não suporta o modo escuro a partir de agora e usa uma cor clara na barra de aplicativos. Consegui forçar o conteúdo da barra de status para texto e ícones escuros adicionando a seguinte chave ao meu
Info.plist
:Encontre os outros valores possíveis aqui: https://developer.apple.com/documentation/uikit/uistatusbarstyle
fonte
Versão Objective-c
fonte
Aqui estão algumas dicas e truques que você pode usar no seu aplicativo para oferecer suporte ou ignorar o modo escuro.
Primeira dica: para substituir o estilo ViewController
você pode substituir o estilo de interface do UIViewController
Segunda dica: Adicionando uma chave no info.plist
Simplesmente você pode adicionar uma nova chave
em seu aplicativo info.plist e defina seu valor como Claro ou Escuro. isso substituirá o estilo padrão do aplicativo pelo valor que você fornecer. Você não precisa adicionar overrideUserInterfaceStyle = .light essa linha em cada viewController, apenas uma linha em info.plist.
fonte
Basta adicionar a seguinte chave no seu
info.plist
arquivo:fonte
fonte
Swift 5
Duas maneiras de alternar entre o modo escuro e claro:
fonte
Eu usaria essa solução, pois a propriedade da janela pode ser alterada durante o ciclo de vida do aplicativo. Portanto, a atribuição de "overrideUserInterfaceStyle = .light" precisa ser repetida. UIWindow.appearance () nos permite definir o valor padrão que será usado para objetos UIWindow recém-criados.
fonte
Basta adicionar estas linhas no arquivo info.plist:
Isso forçará o aplicativo a ser executado apenas no modo de luz.
fonte
fonte
Você pode fazer: adicione esta nova chave UIUserInterfaceStyle a Info.plist e defina seu valor como Light. e verifique se o controlador de alerta aparece no modo de luz.
UIUserInterfaceStyle Light Se você forçar o modo claro / escuro em todo o aplicativo, independentemente das configurações do usuário, adicione a chave UIUserInterfaceStyle ao arquivo Info.plist e defina seu valor como Claro ou Escuro.
fonte
Esta pergunta tem muitas respostas. Em vez de usá-la,
info.plist
você pode configurá-la daAppDelegate
seguinte maneira:Teste no Xcode 11.3, iOS 13.3
fonte
Na verdade, acabei de escrever um código que permitirá que você desative globalmente o modo escuro no código sem precisar digitar todos os controladores viw em seu aplicativo. Provavelmente, isso pode ser refinado para optar por excluir classe por classe, gerenciando uma lista de classes. Para mim, o que eu quero é que meus usuários vejam se eles gostam da interface de modo escuro do meu aplicativo e, se não gostam, podem desativá-lo. Isso permitirá que eles continuem usando o modo escuro para o restante de seus aplicativos.
A escolha do usuário é boa (Ahem, olhando para você Apple, é assim que você deveria ter implementado).
Então, como isso funciona é que é apenas uma categoria do UIViewController. Quando carrega, substitui o método viewDidLoad nativo por um que verificará um sinalizador global para ver se o modo escuro está desativado para tudo ou não.
Como é acionado no carregamento do UIViewController, ele deve iniciar automaticamente e desativar o modo escuro por padrão. Se isso não é o que você deseja, é necessário chegar lá cedo e definir o sinalizador, ou apenas definir o sinalizador padrão.
Ainda não escrevi nada para responder ao usuário que liga ou desliga a bandeira. Portanto, este é basicamente um código de exemplo. Se quisermos que o usuário interaja com isso, todos os controladores de exibição precisarão ser recarregados. Não sei como fazer isso de imediato, mas provavelmente enviar alguma notificação será suficiente. Então, neste momento, esse global ativado / desativado para o modo escuro só funcionará na inicialização ou reinicialização do aplicativo.
Agora, não é apenas o suficiente tentar desativar o modo escuro em todos os controladores de exibição MFING em seu enorme aplicativo. Se você estiver usando materiais coloridos, estará completamente desossado. Por mais de 10 anos, entendemos que objetos imutáveis são imutáveis. As cores que você obtém do catálogo de ativos de cores dizem que são UIColor, mas são cores dinâmicas (mutáveis) e serão alteradas embaixo de você conforme o sistema muda do modo escuro para o claro. Isso deveria ser um recurso. Mas é claro que não há um mestre para pedir que essas coisas parem de fazer essa alteração (até onde eu sei agora, talvez alguém possa melhorar isso).
Portanto, a solução está dividida em duas partes:
uma categoria pública no UIViewController que fornece alguns métodos de utilidade e conveniência ... por exemplo, não acho que a apple tenha pensado no fato de que alguns de nós misturam código da web em nossos aplicativos. Como tal, temos folhas de estilo que precisam ser alternadas com base no modo escuro ou claro. Portanto, você precisa criar algum tipo de objeto de folha de estilo dinâmico (o que seria bom) ou apenas perguntar qual é o estado atual (ruim, mas fácil).
essa categoria ao carregar substituirá o método viewDidLoad da classe UIViewController e interceptará as chamadas. Não sei se isso viola as regras da loja de aplicativos. Nesse caso, provavelmente existem outras maneiras de contornar isso, mas você pode considerá-lo uma prova de conceito. Você pode, por exemplo, criar uma subclasse de todos os tipos principais de controladores de exibição e herdar todos os seus próprios controladores de exibição e, em seguida, você pode usar a ideia da categoria DarkMode e entrar nela para forçar a desativação de todos os controladores de exibição. É mais feio, mas não vai quebrar nenhuma regra. Eu prefiro usar o tempo de execução porque é para isso que o tempo de execução foi feito. Então, na minha versão, você apenas adiciona a categoria, define uma variável global para a categoria, quer queira ou não bloquear o modo escuro, e ele fará isso.
Você ainda não saiu da floresta, como mencionado, o outro problema é que o UIColor está basicamente fazendo o que quiser. Portanto, mesmo que seus controladores de tela estejam bloqueando o modo escuro, o UIColor não sabe onde ou como você o está usando, por isso não pode se adaptar. Como resultado, você pode buscá-lo corretamente, mas, em algum momento, ele reverterá em você. Talvez em breve, talvez mais tarde. Portanto, a solução é alocá-lo duas vezes usando um CGColor e transformá-lo em uma cor estática. Isso significa que, se o usuário voltar e reativar o modo escuro na sua página de configurações (a idéia aqui é fazer com que isso funcione para que o usuário tenha controle sobre seu aplicativo além do resto do sistema), todas essas cores estáticas precisa substituir. Até agora, isso resta para outra pessoa resolver. A maneira mais fácil de fazer isso é tornar um padrão que você Ao sair do modo escuro, divida por zero para travar o aplicativo, pois você não pode sair dele e peça ao usuário que o reinicie. Provavelmente isso também viola as diretrizes da loja de aplicativos, mas é uma ideia.
A categoria UIColor não precisa ser exposta, apenas funciona chamando colorNamed: ... se você não disse à classe DarkMode ViewController para bloquear o modo escuro, ela funcionará perfeitamente como esperado. Tentando criar algo elegante em vez do código padrão de sphaghetti da maçã, o que significa que você precisará modificar a maior parte do seu aplicativo se desejar desativar programaticamente o modo escuro ou alterná-lo. Agora não sei se existe uma maneira melhor de alterar programaticamente o Info.plist para desativar o modo escuro conforme necessário. No meu entender, esse é um recurso de tempo de compilação e, depois disso, você é desossado.
Então, aqui está o código que você precisa. Deve aparecer e usar apenas um método para definir o estilo da interface do usuário ou o padrão no código. Você é livre para usar, modificar, fazer o que quiser com isso para qualquer finalidade e não há garantia e não sei se ele passará na loja de aplicativos. Melhorias muito bem-vindas.
Aviso justo Eu não uso o ARC ou qualquer outro método de retenção manual.
Há um conjunto de funções utilitárias que ele usa para fazer a troca de métodos. Arquivo separado. Porém, isso é padrão e você pode encontrar código semelhante em qualquer lugar.
Estou copiando e colando isso em alguns arquivos desde que o q-runtime.h é minha biblioteca reutilizável e isso é apenas parte dela. Se algo não compilar, me avise.
fonte