iOS 14.2 中的 SwiftUI PageTabView 性能问题滞后
Posted
技术标签:
【中文标题】iOS 14.2 中的 SwiftUI PageTabView 性能问题滞后【英文标题】:SwiftUI PageTabView in iOS 14.2 performance issues lagging 【发布时间】:2020-11-18 15:07:06 【问题描述】:我将 TabView 与 PageTabViewStyle 结合使用,每个子视图都包含一个带有大型数据集的列表视图。
仅在 ios 14.2 上,页面转换似乎非常滞后。
但是,在具有少量数据的列表视图中,页面转换不会延迟。
我猜测 TabView 的性能包括列表将与数据量无关,因为列表行显示是惰性的。
所以,我认为这是错误或默认视图样式更改。
我期待您的帮助来解决这个问题。谢谢
@available(iOS 14.0, *)
struct ContentView: View
@State var showHeart: Bool = false
var body: some View
TabView
self.contents
self.contents
.tabViewStyle(PageTabViewStyle())
var contents: some View
List(0..<1000)_ in
Text("HELLO WORLD HELLOWORLD")
【问题讨论】:
您找到解决方案了吗?我在 iOS 14.2 中的 UI 更新非常缓慢 【参考方案1】:我一直在玩这个,只是一个发现——当你使用 TabView()
时,它是滞后的,但是如果你添加一个作为 TabView(selection: $selection)
传递的绑定,并且不对选择绑定做任何事情,它会以某种方式不不再滞后?哈克,但一个解决方案。
【讨论】:
这可行,但这会影响 Tabview 中的页面视图索引。滑动页面时,这不会显示正确的索引 正确,为了让这个超级 hacky 解决方案起作用,您必须处于不关心选择绑定的特定用例中。与其说是一个实用的解决方案,不如说是一个有趣的发现。 如果您需要选定的索引(并且需要对其进行处理)怎么办?一旦我使用选择,滑动就会滞后。怎么办?【参考方案2】:尝试使用延迟加载。像这样:https://www.hackingwithswift.com/quick-start/swiftui/how-to-lazy-load-views-using-lazyvstack-and-lazyhstack
正如您在视频中看到的:https://streamable.com/7sls0w
列表未正确优化。使用LazyVStack
创建您自己的列表。更好的性能,更平滑的过渡。
我认为你没有理解这个想法。解决问题的代码:
@State var showHeart: Bool = false
var body: some View
TabView
contents
contentsSecond
.tabViewStyle(PageTabViewStyle())
var contents: some View
List(0..<10000) _ in
Text("HELLO WORLD HELLOWORLD")
var contentsSecond: some View
return ScrollView
Divider()
LazyVStack
ForEach(1...1000, id: \.self) value in
Text("Luke, I am your father \(value)")
.padding(.all, 5)
Divider()
【讨论】:
@spacecash21 感谢您的回答。我试过了,并没有解决问题。【参考方案3】:我昨天更新到 iOS 14.2 并且遇到了同样的问题(使用 Scrollview 而不是 List btw)。我相信这是一个错误。
一种可能的解决方法是使用 UIViewControllerRepresentable 回退到 UIKits PageViewController,如此处接受的答案所示:
How can I implement PageView in SwiftUI?
这解决了滞后问题。
【讨论】:
以上是关于iOS 14.2 中的 SwiftUI PageTabView 性能问题滞后的主要内容,如果未能解决你的问题,请参考以下文章
iOS 15.3.1中SwiftUI toolbar中按钮不响应点击动作等若干不兼容问题的解决
iOS 15.3.1中SwiftUI toolbar中按钮不响应点击动作等若干不兼容问题的解决