1

I need scrolling between two views ( HomeN2 and MessengerView ) with a button for showing MessengerView and back to HomeN2

in page home

...
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()
      }}}
Asperi
  • 228,894
  • 20
  • 464
  • 690
ĢhāŁı
  • 13
  • 2

1 Answers1

0

Carousel.updateUIView will get called whenever the @Binding variables change.

You can set the UIScrollView's contentOffset based on the page variable in updateUIView.

I don't have an IDE right now but it should be something like:

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)
}
Casper Zandbergen
  • 3,419
  • 2
  • 25
  • 49