iOS 移行ガイド
このページでは、Compose Multiplatform ライブラリをプロジェクトで新しいバージョン、特に1.7.0以降にアップグレードする際のiOSに関する考慮事項について説明します。
Compose Multiplatform 1.6.11 から 1.7.0
UIKitView と UIKitViewController から background パラメータが削除されました
非推奨の UIKitView および UIKitViewController API には background パラメータがありましたが、新しいAPIにはありません。 このパラメータは冗長と見なされ、削除されました。
- 新しいインスタンスの相互運用ビューの背景を設定する必要がある場合は、
factoryパラメータを使用して設定できます。 - 背景を更新可能にする必要がある場合は、対応するコードを
updateラムダに記述してください。
タッチやジェスチャーが期待通りに動作しなくなる可能性があります
新しいデフォルトのタッチ動作では、タッチが相互運用ビュー向けか、そのビューのComposeコンテナ向けかを判断するために遅延を使用します。ユーザーは、相互運用ビューがタッチを受け取る前に少なくとも150ミリ秒間静止している必要があります。
Compose Multiplatform に従来通りタッチを処理させる必要がある場合は、新しい実験的な UIKitInteropProperties コンストラクタを検討してください。 これには interactionMode パラメータがあり、これを UIKitInteropInteractionMode.NonCooperative に設定すると、Compose がタッチを相互運用ビューに直接転送するようになります。
このコンストラクタは実験的とされています。なぜなら、最終的には相互運用ビューのインタラクション可能性を単一のブール値フラグで記述することを意図しているためです。 interactionMode パラメータで明示的に記述されている動作は、将来的に自動的に導出される可能性が高いです。
accessibilityEnabled が isNativeAccessibilityEnabled に置き換えられ、デフォルトでオフになりました
古い UIKitView および UIKitViewController コンストラクタの accessibilityEnabled パラメータは、UIKitInteropProperties.isNativeAccessibilityEnabled プロパティとして利用できるよう移動され、名前が変更されました。 また、デフォルトでは false に設定されています。
isNativeAccessibilityEnabled プロパティは、結合されたComposeサブツリーをネイティブのアクセシビリティ解決で汚染します。 そのため、相互運用ビューの豊富なアクセシビリティ機能(Webビューなど)が必要な場合を除き、true に設定することは推奨されません。
このプロパティとそのデフォルト値の根拠については、UIKitInteropProperties クラスのコード内ドキュメントを参照してください。
onResize パラメータが削除されました
古い UIKitView および UIKitViewController コンストラクタの onResize パラメータは、rect 引数に基づいてカスタムフレームを設定しましたが、Compose レイアウト自体には影響を与えなかったため、直感的に使用できませんでした。 さらに、onResize パラメータのデフォルト実装は、相互運用ビューのフレームを適切に設定する必要があり、ビューを適切にクリッピングするための実装詳細が含まれていました。
onResize なしで対処する方法:
- 相互運用ビューのフレーム変更に反応する必要がある場合、以下が可能です:
- 相互運用
UIViewのlayoutSubviewsをオーバーライドする - 相互運用
UIViewControllerのviewDidLayoutSubviewsをオーバーライドする - または
ModifierチェーンにonGloballyPositionedを追加する。
- 相互運用
- 相互運用ビューのフレームを設定する必要がある場合は、対応するComposeモディファイア、例えば
size、fillMaxSizeなどを使用してください。
いくつかの onReset 使用パターンが無効になりました
非nullの onReset ラムダを remember { UIView() } と一緒に使用するのは正しくありません。
次のコードを考慮してください:
val view = remember { UIView() }
UIKitView(factory = { view }, onReset = { /* ... */ })UIKitView がコンポジションに入るとき、factory または onReset のいずれかが呼び出され、両方が呼び出されることはありません。 そのため、onReset がnullでない場合、記憶された view は画面に表示されているものと異なる可能性があります: コンポーザブルはコンポジションを離れ、ビューのインスタンスを残すことができ、そのインスタンスは factory を使用して新しいものを割り当てるのではなく、onReset でリセットされた後に再利用されます。
このような間違いを避けるために、コンストラクタで onReset の値を指定しないでください。 関数がコンポジションに入ったコンテキストに基づいて、相互運用ビュー内からコールバックを実行する必要がある場合があります: この場合、onReset で update を使用して、コールバックをビュー内に保存することを検討してください。
