适用于 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 方法的唯一值,以便根据显式用户操作打开应用程序的新窗口;在本例中为 UICollectionViewItemSelected 处理程序。