如何解决SwiftUI 自定义 TabView 指示器
我无法将页面所在的指示器居中。我不能忽视左右两边的意见。当页数增加时,当右侧的指标数大于左侧的指标数时,我所在页面的指标不可避免地会向左移动。
struct OnboardingView: View {
var pages: [Page] = [
Page(page: PageOne()),Page(page: PageTwo()),Page(page: PageThree()),]
@State var offset: CGFloat = 0
var body: some View {
ScrollView(.init()) {
TabView {
ForEach(pages.indices,id: \.self) { item in
if item == 0 {
AnyView(_fromValue: pages[item].page)
.overlay(
GeometryReader { proxy -> Color in
let minX = proxy.frame(in: .global).minX
dispatchQueue.main.async {
withAnimation(.default) {
self.offset = -minX
}
}
return Color.clear
}
.frame(width: 0,height: 0),alignment: .leading
)
} else {
AnyView(_fromValue: pages[item].page)
}
}
}
.tabViewStyle(PageTabViewStyle(indexdisplayMode: .never))
.overlay(
HStack(spacing: 15) {
ForEach(pages.indices,id: \.self) { item in
ZStack {
Capsule()
.foregroundColor(Color.white)
.frame(width: getCurrentPageIndex() == item ? 20 : 7,height: 20)
.frame(maxWidth: getCurrentPageIndex() == item ? .infinity : nil,alignment: .center)
}
}
}
.padding(.horizontal)
.padding(.bottom,UIApplication.shared.windows.first?.safeAreaInsets.bottom)
.padding(.bottom,10),alignment: .bottom
)
}
.ignoresSafeArea()
}
func getCurrentPageIndex() -> Int {
let index = Int(round(Double(offset / getScreenWidth())))
return index
}
func getoffset() -> CGFloat {
let progress = offset / getScreenWidth()
return 22 * progress
}
}
struct OnboardingView_Previews: PreviewProvider {
static var previews: some View {
OnboardingView()
}
}
struct Page: Identifiable {
var id = UUID()
var page: Any
}
extension View {
func getScreenWidth() -> CGFloat {
return UIScreen.main.bounds.width
}
}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。