0

My view is getting offset or zoomed in and I cant seem to figure it out.

Here is what I get:

]]2

Here is what I want:

34

I tried to track down the error location and I think this is possibly where my frame gets messed up.

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

If anyone as any idea what I need to change please let me know. Thank you!

EDIT: added ScrollableTabBar

0 Answers0