次の方法で共有


iPad での複数のウィンドウ

iOS 13 では、iPad 上の同一アプリの横並びウィンドウがサポートされるようになりました。 これにより、新しいエクスペリエンスとウィンドウ間のドラッグ アンド ドロップ操作が可能になります。 このドキュメントでは、この機能をサポートするようにアプリケーションをセットアップする方法を示し、これらの新機能を紹介します。

プロジェクト構成

複数ウィンドウ用にプロジェクトを構成するには、info.plist を修正してアプリがこの種類のアクティビティを扱うことを iOS に伝達する NSUserActivityTypes を宣言し、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 が既定で処理する複数ウィンドウを開くための方法がいくつかあります。

  • App Expose - アプリが開いている間に、ドックのアプリ アイコンをタップしてこのモードに入ります。
  • Slide Over - ドックからアプリ アイコンを実行中のアプリの上にドラッグして、フローティング ウィンドウを表示します。
  • Split Screen - ドックからアプリ アイコンを 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 を返すメソッドがあります。 ドラッグ ジェスチャが完了すると、UIDragItemNSItemProvider 経由で userActivity を提示します。

明示的なアクション - ボタンやリンク上のユーザー ジェスチャにより、新しいウィンドウを開く機能が提供されます。

RequestSceneSessionActivation を呼び出すことで、UIApplication から新しい 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 ハンドラーです。