适用于 iPad 的多个窗口
iOS 13 现在支持适用于 iPad 上的同一应用的并行窗口。 这一支持实现了窗口之间的新体验和拖放交互。 本文档说明了如何设置应用程序以支持此功能,还介绍了这些新功能。
项目配置
要为多个窗口配置项目,请修改 info.plist
以声明 NSUserActivityTypes
,告诉 iOS 你的应用将处理这种类型的活动,修改 UIApplicationSceneManifest
以为多个窗口启用 UIApplicationSupportsMultipleScenes
,并修改 UISceneConfigurations
以将场景与情节提要相关联。
<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>
打开多个窗口
当应用在 iPad 上打开并运行时,有几种方法可以打开该应用的多个窗口,这些窗口被 iOS 处理成默认窗口。
- 应用公开 - 当应用打开时,点击停靠栏中的应用图标即可进入此模式。
- 侧拉 - 将应用图标从停靠栏拖动到正在运行的应用顶部可获得浮动窗口。
- 分屏 - 将应用图标从停靠栏拖动到 iPad 屏幕边缘可创建新的并排窗口。
应用程序中还提供了进入多窗口模式的其他交互。
从应用中拖动 - 在应用中使用拖动交互来启动新的 NSUserActivity
,就像在前面的示例中拖动应用图标一样。
使用拖放交互时,将创建一个 NSUserActivity
数据并会将要传递的数据关联到你要求 iOS 打开的新窗口。
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 };
}
在上面的代码中,selectedPhoto
模型对象中有一个方法可返回调用 OpenDetailUserActivity()
的 NSUserActivity
。 拖动手势完成后,UIDragItem
将通过 NSItemProvider
显示 userActivity
。
显式操作 - 按钮或链接上的用户手势可以打开一个新窗口。
在 UIApplication
中,可通过调用 RequestSceneSessionActivation
启动新的 UISceneSession
。 如果现有场景已存在,则应使用该场景。 默认情况下,系统将为你创建新的场景。
public void ItemSelected(UICollectionView collectionView, NSIndexPath indexPath)
{
var userActivity = selectedPhoto.OpenDetailUserActivity ();
UIApplication.SharedApplication.RequestSceneSessionActivation(
sceneSession: null,
userActivity: userActivity,
options: null,
errorHandler: null
);
}
在此示例中,userActivity
是传递给 RequestSceneSessionActivation
方法的唯一值,以便根据显式用户操作打开应用程序的新窗口;在本例中为 UICollectionView
的 ItemSelected
处理程序。