为什么在旋转运行我的应用程序的iOS设备时会有宽度变化的延迟

tvokkenx  于 2023-03-31  发布在  iOS
关注(0)|答案(1)|浏览(145)

我正在使用Swift和SwiftUI构建一个iOS应用程序。我多次测试设备旋转动画,因为我希望它支持横向模式。我发现ContentView(或任何子视图)的宽度变化在旋转设备时有延迟,导致Black Side在一瞬间显示。
怎么解决呢?

@main
struct TESTApp: App {
    var body: some Scene {
        WindowGroup {
           ContentView()
        }
    }
}

// ContentView
struct ContentView: View {

    var body: some View {
        GeometryReader { geo in
        
            Rectangle()
                .ignoresSafeArea()
                .foregroundColor(.blue)
        }
    }
}

正如你所看到的,我已经将矩形的前景(或背景)设置为蓝色,并使用GeometryReader(如.frame(width: geo.size.width))设置宽度,当父对象发生变化时,它应该自动调整宽度或高度。但是在旋转时,宽度不能实时扩展,这就是为什么我们可以在那里看到黑色背景的原因。
我已经试过.ignoresSafeArea()了,它不起作用。
那么如何解决呢?

xqkwcwgp

xqkwcwgp1#

您可以在GeometryReader中添加.id()修改器,以在设备旋转期间强制更新布局。根据屏幕的宽度和高度分配唯一的ID,该ID将在设备旋转时更改。以下是更新后的代码:

@main
struct TESTApp: App {
    var body: some Scene {
        WindowGroup {
            ContentView()
        }
    }
}

// ContentView
struct ContentView: View {

    var body: some View {
        GeometryReader { geo in
        
            Rectangle()
                .frame(width: geo.size.width)
                .background(Color.blue)
                
        }.id(UIDevice.current.orientation.isPortrait ? "Portrait" : "Landscape")
    }
}

当设备旋转时,ID会发生变化,导致SwiftUI重新创建视图并快速适应新的方向。这应该有助于防止在旋转动画期间出现黑边。

相关问题