Hola, soy Miguel y esta vez les traigo un nuevo post.
Índice
AppDelegate pasa a un segundo plano. SceneDelegate se hace cargo
iPadOS 13 se lanzó durante la WWDC 2019. Finalmente, el iPad tiene un sistema operativo separado.
La introducción del soporte de múltiples ventanas en iPadOS es un movimiento revolucionario. Nos permite abrir varias instancias de una aplicación al mismo tiempo.
Esta increíble función es increíblemente útil cuando se trata de ver varios mensajes, correos electrónicos o comparar notas y rutas de mapas. También hará la vida más fácil para los editores de fotos y videos. ¡Creo que la compatibilidad con múltiples ventanas dará lugar a interesantes juegos multijugador muy pronto!
Nuestro objetivo para hoy
- Saber cómo la compatibilidad con múltiples ventanas cambia el ciclo de vida de la aplicación.
- Una vista de pájaro de la
UIScene
API. - Implementar el soporte de múltiples ventanas de dos formas diferentes: con la entrada del usuario y mediante la función de arrastrar y soltar . ¡Desarrollaremos una aplicación iOS y iPadOS basada en la edición de fotos que se usa
CIFilters
en una imagen de Spiderman!
Sin perder más tiempo, comencemos.
Habilitación de la compatibilidad con ventanas múltiples
Es fácil, simplemente acceda al navegador de proyectos, a la configuración general y asegúrese de que la casilla de verificación de soporte de múltiples ventanas esté habilitada.
Una vez hecho esto, la propiedad booleana de soporte de múltiples ventanas se establece en info.plist
. Antes de profundizar en los cambios y la implementación de la API, abordemos el elefante en la sala.
La compatibilidad con varias ventanas no es compatible con la pantalla dividida
El soporte de pantalla dividida se introdujo en iOS 9 para permitir ver diferentes aplicaciones en una ventana, mientras que el soporte de múltiples ventanas permite ver múltiples instancias de una sola aplicación a la vez.
Cambios en AppDelegate y App Lifecycle
La compatibilidad con múltiples ventanas ha traído cambios importantes a la AppDelegate
clase. Ahora es mucho más ligero. Todo el trabajo pesado lo hace la SceneDelegate
clase. Si echas un vistazo a AppDelegate
cualquier proyecto de Xcode de iOS 13, verás que tiene muy pocos métodos.
UIApplicationDelegate
no se notifica cuando la aplicación se activa y viene desde el fondo en iOS 13 y superior.
Un protocolo recientemente introducido UIWindowSceneDelegate
maneja las notificaciones en múltiples ventanas de una aplicación.
Las siguientes propiedades de la UIApplication
clase ahora están en desuso:
statusBarStyle
statusBarHidden
statusBarOrientation
open(_:options:completionHandler:)
keyWindows
Gracias al soporte de múltiples ventanas, ¡las ventanas ahora son escenas! Entonces, al iniciar iPadOS 13, todo lo que ve en el selector de aplicaciones es una escena separada.
API de UIScene: una vista de pájaro
El soporte de múltiples ventanas usa UIScene
API bajo el capó. Las dos clases más esenciales de esta API son:
UIWindowScene
– Este es responsable de administrar múltiples ventanas de una aplicación.UISceneSession
– Esto representa un estado persistente de la escena. VariosUIScene
s almacenan información específica allí, como la función y la información del usuario con la sesión de escena.
NSUserActivity
se utiliza para capturar el estado de una escena. Este estado se utiliza para restaurar una escena utilizada anteriormente o crear una nueva escena con el contenido de visualización actual.
UIWindowSceneDelegate
es implementado por SceneDelegate
. Este protocolo es la nueva entrada a la aplicación, ya que contiene las referencias a UIWindow
.
UIWindow
ahora tiene una referencia al UIWindowScene
. Si está utilizando guiones gráficos, la UIWindow
propiedad se adjuntará automáticamente a la escena.
¿No usas guiones gráficos? Debe adjuntar manualmente el UIWindow
a la escena en la SceneDelegate
clase como se muestra a continuación:
func scene(_ scene: UIScene, willConnectTo session: UISceneSession, options connectionOptions: UIScene.ConnectionOptions) { guard let windowScene = (scene as? UIWindowScene) else { return } window = UIWindow(frame: windowScene.coordinateSpace.bounds) window?.windowScene = windowScene }
Si lo anterior no tiene mucho sentido, la implementación práctica en la siguiente sección seguramente dará más claridad. ¡Vamos a profundizar en!
Nota: Nunca use el soporte de múltiples ventanas para extender la funcionalidad a través de escenas. O mostrando la salida de una escena en otra. Cada escena debe tener la funcionalidad completa de la aplicación.
Implementación
Crearemos una aplicación basada en la edición de fotos que permite ver imágenes con diferentes filtros en diferentes escenas. ¡Es útil cuando necesita determinar qué filtro se ve mejor en la imagen!
Colocación de la interfaz de usuario
El siguiente fragmento agrega un UIImageView
a la pantalla mediante programación:
let VCActivityType = "VCKey" func setupImageView(){ photo = UIImageView(frame: .zero) photo?.translatesAutoresizingMaskIntoConstraints = false view.addSubview(photo!) NSLayoutConstraint.activate([ photo!.topAnchor.constraint(equalTo: view.safeAreaLayoutGuide.topAnchor, constant: marginConstant), photo!.bottomAnchor.constraint(equalTo: self.stackView!.topAnchor, constant: -marginConstant), photo!.leadingAnchor.constraint(equalTo: view.safeAreaLayoutGuide.leadingAnchor, constant: marginConstant), photo!.trailingAnchor.constraint(equalTo: view.safeAreaLayoutGuide.trailingAnchor, constant: -marginConstant), ]) }
Crear una nueva escena al hacer clic en el usuario
Para crear una nueva escena de la aplicación, agregue el siguiente código al presionar un botón:
let activity = NSUserActivity(activityType: VCActivityType) UIApplication.shared.requestSceneSessionActivation(nil, userActivity: activity, options: nil, errorHandler: nil)
requestSceneSessionActivation
es responsable de activar una escena existente o crear una nueva escena.
Aquí hay una captura de pantalla de la aplicación iPad.
Esto fue sencillo. Ahora, vayamos al mecanismo de arrastrar y soltar y veamos qué se debe hacer allí.
Crear una nueva escena usando arrastrar y soltar
Podemos hacer uso de la arrastrar y soltar API pasando el NSUserActivity
interior de los DragItem
‘s NSItemProvider
.
Cuando arrastra un componente de la interfaz de usuario, el sistema proporciona automáticamente puntos de colocación (normalmente en los bordes de la pantalla). Dejar caer en esos puntos conduce a la creación de una nueva escena.
Para crear una nueva escena usando arrastrar y soltar del UIImageView
, debemos encargarnos de tres cosas:
1. Conformación al UIDragInteractionDelegate
Necesitamos configurar la interacción de arrastre en el UIImageView
.
photo?.isUserInteractionEnabled = true photo?.addInteraction(UIDragInteraction(delegate: self))
2. Implementación de la función de arrastre
En el fragmento de abajo, pasamos imageView
al NSItemProvider
y registramos NSUserActivity
con él.
extension ViewController : UIDragInteractionDelegate{ func dragInteraction(_ interaction: UIDragInteraction, itemsForBeginning session: UIDragSession) -> [UIDragItem] { if let imageView = interaction.view as? UIImageView { guard let image = imageView.image else { return [] } let provider = NSItemProvider(object: image) let userActivity = NSUserActivity(activityType: VCActivityType) provider.registerObject(userActivity, visibility: .all) let item = UIDragItem(itemProvider: provider) return [item] } return [] } }
3. Agregar ActivityType en el Info.plist
Nuestra aplicación para iPad ahora está lista para la compatibilidad con múltiples ventanas mediante la función de arrastrar.
Hemos establecido CIFilters
en las imágenes para comparar la misma imagen en diferentes filtros.
El soporte de ventanas múltiples también es compatible con Catalizador de Mac.
Conclusión
¡Eso es todo! Vimos cómo AppDelegate
pasa a un segundo plano y permite SceneDelegate
hacer el levantamiento de pesas principal al manejar la mayoría de los eventos del ciclo de vida.
Finalmente, implementamos el soporte de múltiples ventanas y vimos nuestro amigable vecindario en diferentes tonos en diferentes escenas.
El código fuente completo de este artículo está disponible en GitHub .
En las siguientes partes, nos ocuparemos de la restauración del estado y la sincronización de datos en múltiples ventanas en iPadOS.
Gracias por leer.
Añadir comentario