Una gran parte de mi aplicación consiste en vistas web para proporcionar una funcionalidad que aún no está disponible a través de implementaciones nativas. El equipo web no tiene planes de implementar un tema oscuro para el sitio web. Como tal, mi aplicación se verá un poco mitad / mitad con soporte para Modo Oscuro en iOS 13.
¿Es posible optar por no admitir el modo oscuro de modo que nuestra aplicación siempre muestre el modo claro para que coincida con el tema del sitio web?
ios
ios13
ios-darkmode
SeanR
fuente
fuente
UIUserInterfaceStyle
aLight
en su info.plist. Ver developer.apple.com/library/archive/documentation/General/…Respuestas:
Primero, aquí está la entrada de Apple relacionada con la opción de salir del modo oscuro. El contenido de este enlace está escrito para Xcode 11 y iOS 13 :
Esta sección se aplica al uso de Xcode 11
Enfoque n. ° 1
Use la siguiente clave en su archivo info.plist :
Y asígnele un valor de
Light
.El XML para la
UIUserInterfaceStyle
tarea:Enfoque n. ° 2
Puede establecer
overrideUserInterfaceStyle
contra lawindow
variable de la aplicación .Dependiendo de cómo se creó su proyecto, esto puede estar en el
AppDelegate
archivo o en elSceneDelegate
.Documentación de Apple para overrideUserInterfaceStyle
Cómo se verá el código anterior en Xcode 11:
Esta sección se aplica al uso de Xcode 10.x
Si está utilizando Xcode 11 para su envío, puede ignorar todo lo que se encuentra debajo de esta línea.
Dado que la API relevante no existe en iOS 12, obtendrá errores al intentar utilizar los valores proporcionados anteriormente:
Para poner
overrideUserInterfaceStyle
en suUIViewController
Esto se puede manejar en Xcode 10 probando la versión del compilador y la versión de iOS:
Puede modificar el fragmento anterior para que funcione con toda la aplicación para Xcode 10, agregando el siguiente código a su
AppDelegate
archivo.Sin embargo, la configuración de plist fallará al usar Xcode versión 10.x:
Gracias a @Aron Nelson , @Raimundas Sakalauskas , @NSLeader y rmaddy por mejorar esta respuesta con sus comentarios.
fuente
overrideUserInterfaceStyle
en elviewDidLoad
de todos los controladores de vista, se puede establecer una vez en la ventana principal de la aplicación. Mucho más fácil si quieres que toda la aplicación se comporte de una manera.#if compiler(>=5.1)
lugarresponds(to:)
ysetValue
De acuerdo con la sesión de Apple en "modo oscuro de aplicación en iOS" ( https://developer.apple.com/videos/play/wwdc2019/214/ a partir de las 31:13), es posible fijar
overrideUserInterfaceStyle
aUIUserInterfaceStyleLight
oUIUserInterfaceStyleDark
en cualquier controlador de vista o vista , que se utilizará entraitCollection
cualquier subvista o controlador de vista.Como ya se ha mencionado por SeanR, se puede establecer
UIUserInterfaceStyle
queLight
oDark
en el archivo plist de su aplicación para cambiar esto para toda la aplicación.fuente
Si no está utilizando Xcode 11 o posterior (i, e iOS 13 o posterior SDK), su aplicación no ha optado automáticamente por el modo oscuro. Por lo tanto, no hay necesidad de salir del modo oscuro.
Si está utilizando Xcode 11 o posterior, el sistema ha habilitado automáticamente el modo oscuro para su aplicación. Hay dos enfoques para deshabilitar el modo oscuro según su preferencia. Puede deshabilitarlo por completo o deshabilitarlo para cualquier ventana, vista o controlador de vista específico.
Desactiva el modo oscuro por completo para tu aplicación
Puede deshabilitar el modo oscuro al incluir la
UIUserInterfaceStyle
clave con un valor comoLight
en el archivo Info.plist de su aplicación. Esto ignora las preferencias del usuario y siempre aplica una apariencia ligera a su aplicación.Deshabilitar el modo oscuro para ventana, vista o controlador de vista
Puede forzar su interfaz para que siempre aparezca en un estilo claro u oscuro configurando el
overrideUserInterfaceStyle
propiedad de la ventana, vista o controlador de vista apropiado.Ver controladores:
Puntos de vista:
Ventana:
Lea más aquí: Cómo elegir un estilo de interfaz específico para su aplicación iOS
fuente
********** La forma más fácil para Xcode 11 y superior ***********
Agregue esto a info.plist antes
</dict></plist>
fuente
Creo que he encontrado la solución. Inicialmente lo ensamblé desde UIUserInterfaceStyle - Lista de propiedades de información y UIUserInterfaceStyle - UIKit , pero ahora lo he encontrado documentado en Elegir un estilo de interfaz específico para su aplicación iOS .
En su
info.plist
, establezcaUIUserInterfaceStyle
( Estilo de interfaz de usuario ) en 1 (UIUserInterfaceStyle.light
).EDITAR: Según la respuesta de dorbeetle,
UIUserInterfaceStyle
puede ser una configuración más adecuada paraLight
.fuente
[UIInterfaceStyle] '2' is not a recognized value for UIUserInterfaceStyle. Defaulting to Light.
La respuesta anterior funciona si desea inhabilitar toda la aplicación. Si está trabajando en la biblioteca que tiene una interfaz de usuario y no tiene el lujo de editar .plist, también puede hacerlo a través del código.
Si está compilando contra iOS 13 SDK, simplemente puede usar el siguiente código:
Rápido:
Obj-C:
SIN EMBARGO , si desea que su código también se compile con iOS 12 SDK (que en este momento sigue siendo el último SDK estable), debe recurrir al uso de selectores. Código con selectores:
Swift (XCode mostrará advertencias para este código, pero esa es la única forma de hacerlo por ahora, ya que la propiedad no existe en el SDK 12, por lo tanto, no se compilará):
Obj-C:
fuente
overrideUserInterfaceStyle
pertenece la propiedad .Última actualización-
Si está utilizando Xcode 10.x, el valor predeterminado
UIUserInterfaceStyle
eslight
para iOS 13.x. Cuando se ejecuta en un dispositivo iOS 13, solo funcionará en modo ligero.No es necesario agregar explícitamente la
UIUserInterfaceStyle
clave en el archivo Info.plist, agregarlo dará un error cuando valide su aplicación, diciendo:Solo agregue la
UIUserInterfaceStyle
clave en el archivo Info.plist cuando use Xcode 11.x.fuente
Si va a agregar
UIUserInterfaceStyle
clave al archivo plist, posiblemente Apple rechazará la versión de lanzamiento como se menciona aquí: https://stackoverflow.com/a/56546554/7524146 De todos modos, es molesto decirle explícitamente a cada ViewControllerself.overrideUserInterfaceStyle = .light
. Pero puede usar esta paz de código una vez para suwindow
objeto raíz :Solo tenga en cuenta que no puede hacer esto adentro
application(application: didFinishLaunchingWithOptions:)
porque este selector no responderátrue
en esa etapa temprana. Pero puedes hacerlo más tarde. Es super fácil si está utilizando la costumbreAppPresenter
oAppRouter
clase en su aplicación en lugar de iniciar la interfaz de usuario en el AppDelegate automáticamente.fuente
Puede desactivar el Modo oscuro en toda la aplicación en Xcode 11:
Añadir abajo como
Info.plist se verá a continuación ...
fuente
- Para toda la aplicación (ventana):
Puedes obtener la ventana de
SceneDelegate
- Para un solo ViewController:
Se puede establecer cualquier
viewController
, incluso dentro de la viewController se auto- Para una sola vista:
Se puede establecer cualquier
view
, incluso dentro de la vista autoEs posible que deba usarlo
if #available(iOS 13.0, *) { ,,, }
si admite versiones anteriores de iOS.fuente
Además de otras respuestas, según tengo entendido lo siguiente, solo necesita prepararse para el modo Oscuro al compilar contra iOS 13 SDK (usando XCode 11).
Enlace
fuente
Sí, puede omitir agregando el siguiente código en viewDidLoad:
fuente
Mi aplicación no admite el modo oscuro a partir de ahora y utiliza un color de barra de aplicación claro. Pude forzar el contenido de la barra de estado a texto e iconos oscuros al agregar la siguiente clave a mi
Info.plist
:Encuentre los otros valores posibles aquí: https://developer.apple.com/documentation/uikit/uistatusbarstyle
fuente
Versión objetiva-c
fuente
Aquí hay algunos consejos y trucos que puede usar en su aplicación para apoyar o evitar el modo oscuro.
Primer consejo: para anular el estilo ViewController
puede anular el estilo de interfaz de UIViewController
Segundo consejo: agregar una clave en info.plist
Simplemente puedes agregar una nueva clave
en su aplicación info.plist y establezca su valor en Claro u Oscuro. esto anulará el estilo predeterminado de la aplicación al valor que proporcione. No tiene que agregar overrideUserInterfaceStyle = .light esta línea en cada viewController, solo una línea en info.plist, eso es todo.
fuente
Simplemente agregue la siguiente clave en su
info.plist
archivo:fuente
fuente
Swift 5
Dos formas de cambiar el modo oscuro al claro:
fuente
Usaría esta solución ya que la propiedad de la ventana puede cambiarse durante el ciclo de vida de la aplicación. Por lo tanto, se debe repetir la asignación de "overrideUserInterfaceStyle = .light" UIWindow.appearance () nos permite establecer el valor predeterminado que se usará para los objetos UIWindow recién creados.
fuente
Simplemente agregue estas líneas en el archivo info.plist:
Esto obligará a la aplicación a ejecutarse solo en modo ligero.
fuente
fuente
Puede hacerlo: agregue esta nueva clave UIUserInterfaceStyle a Info.plist y establezca su valor en Light. y verifique que el controlador de alerta aparezca con el modo de luz.
UIUserInterfaceStyle Light Si está forzado en modo claro / oscuro en toda su aplicación, independientemente de la configuración del usuario, agregue la clave UIUserInterfaceStyle a su archivo Info.plist y configure su valor en Claro u Oscuro.
fuente
Esta pregunta tiene muchas respuestas, en lugar de usarla
info.plist
puedes configurarlaAppDelegate
así:Prueba en Xcode 11.3, iOS 13.3
fuente
En realidad, acabo de escribir un código que le permitirá optar globalmente por el modo oscuro en el código sin tener que usar putz con cada controlador viw de su aplicación. Esto probablemente se puede refinar para optar por una clase por clase administrando una lista de clases. Para mí, lo que quiero es que mis usuarios vean si les gusta la interfaz de modo oscuro para mi aplicación, y si no les gusta, pueden desactivarla. Esto les permitirá continuar usando el modo oscuro para el resto de sus aplicaciones.
La elección del usuario es buena (ejem, mirándote Apple, así es como deberías haberlo implementado).
Entonces, cómo funciona esto es que es solo una categoría de UIViewController. Cuando se carga, reemplaza el método viewDidLoad nativo con uno que verificará un indicador global para ver si el modo oscuro está desactivado para todo o no.
Debido a que se activa al cargar UIViewController, debería iniciarse automáticamente y deshabilitar el modo oscuro de forma predeterminada. Si esto no es lo que quieres, entonces debes llegar temprano a algún lugar y configurar la bandera, o simplemente configurar la bandera predeterminada.
Todavía no he escrito nada para responder al usuario que activa o desactiva la bandera. Entonces este es básicamente un código de ejemplo. Si queremos que el usuario interactúe con esto, todos los controladores de vista deberán volver a cargarse. No sé cómo hacer eso de forma espontánea, pero probablemente enviar alguna notificación será suficiente. Así que en este momento, este encendido / apagado global para el modo oscuro solo funcionará al iniciar o reiniciar la aplicación.
Ahora, no es suficiente tratar de desactivar el modo oscuro en cada MFING viewController en su gran aplicación. Si está utilizando activos de color, está completamente deshuesado. Por más de 10 años hemos entendido que los objetos inmutables son inmutables. Los colores que obtiene del catálogo de activos de color dicen que son UIColor pero son colores dinámicos (mutables) y cambiarán debajo de usted a medida que el sistema cambie del modo oscuro al claro. Se supone que eso es una característica. Pero, por supuesto, no hay una palanca maestra para pedirle a estas cosas que dejen de hacer este cambio (por lo que sé en este momento, tal vez alguien pueda mejorar esto).
Entonces la solución está en dos partes:
una categoría pública en UIViewController que ofrece algunos métodos de utilidad y conveniencia ... por ejemplo, no creo que Apple haya pensado en el hecho de que algunos de nosotros mezclamos código web en nuestras aplicaciones. Como tal, tenemos hojas de estilo que deben alternarse según el modo oscuro o claro. Por lo tanto, necesita construir algún tipo de objeto de hoja de estilo dinámico (lo que sería bueno) o simplemente preguntar cuál es el estado actual (malo pero fácil).
esta categoría cuando se carga reemplazará el método viewDidLoad de la clase UIViewController e interceptará llamadas. No sé si eso rompe las reglas de la tienda de aplicaciones. Si lo hace, probablemente hay otras formas de evitarlo, pero puede considerarlo una prueba de concepto. Por ejemplo, puede crear una subclase de todos los tipos de controladores de vista principales y hacer que todos sus propios controladores de vista hereden de ellos, y luego puede usar la idea de categoría DarkMode y llamarla para forzar la exclusión voluntaria de todos sus controladores de vista. Es más feo pero no va a romper ninguna regla. Prefiero usar el tiempo de ejecución porque para eso se hizo el tiempo de ejecución. Entonces, en mi versión, solo agrega la categoría, establece una variable global en la categoría para saber si desea o no bloquear el modo oscuro, y lo hará.
Todavía no está fuera de peligro, como se mencionó, el otro problema es que UIColor básicamente hace lo que quiera. Entonces, incluso si sus controladores de vista están bloqueando el modo oscuro, UIColor no sabe dónde o cómo lo está utilizando, por lo que no puede adaptarse. Como resultado, puede buscarlo correctamente, pero luego volverá sobre usted en algún momento en el futuro. Tal vez pronto tal vez más tarde. Entonces, la forma de evitarlo es asignándolo dos veces usando un CGColor y convirtiéndolo en un color estático. Esto significa que si su usuario regresa y vuelve a habilitar el modo oscuro en su página de configuración (la idea aquí es hacer que esto funcione para que el usuario tenga control sobre su aplicación más allá del resto del sistema), todos esos colores estáticos necesita ser reemplazado Hasta ahora, esto queda para que alguien más lo resuelva. La manera más fácil de hacerlo es establecer un valor predeterminado que optando por salir del modo oscuro, divida entre cero para bloquear la aplicación, ya que no puede salir de ella y dígale al usuario que simplemente la reinicie. Eso probablemente también viola las pautas de la tienda de aplicaciones, pero es una idea.
La categoría UIColor no necesita exponerse, solo funciona llamando a colorNamed: ... si no le dijo a la clase DarkMode ViewController que bloquee el modo oscuro, funcionará perfectamente como se esperaba. Intentar hacer algo elegante en lugar del código estándar de sphaghetti de Apple, lo que significa que tendrá que modificar la mayor parte de su aplicación si desea optar programáticamente por el modo oscuro o alternarlo. Ahora no sé si hay una mejor manera de alterar programáticamente Info.plist para desactivar el modo oscuro según sea necesario. Hasta donde tengo entendido, esa es una característica de tiempo de compilación y después de eso estás deshuesado.
Así que aquí está el código que necesitas. Debe aparecer y usar el único método para establecer el estilo de la interfaz de usuario o establecer el valor predeterminado en el código. Usted es libre de usar, modificar, hacer lo que quiera con esto para cualquier propósito y no se otorga ninguna garantía y no sé si pasará la tienda de aplicaciones. Mejoras muy bienvenidas.
Advertencia justa No uso ARC ni ningún otro método de retención.
Hay un conjunto de funciones de utilidad que esto usa para realizar el intercambio de métodos. Archivo separado. Sin embargo, esto es algo estándar y puedes encontrar código similar en cualquier lugar.
Estoy copiando y pegando esto de un par de archivos ya que q-runtime.h es mi biblioteca reutilizable y esto es solo una parte de ella. Si algo no se compila, hágamelo saber.
fuente