ios 在PageTabViewStyle不起作用的情况下忽略TabView上的边缘安全区域

vmpqdwk3  于 2022-11-19  发布在  iOS
关注(0)|答案(6)|浏览(133)

通过使用.tabViewStyle(PageTabViewStyle())将TabView用作页面查看器可以很好地工作,但是试图通过应用edgesIgnoringSafeArea让它从一个边缘运行到另一个边缘似乎不起作用。
我错过了什么?

struct ContentView: View {
    let colors: [Color] = [.red, .green, .blue]
    var body: some View {
        TabView {
            ForEach(0...2, id: \.self) { index in
                Rectangle()
                    .fill(colors[index])
            }
        }
        .tabViewStyle(PageTabViewStyle())
        .edgesIgnoringSafeArea(.all)
    }
}

将另一个.edgesIgnoringSafeArea(.all)添加到RectangleForEach也不起作用。
请注意,所有这些问题都是不同的,因为它们使用use PageTabViewStyle()

他们的解决方案(添加edgesIgnoringSafeArea(.all))在这种情况下不起作用。

0wi1tuuw

0wi1tuuw1#

1.从选项卡视图中删除.edgesIgnoringSafeArea(.all)
1.向TabView添加具有屏幕宽度和高度的框架
1.使用ScrollView Package TabView
1.将.edgesIgnoringSafeArea(.all)添加到滚动视图

struct ContentView: View {
    let colors: [Color] = [.red, .green, .blue]

    var body: some View {
        ScrollView {
            TabView {
                ForEach(0...2, id: \.self) { index in
                    Rectangle()
                        .fill(colors[index])
                }
            }
            .frame(
                width: UIScreen.main.bounds.width ,
                height: UIScreen.main.bounds.height
            )
            .tabViewStyle(PageTabViewStyle())
            
        }
        .edgesIgnoringSafeArea(.all)
    }
}
t40tm48m

t40tm48m2#

SwiftUI 3.0中的更新:

TabView {
            ForEach(0...2, id: \.self) { index in
                Rectangle()
                    .fill(colors[index])
            }
            .ignoresSafeArea()
        }
        .tabViewStyle(PageTabViewStyle())
        .edgesIgnoringSafeArea(.all)
omhiaaxx

omhiaaxx3#

这是我得到的最大值...无论如何,我假设最初它是一个错误,值得提交反馈给苹果。
使用Xcode 12b进行测试

struct TestPagingStyle: View {
    let colors: [Color] = [.red, .green, .blue]
    var body: some View {
        ZStack {
            Color.black.overlay(
                GeometryReader { gp in
                    TabView {
                        ForEach(0..<3, id: \.self) { index in
                            Text("Hello, World \(index)")
                                .frame(width: gp.size.width, height: gp.size.height)
                                .background(colors[index])
                        }
                    }
                    .tabViewStyle(PageTabViewStyle(indexDisplayMode: .always))
                }
            )
        }.edgesIgnoringSafeArea(.all)
    }
}
az31mfrm

az31mfrm4#

我通过“延长”TabView的高度并将其向顶部“移动”相同的量来解决这个恼人的问题:

struct ContentView: View {
    var body: some View {
        let yExtension: CGFloat = 50
        GeometryReader { g in
            TabView {
                Color.red.overlay(Text("1"))
                Color.green.overlay(Text("2"))
                Color.blue.overlay(Text("3"))
                Color.orange.overlay(Text("4"))
            }
            .frame(width: g.size.width, height: g.size.height + yExtension)
            .tabViewStyle(PageTabViewStyle(indexDisplayMode: .automatic))
            .font(Font.title.bold())
        }
        .offset(y: -yExtension)
        .edgesIgnoringSafeArea(.all)
    }
}

在Xcode 12.4和iOS 14.4上测试:

db2dz4w8

db2dz4w85#

按照@kimigori here的建议,将TabView Package 在ScrollView中是可行的,但会导致页面点变成可滚动的。若要将它们固定在适当的位置,请使用水平ScrollView。
这是一个可重复使用的页面视图,可与ignoresSafeArea(_:edges:)一起使用:

struct PageView<Content: View>: View {
    let content: () -> Content

    var body: some View {
        GeometryReader { geo in
            ScrollView(.horizontal) {
                TabView {
                    content()
                }
                .frame(width: geo.size.width, height: geo.size.height)
                .tabViewStyle(PageTabViewStyle())
            }
        }
    }

    init(@ViewBuilder content: @escaping () -> Content) {
        self.content = content
    }
}

示例:
TestPageView gif

struct TestPageView: View {
    var body: some View {
        PageView {
            ForEach(0...2, id: \.self) { index in
                ZStack {
                    Rectangle()
                        .fill([.red, .green, .blue][index])
                    Text("Page \(index + 1)")
                }
            }
        }
        .ignoresSafeArea()
    }
}
b1payxdu

b1payxdu6#

只需用途:

.ignoresSafeArea(edges:[.top,.bottom])

我认为TabView不能忽略前导和尾随,这是包含在.all中的。但是,如果你手动设置.top.bottom,它可以正常工作。

相关问题