gpt4 book ai didi

ios - SwiftUI 中的双向无限 PageView

转载 作者:行者123 更新时间:2023-12-04 08:21:51 27 4
gpt4 key购买 nike

我正在尝试制作一个双向 TabView(使用 .tabViewStyle(PageTabViewStyle(indexDisplayMode: .never))),其数据源会随时间变化。

下面是描述预期结果的代码:

class TabsViewModel: ObservableObject {
@Published var items = [-2, -1, 0, 1, 2]
@Published var selectedItem = 2 {
didSet {
if let index = items.firstIndex(of: selectedItem), index >= items.count - 2 {
items = items + [items.last! + 1]
items.removeFirst()
}

if let index = items.firstIndex(of: selectedItem), index <= 1 {
items = [items.first! - 1] + items
items.removeLast()
}
}
}
}

struct TabsView: View {
@StateObject var vm = TabsViewModel()

var body: some View {
TabView(selection: $vm.selectedItem) {
ForEach(vm.items, id: \.self) { item in
Text(item.description)
.frame(minWidth: 0,
maxWidth: .infinity,
minHeight: 0,
maxHeight: .infinity,
alignment: .topLeading
)
.background(Color(hue: .random(in: 0...0.99), saturation: .random(in: 0...0.99), brightness: 0.5))
}
}
.tabViewStyle(PageTabViewStyle(indexDisplayMode: .never))
}
}

在这种情况下,当您尝试转到下一页或上一页时,动画会中断并且原始页面会立即返回到它的位置。

是否可以在没有 UIKit 和第三方框架帮助的情况下使用 TabView 完全实现这一点?

我的猜测是一种可能的解决方案是在过渡动画结束时更改数据源,但我找不到在 SwiftUI 中执行此操作的方法。
我的猜测正确吗?也许还有其他更优雅的方法来实现此功能,但我的立场是错误的。

最佳答案

任务本身可以使用 SwiftUIPager 来解决框架。

import SwiftUI
import SwiftUIPager

class PagerConteinerViewModel: ObservableObject {
@Published var items = [-3, -2, -1, 0, 1, 2, 3]
@Published var selectedItemIndex = 3

func updateItems (_ direction: Double) {
withAnimation {
if direction > 0 && selectedItemIndex >= items.count - 3 {
items = items + [items.last! + 1]
items.removeFirst()
}

if direction < 0 && selectedItemIndex <= 2 {
items = [items.first! - 1] + items
items.removeLast()
}
}
}
}

struct PagerContainerView: View {
@StateObject var vm = PagerConteinerViewModel()

var body: some View {
Pager(page: $vm.selectedItemIndex, data: vm.items, id: \.self) { item in
Text("\(item)")
.frame(minWidth: 0,
maxWidth: .infinity,
minHeight: 0,
maxHeight: .infinity,
alignment: .topLeading
)
.background(Color(hue: .random(in: 0...0.99), saturation: .random(in: 0...0.99), brightness: 0.5))
}
.onDraggingEnded(vm.updateItems)
}
}

文档 uses onPageChanged 更新数据源,但随后在数组的中间或开头插入一个值会使应用程序崩溃。

关于ios - SwiftUI 中的双向无限 PageView,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65457609/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com