まとめ
UIHostingControllerではviewDidLoadは呼ばれないので注意しましょう。
解説
class CustomViewHostingViewController: UIHostingController<CustomView> {
required init?(coder: NSCoder) {
fatalError()
}
override init(rootView: CustomView) {
super.init(rootView: rootView)
}
convenience init() {
let customView = CustomView()
self.init(rootView: customView)
self.view.backgroundColor = .clear
}
override func viewDidLoad() {
super.viewDidLoad()
print("*** didLoad: \(view.backgroundColor)")
}
override func viewWillLayoutSubviews() {
super.viewWillLayoutSubviews()
print("*** willLayout: \(view.backgroundColor)")
}
override func viewDidLayoutSubviews() {
super.viewDidLayoutSubviews()
print("*** didLayout: \(view.backgroundColor)")
}
override func viewWillAppear(_ animated: Bool) {
super.viewWillAppear(animated)
print("*** willAppear: \(view.backgroundColor)")
}
override func viewDidAppear(_ animated: Bool) {
super.viewDidAppear(animated)
print("*** didappear: \(view.backgroundColor)")
}
}
コンソールログは以下の通り
*** willAppear: Optional(UIExtendedGrayColorSpace 0 0)
*** willLayout: Optional(UIExtendedGrayColorSpace 0 0)
*** didLayout: Optional(UIExtendedGrayColorSpace 0 0)
*** willLayout: Optional(UIExtendedGrayColorSpace 0 0)
*** didLayout: Optional(UIExtendedGrayColorSpace 0 0)
*** didappear: Optional(UIExtendedGrayColorSpace 0 0)
ドキュメント
https://developer.apple.com/documentation/swiftui/uihostingcontroller
ドキュメントには
Use the hosting controller like you would any other view controller, by presenting it or embedding it as a child view controller in your interface.
って書いてあるから、当然 viewDidLoad
も呼ばれるものかと思いきや、呼ばれず、viewDidLoad
に初期値をセットしても反映されないのでした。
initで初期値を設定して無事透明な背景色を表示しました。
サンプルプロジェクト -> https://github.com/justin999/SwiftUIInVC