繁体   English   中英

SwiftUI 使用轮播 UIScrollView 在两个视图之间滚动

[英]SwiftUI scrolling between two views with Carousel UIScrollView

我需要在两个视图( HomeN2 和 MessengerView )之间滚动,并使用一个按钮来显示 MessengerView 并返回 HomeN2

在首页

...
Carousel(page: $page, showSearch: $showSearch, showSearchRef: $showSearchRef, showSetting: $showSetting, showNotification: $showNotification, statubar: $statubar, config: $config, scrollto: $scrollto, selectedItem2: $selectedItem2)
...
struct Carousel : UIViewRepresentable  {


    func makeCoordinator() -> Coordinator {
        
        return Carousel.Coordinator(parent1: self)
    }
    
    @Binding var page : Int
    @Binding var showSearch : Bool
    @Binding var showSearchRef : Bool
    @Binding var showSetting : Bool
    @Binding var showNotification : Bool
    @Binding var statubar : Bool
    @Binding var config: HeroConfiguration
    @Binding var scrollto : Bool
    
    @Binding var selectedItem2: User?
    
    func makeUIView(context: Context) -> UIScrollView{
        
        
        let total = UIScreen.main.bounds.width * 2
        let view = UIScrollView()
        view.isPagingEnabled = true
        view.contentSize = CGSize(width: total, height: 1.0)
        view.bounces = true
        view.showsVerticalScrollIndicator = false
        view.showsHorizontalScrollIndicator = false
        view.delegate = context.coordinator

        
        let view1 = UIHostingController(rootView: List1(page: $page, showSearch: $showSearch, showSearchRef: $showSearchRef, showSetting: $showSetting, showNotification: $showNotification, config: $config, scrollto: $scrollto, selectedItem2: $selectedItem2, statubar: $statubar ))
        
        view1.view.frame = CGRect(x: 0, y: 0, width: total, height: UIScreen.main.bounds.height)
        view1.view.backgroundColor = .clear
        
        view.addSubview(view1.view)
        
        return view
        
    }
    
    func updateUIView(_ uiView: UIScrollView, context: Context) {
    }
    
    class Coordinator : NSObject,UIScrollViewDelegate{
        
        
        var parent : Carousel
        
        init(parent1: Carousel) {
        
            parent = parent1
        }
        
        
        func scrollViewDidEndDecelerating(_ scrollView: UIScrollView) {
            
            
            
            let page = Int(scrollView.contentOffset.x / UIScreen.main.bounds.width)
            
            //scrollView.setContentOffset(CGPoint(x: self.parent.scrollto ? UIScreen.main.bounds.width : 0, y: 0), animated: true)

            self.parent.page = page
            print(page)
        }
        
        
    }
}
  
struct List1 : View {

    @Binding var page : Int
    
    @Binding var showSearch : Bool
    @Binding var showSearchRef : Bool
    @Binding var showSetting : Bool
    @Binding var showNotification : Bool
    @Binding var config: HeroConfiguration
    @Binding var scrollto : Bool
    
    @Binding var selectedItem2: User?
    @Binding var statubar : Bool
    

 var body: some View{

      HStack(spacing: 0){

            HomeN2(showSetting: $showSetting, showNotification: $showNotification, showSearch: $showSearch, showSearchRef: $showSearchRef, scrollto: $scrollto, statubar: $statubar, selectedItem2: $selectedItem2, config: $config)
            MessageView()
      }}}

Carousel.updateUIView将在 @Binding 变量更改时被调用。

您可以根据 updateUIView 中的 page 变量设置 UIScrollView 的 contentOffset。

我现在没有 IDE 但它应该是这样的:

func updateUIView(_ uiView: UIScrollView, context: Context) {
    // Maybe check if page was set from scroll or from button
    let newOffset = page * UIScreen.main.bounds.width
    uiView.setContentOffset(.init(x: newOffset, y: 0), animated: true)
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM