SwiftUI 不正确的帧大小

问题描述

我的视图正在偏移或放大,我似乎无法弄清楚。

这是我得到的:

]

]2

这是我想要的:

3

4

我试图追踪错误位置,我认为这可能是我的框架搞砸的地方。

let frame = reader.frame(in: .global)
struct MainView: View {
    
    @State var offset: CGFloat = 0
    
    var body: some View {
        GeometryReader{reader in
            
            let frame = reader.frame(in: .global)
            
            ScrollableTabBar(tabs: ["",""],rect: frame,offset: $offset){
                Home(offset: $offset)
                SettingsView()
            }
            .ignoresSafeArea()
        }
        .ignoresSafeArea()
    }
}
import SwiftUI

struct ScrollableTabBar<Content: View>: UIViewRepresentable{
    
    var content: Content
    var rect: CGRect
    @Binding var offset: CGFloat
    var tabs: [Any]
    
    let scrollView = UIScrollView()
    
    init(tabs: [Any],rect: CGRect,offset: Binding<CGFloat>,@viewbuilder content: ()-> Content) {
        self.content = content()
        self._offset = offset
        self.rect = rect
        self.tabs = tabs
    }
    
    func makeCoordinator() -> Coordinator {
        return ScrollableTabBar.Coordinator(parent: self)
    }
    
    func makeUIView(context: Context) -> UIScrollView {
        setUpScrollView()
        scrollView.contentSize = CGSize(width: rect.width * CGFloat(tabs.count),height: rect.height)
        scrollView.contentOffset.x = offset
        scrollView.addSubview(extractView())
        scrollView.delegate = context.coordinator
        return scrollView
    }
    
    func updateUIView(_ uiView: UIScrollView,context: Context) {
        if uiView.contentOffset.x != offset{
            uiView.delegate = nil
            
            UIView.animate(withDuration: 0.4){
                uiView.contentOffset.x = offset
            } completion: { (status) in
                if status{uiView.delegate = context.coordinator}
            }
        }
    }
    
    func setUpScrollView(){
        scrollView.isPagingEnabled = true
        scrollView.bounces = false
        scrollView.showsverticalScrollIndicator = false
        scrollView.showsHorizontalScrollIndicator = false
    }
    
    func extractView() -> UIView{
        let controller = UIHostingController(rootView: HStack(spacing: 0){content}.ignoresSafeArea())
        controller.view.frame = CGRect(x: 0,y: 0,width: rect.width * CGFloat(tabs.count),height: rect.height)
        return controller.view!
    }
    
    class Coordinator: NSObject,uiscrollviewdelegate{
        
        var parent: ScrollableTabBar
        
        init(parent: ScrollableTabBar){
            self.parent = parent
        }
        
        func scrollViewDidScroll(_ scrollView: UIScrollView) {
            parent.offset = scrollView.contentOffset.x
        }
    }
    
    struct ScrollableTabBar_Previews: PreviewProvider {
        static var previews: some View{
            ContentView()
        }
    }
}

如果有人知道我需要改变什么,请告诉我。谢谢!

编辑:添加了 ScrollableTabBar

解决方法

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

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

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