【问题标题】:SwiftUI scrolling between two views with Carousel UIScrollView使用 Carousel UIScrollView 在两个视图之间滚动的 SwiftUI
【发布时间】:2020-12-07 22:08:39
【问题描述】:

我需要在两个视图( 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()
      }}}

【问题讨论】:

  • 目标不明确,能否详细说明?
  • 我有两页;我通过左右滑动来在它们之间移动,就像 instagram 页面主页和页面消息一样,我需要添加两个按钮来在它们之间移动
  • 这是否回答了您的问题stackoverflow.com/a/62833840/12299030
  • 在tabview中出现垂直滚动的问题我无法禁用它

标签: swift swiftui


【解决方案1】:

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)
}

【讨论】:

  • 我不知道这么简单:)。谢谢
猜你喜欢
  • 2014-01-24
  • 1970-01-01
  • 1970-01-01
  • 2014-07-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-12-14
相关资源
最近更新 更多