程序问答   发布时间:2022-06-01  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了将 UIScrollView 与 @ViewBuilder 集成,但内容中的子视图不更新大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。

如何解决将 UIScrollView 与 @ViewBuilder 集成,但内容中的子视图不更新?

开发过程中遇到将 UIScrollView 与 @ViewBuilder 集成,但内容中的子视图不更新的问题如何解决?下面主要结合日常开发的经验,给出你关于将 UIScrollView 与 @ViewBuilder 集成,但内容中的子视图不更新的解决方法建议,希望对你解决将 UIScrollView 与 @ViewBuilder 集成,但内容中的子视图不更新有所启发或帮助;

我使用 UIRepresentable 将 UIScrollVIEw 与 SwiftUI 集成,它在显示上运行良好。我使用 @viewbuilder 允许人们将他们的自定义内容插入到我的自定义滚动视图中,但是我发现 @State 变量在我的自定义滚动视图中的自定义内容中不起作用。我对这个问题很困惑。任何人都可以帮助我吗?

我发现在滚动时会调用 updateUIVIEw,但我不知道为什么 @viewbuilder 中的 Text 没有更新,以及如何使其更新。

演示项目:

import SwiftUI

struct ContentVIEw: VIEw {
    
    @State var speed: CGfloat = 0
    
    @State var offset: CGfloat = 0
    
    var body: some VIEw {
        
        vstack {
            
            // This Text works
            Text("Speed: \(speed),Offset: \(offset)")
                    
            UIScrollVIEwControl(speed: $speed,offset: $offset,contentWIDth: UIScreen.main.bounds.wIDth,contentHeight: UIScreen.main.bounds.height) {
                
                // This Text never updates
                Text("Speed: \(speed),Offset: \(offset)")
            }
        }
    }
}

UIScrollVIEwControl.swift

struct UIScrollVIEwControl<Content: VIEw>: UIVIEwRepresentable {
    
    @Binding var speed: CGfloat
    
    @Binding var offset: CGfloat
    
    var contentHeight: CGfloat
    
    var contentWIDth: CGfloat
    
    let content: Content
    
    init(speed: Binding<CGfloat>,offset: Binding<CGfloat>,contentWIDth: CGfloat,contentHeight: CGfloat,@viewbuilder content: () -> Content) {
        self._speed = speed
        self._offset = offset
        self.contentWIDth = contentWIDth
        self.contentHeight = contentHeight
        self.content = content()
    }
    
    func makeCoordinator() -> Coordinator {
        Coordinator(parent1: self)
    }
    
    func makeUIVIEw(context: Context) -> UIScrollVIEw {
        let vIEw = UIScrollVIEw()
        vIEw.contentSize = CGSize(wIDth: 1.0,height: contentHeight)
        vIEw.showsHorizontalScrollinDicator = false
        vIEw.showsverticalScrollinDicator = false
        vIEw.delegate = context.coordinator
        
        let vIEw1 = UIHosTingController(rootVIEw: content)
        vIEw1.vIEw.frame = CGRect(x: 0,y: 0,wIDth: contentWIDth,height: contentHeight)
        vIEw1.vIEw.BACkgroundcolor = .clear
        vIEw.addSubvIEw(vIEw1.vIEw)
        return vIEw
    }
    
    func updateUIVIEw(_ uiVIEw: UIScrollVIEw,context: Context) {
    }
    
    class Coordinator: NSObject,uiscrollviewdelegate {
        
        var parent: UIScrollVIEwControl
        
        init(parent1: UIScrollVIEwControl) {
            parent = parent1
        }
        
        func scrollVIEwDIDEndDeceleraTing(_ scrollVIEw: UIScrollVIEw) {
            parent.speed = 0
        }
        
        func scrollVIEwDIDScroll(_ scrollVIEw: UIScrollVIEw) {
            parent.speed = scrollVIEw.contentOffset.y - parent.offset
            parent.offset = scrollVIEw.contentOffset.y
        }
    }
}

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)

大佬总结

以上是大佬教程为你收集整理的将 UIScrollView 与 @ViewBuilder 集成,但内容中的子视图不更新全部内容,希望文章能够帮你解决将 UIScrollView 与 @ViewBuilder 集成,但内容中的子视图不更新所遇到的程序开发问题。

如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。
标签:集成