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/SwiftUI]

iOS 15.3.1中SwiftUI toolbar中按钮不响应点击动作等若干不兼容问题的解决

iOS 15.3.1中SwiftUI toolbar中按钮不响应点击动作等若干不兼容问题的解决

iOS 14.2 Beta - AVPlayer 无法播放 [关闭]

iOS 14.2 中引入 AudioToolback 崩溃

在 Safari iOS 14.2 上自动播放视频 HTML