[英]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.