Varias ventanas para iPad
iOS 13 ahora admite ventanas en paralelo para la misma aplicación en iPad. Esto permite nuevas experiencias e interacciones de arrastrar y colocar entre ventanas. En este documento, se muestra cómo configurar la aplicación para que admita esta característica y se presentan estas nuevas características.
Configuración del proyecto
Para configurar el proyecto para varias ventanas, modifique el archivo info.plist
para declarar NSUserActivityTypes
e indicar a iOS que la aplicación controlará las actividades de este tipo y UIApplicationSceneManifest
para habilitar varias ventanas UIApplicationSupportsMultipleScenes
y UISceneConfigurations
para asociar la escena a un guión gráfico.
<key>NSUserActivityTypes</key>
<array>
<string>com.xamarin.Gallery.openDetail</string>
</array>
<key>UIApplicationSceneManifest</key>
<dict>
<key>UIApplicationSupportsMultipleScenes</key>
<true/>
<key>UISceneConfigurations</key>
<dict>
<key>UIWindowSceneSessionRoleApplication</key>
<array>
<dict>
<key>UISceneConfigurationName</key>
<string>Default Configuration</string>
<key>UISceneDelegateClassName</key>
<string>SceneDelegate</string>
<key>UISceneStoryboardFile</key>
<string>Main</string>
</dict>
</array>
</dict>
</dict>
Apertura de varias ventanas
Con la aplicación abierta y en ejecución en un iPad, hay varias maneras de abrir varias ventanas de esa aplicación que iOS controla de manera predeterminada.
- Exponer la aplicación: pulse el icono de la aplicación en el dock para entrar en este modo mientras la aplicación está abierta.
- Deslizar hacia arriba: arrastre el icono de la aplicación desde el dock sobre la parte superior de la aplicación en ejecución para tener una ventana flotante.
- Pantalla dividida: arrastre el icono de la aplicación desde el dock hasta el borde de la pantalla del iPad para crear una nueva ventana en paralelo.
Hay interacciones adicionales para entrar en modo de varias ventanas en la aplicación.
Arrastrar desde la aplicación: use una interacción de arrastre dentro de la aplicación para iniciar un nuevo elemento NSUserActivity
del mismo modo que al arrastrar el icono de la aplicación en ejemplos anteriores.
Al usar una interacción de arrastrar y colocar, se crea un elemento NSUserActivity
y se asocian los datos que se van a pasar a la nueva ventana que está solicitando a iOS que abra.
public UIDragItem [] GetItemsForBeginningDragSession (UICollectionView collectionView, IUIDragSession session, NSIndexPath indexPath)
{
var selectedPhoto = GetPhoto (indexPath);
var userActivity = selectedPhoto.OpenDetailUserActivity ();
var itemProvider = new NSItemProvider (UIImage.FromFile (selectedPhoto.Name));
itemProvider.RegisterObject (userActivity, NSItemProviderRepresentationVisibility.All);
var dragItem = new UIDragItem (itemProvider) {
LocalObject = selectedPhoto
};
return new [] { dragItem };
}
En el código anterior, el objeto de modelo selectedPhoto
tiene un método para devolver un elemento NSUserActivity
llamado OpenDetailUserActivity()
. Una vez completado el gesto de arrastre, UIDragItem
presentará el elemento userActivity
mediante NSItemProvider
.
Acciones explícitas: los gestos de usuario en botones o vínculos ofrecen la posibilidad de abrir una nueva ventana.
Desde el elemento UIApplication
, puede iniciar un nuevo elemento UISceneSession
mediante una llamada a RequestSceneSessionActivation
. Si ya existe una escena existente, debe usarla. De manera predeterminada, se creará una nueva escena automáticamente.
public void ItemSelected(UICollectionView collectionView, NSIndexPath indexPath)
{
var userActivity = selectedPhoto.OpenDetailUserActivity ();
UIApplication.SharedApplication.RequestSceneSessionActivation(
sceneSession: null,
userActivity: userActivity,
options: null,
errorHandler: null
);
}
En este ejemplo, userActivity
es el único valor que se pasa al método RequestSceneSessionActivation
para abrir una nueva ventana de la aplicación en función de una acción de usuario explícita; en este caso, un controlador ItemSelected
de un elemento UICollectionView
.