gpt4 book ai didi

SwiftUI 在设备旋转时重绘 View 组件

转载 作者:行者123 更新时间:2023-12-03 07:34:54 33 4
gpt4 key购买 nike

如何在 SwiftUI 中检测设备旋转并重新绘制 View 组件?

当第一个出现时,我有一个 @State 变量初始化为 UIScreen.main.bounds.width 的值。但是当设备方向改变时,这个值不会改变。当用户更改设备方向时,我需要重绘所有组件。

最佳答案

@dfd 提供了两个不错的选择,我添加了第三个,这是我使用的一个。

在我的例子中,我继承了 UIHostingController,在函数 viewWillTransition 中,我发布了一个自定义通知。

然后,在我的环境模型中,我会监听此类通知,然后可以在任何 View 中使用这些通知。

struct ContentView: View {
@EnvironmentObject var model: Model

var body: some View {
Group {
if model.landscape {
Text("LANDSCAPE")
} else {
Text("PORTRAIT")
}
}
}
}

在 SceneDelegate.swift 中:

window.rootViewController = MyUIHostingController(rootView: ContentView().environmentObject(Model(isLandscape: windowScene.interfaceOrientation.isLandscape)))

我的 UIHostingController 子类:

extension Notification.Name {
static let my_onViewWillTransition = Notification.Name("MainUIHostingController_viewWillTransition")
}

class MyUIHostingController<Content> : UIHostingController<Content> where Content : View {

override func viewWillTransition(to size: CGSize, with coordinator: UIViewControllerTransitionCoordinator) {
NotificationCenter.default.post(name: .my_onViewWillTransition, object: nil, userInfo: ["size": size])
super.viewWillTransition(to: size, with: coordinator)
}

}

还有我的模型:

class Model: ObservableObject {
@Published var landscape: Bool = false

init(isLandscape: Bool) {
self.landscape = isLandscape // Initial value
NotificationCenter.default.addObserver(self, selector: #selector(onViewWillTransition(notification:)), name: .my_onViewWillTransition, object: nil)
}

@objc func onViewWillTransition(notification: Notification) {
guard let size = notification.userInfo?["size"] as? CGSize else { return }

landscape = size.width > size.height
}
}

关于SwiftUI 在设备旋转时重绘 View 组件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57441654/

33 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com