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
を返すメソッドがあります。 ドラッグ ジェスチャが完了すると、UIDragItem
は NSItemProvider
経由で 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
メソッドに渡される唯一の値であり、この場合 UICollectionView
の ItemSelected
ハンドラーです。