1
0

More than 1 year has passed since last update.

iOS強化月間 - iOSアプリ開発の知見を共有しよう -

Unity as a Library(UaaL)でSwiftUIを使う際のビュー位置ズレ問題の解決法

Posted at

Unity as a Library(UaaL)でSwiftUIを使う際のビュー位置ズレ問題の解決法

はじめに

Unity as a Library(UaaL)とSwiftUIの統合は多くの可能性を開きますが、この組み合わせはいくつかの困難ももたらします。この記事では、特にビューの位置がずれるという問題とその解決法に焦点を当てます。

我々がどのような状況でどのような問題にあったのか

UnityをiOSアプリケーションに組み込む際、SwiftUIを用いたレイアウトとの統合が必要でした。しかし、SwiftUIの画面にUnityのビューを埋め込むと、そのビューが画面の上部に徐々にずれていく問題に直面しました。

使用した技術

  • Unity as a Library(UaaL)
  • SwiftUI
  • UIKit

その際のコード

問題が発生したのは、SwiftUIとUnity as a Library(UaaL)を組み合わせたプロジェクトでした。具体的には、SwiftUIのUIViewControllerRepresentableプロトコルを使って、Unityのビューを表示しています。

SwiftUIのWrapper

まず、SwiftUIでUnityのビューをラップするためのUnityHostingControllerを作成しました。

struct UnityHostingController: UIViewControllerRepresentable {
    func makeUIViewController(context: Context) -> UIViewController {
        return ViewController()
    }
}

AppDelegateでのUnity初期化

次に、AppDelegateでUnityを初期化しています。

class AppDelegate: UIResponder, UIApplicationDelegate {
    func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey : Any]? = nil) -> Bool {
        Unity.shared.application(application, didFinishLaunchingWithOptions: launchOptions)
        return true
    }
}

UIKitのViewController

そして、Unityのビューを含むViewControllerを以下のように作成しました。

class ViewController: UIViewController {
    private let unityView = Unity.shared.view
    
    override func loadView() {
        super.loadView()
        view.addSubview(unityView)
        NSLayoutConstraint.activate([
            unityView.topAnchor.constraint(equalTo: view.topAnchor),
            unityView.leftAnchor.constraint(equalTo: view.leftAnchor),
            unityView.rightAnchor.constraint(equalTo: view.rightAnchor),
            unityView.bottomAnchor.constraint(equalTo: view.bottomAnchor),
        ])
    }
}

この設定で、Unityのビューが何らかの理由で徐々に上にずれていく問題が発生しました。

解決方法

問題の根本的な原因は、translatesAutoresizingMaskIntoConstraints プロパティがデフォルトで true に設定されていたことでした。このプロパティを false に設定することで、ビューの位置が正しくなりました。

解決のコード

class ViewController: UIViewController {
    private let unityView = Unity.shared.view
    
    override func loadView() {
        super.loadView()
        unityView.translatesAutoresizingMaskIntoConstraints = false
        // ...
    }
}

解決方法の解説(正確ではない可能性があります)

translatesAutoresizingMaskIntoConstraintsは、ビューのAuto Layout制約がどのように適用されるかを制御します。このプロパティが true の場合、ビューのframeが直接設定されると、それがAuto Layout制約として解釈され、期待しないレイアウトになる可能性があります。

まとめ

Unity as a Library(UaaL)とSwiftUIを統合する際にビューの位置がずれる問題は、translatesAutoresizingMaskIntoConstraints プロパティの設定に注意することで解決可能です。この記事が、同じような問題に直面している開発者の助けになれば幸いです。

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0