【发布时间】:2021-04-05 04:42:41
【问题描述】:
如果我之前设置了scrollPosition,当我更改设备方向时,我的应用程序会继续崩溃。
我的 ContentView() 看起来像这样 - 我正在读取显示尺寸。
GeometryReader { display in
VStack {
HeaderView()
MainScrollView(display: display)
FooterView()
}
}
将display 传递给MainScrollView(),其中 - 在ScrollViewReader 中,if-else 语句检查它是否应该加载PortraitMainView() 或`LandscapeMainView()
struct MainScrollView: View {
var display: GeometryProxy
var body: some View {
ScrollViewReader { scrollPosition in
ZStack {
ScrollView {
if display.size.width > display.size.height {
LandscapeMainView()
} else {
PortraitMainView()
}
}
Button(action: {
withAnimation {
scrollPosition.scrollTo("C", anchor: .top)
}
}, label: {
Text("Scroll to Position C")
} )
}
}
}
}
LandscapeMainView() 和 PortaitMainView() 看起来像这样:
LandscapeMainView: View {
var body: some View {
VStack {
Text("Item A")
.id("A")
Text("Item B")
.id("B")
Text("Item C")
.id("C")
Text("Item D")
.id("D")
Text("Item E")
.id("E")
}
}
}
一切正常,我可以翻转方向,它从LandscapeMainView() 变为PortraitMainView(),反之亦然。
此外,设置scrollPosition 就像在横向和纵向模式下的魅力一样。
只有在我设置了scrollPosition 然后更改我的设备冻结的方向后,才给我一个Thread 1: EXC_BAD_ACCESS (code=1, address=0x30) 作为输出。屏幕仍然显示纵向模式,在横向上倾斜,屏幕的一半是空白的。
有没有更好的方法来处理 SwiftUI 中的屏幕方向和滚动视图?
【问题讨论】:
-
提供的代码不足以重现崩溃,你能提供最小的例子吗?
-
更新了代码——在尝试它是否崩溃时,我发现它不会在模拟器上崩溃。在模拟器上尝试了我的实际应用程序:按预期工作。不过,我在装有 iOS 14 的 iPhone XS 上的这段代码会崩溃。
-
尝试将 bool 而不是
GeometryProxy传递给您的MainScrollView。我有类似的问题,所以这只是一个猜测
标签: ios swift swiftui orientation scroll-position