SwiftUI 中的垂直分页
我正在通过 TabView 创建一个垂直分页视图,如下 this
一切都很完美,除了奇怪的右边距,如下图所示。
这是我使用的代码。如果有人能指出根本原因,我将不胜感激。
import SwiftUI
fileprivate struct VCompatibleTabView<Content: View>: View {
let proxy: GeometryProxy
let content: Content
init(proxy: GeometryProxy, @ViewBuilder content: () -> Content) {
self.proxy = proxy
self.content = content()
}
var body: some View {
if #available(iOS 15.0, *) {
// Credit to Gary Tokmen for this bit of Geometry Reader code: https://blog.prototypr.io/how-to-vertical-paging-in-swiftui-f0e4afa739ba
TabView {
content
.rotationEffect(.degrees(-90)) // Rotate content
.frame(
width: proxy.size.width,
height: proxy.size.height
)
}
.frame(
width: proxy.size.height, // Height & width swap
height: proxy.size.width
)
.rotationEffect(.degrees(90), anchor: .topLeading) // Rotate TabView
.offset(x: proxy.size.width) // Offset back into screens bounds
.tabViewStyle(
PageTabViewStyle(indexDisplayMode: .never)
)
} else {
ScrollView(.vertical, showsIndicators: false) {
LazyVStack(spacing: 0) {
content
}
}
.frame(
width: proxy.size.width,
height: proxy.size.height) }
}
}
struct BBYouView: View {
var body: some View {
ZStack {
GeometryReader { proxy in
VCompatibleTabView(proxy: proxy) {
ForEach(0..<3, id: \.self) { item in
Rectangle().fill(Color.pink)
.frame(
width: proxy.size.width,
height: proxy.size.height
)
}
}
}
}
.background(Color.yellow)
}
}
I'm creating a vertical paging view via TabView following this
Everything is perfect except the strange right margin as highlighted in pic below.
Here is the code I use. Appreciate it if anyone could point out the root cause.
import SwiftUI
fileprivate struct VCompatibleTabView<Content: View>: View {
let proxy: GeometryProxy
let content: Content
init(proxy: GeometryProxy, @ViewBuilder content: () -> Content) {
self.proxy = proxy
self.content = content()
}
var body: some View {
if #available(iOS 15.0, *) {
// Credit to Gary Tokmen for this bit of Geometry Reader code: https://blog.prototypr.io/how-to-vertical-paging-in-swiftui-f0e4afa739ba
TabView {
content
.rotationEffect(.degrees(-90)) // Rotate content
.frame(
width: proxy.size.width,
height: proxy.size.height
)
}
.frame(
width: proxy.size.height, // Height & width swap
height: proxy.size.width
)
.rotationEffect(.degrees(90), anchor: .topLeading) // Rotate TabView
.offset(x: proxy.size.width) // Offset back into screens bounds
.tabViewStyle(
PageTabViewStyle(indexDisplayMode: .never)
)
} else {
ScrollView(.vertical, showsIndicators: false) {
LazyVStack(spacing: 0) {
content
}
}
.frame(
width: proxy.size.width,
height: proxy.size.height) }
}
}
struct BBYouView: View {
var body: some View {
ZStack {
GeometryReader { proxy in
VCompatibleTabView(proxy: proxy) {
ForEach(0..<3, id: \.self) { item in
Rectangle().fill(Color.pink)
.frame(
width: proxy.size.width,
height: proxy.size.height
)
}
}
}
}
.background(Color.yellow)
}
}
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(3)
iOS 17 中的水平/垂直分页
从 iOS 17 开始,您不需要旋转选项卡视图,您可以通过在
ScrollView 上应用以下修饰符来启用分页行为
:因此,
ScrollView
内的任何内容(例如堆栈内的简单ForEach
)都将根据需要进行分页。这适用于水平滚动视图和垂直滚动视图。Horizontal/Vertical paging in iOS 17
From iOS 17, you don't need to do the hack of rotating the tab view and you can enable the paging behavior by applying the following modifier on the
ScrollView
:So anything inside the
ScrollView
like a simpleForEach
inside a stack would be paging as desired. This works for bothhorizontal
andvertical
scrollviews.有 iOS17 修饰符
.scrollTargetBehavior(.paging)
,对于旧版本,此 hack 应该有效:There is iOS17 modifier
.scrollTargetBehavior(.paging)
, for older versions this hack should work:尝试在
TabView
内的content
视图上添加scaledToFill()
修饰符。该修改器会缩放视图以填充其父视图。我发现当content
视图是AsyncImage
或Image
视图时它可以工作,并且它应该适用于任何单个视图。然而,对于水平的 TabView 来说,它也有同样的问题,即屏幕右边缘的奇怪边距。示例代码如下:
Try adding the
scaledToFill()
modifier on thecontent
view within theTabView
. That modifier scales the view to fill its parent. I've found that it works when thecontent
view is anAsyncImage
orImage
view and it should work with any single views. However, with a horizontalTabView
and it had the same issue with the strange margin on the right edge of the screen.Example code below: