问题描述
我无法将页面所在的指示器居中。我不能忽视左右两边的意见。当页数增加时,当右侧的指标数大于左侧的指标数时,我所在页面的指标不可避免地会向左移动。
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 (将#修改为@)