List 光明:,无限, 对齐:。顶部引导 ) } } 结构cl_任务_预览:PreviewProvider{ 静态var预览:一些视图{ cl_任务().previewLayout(.sizeThatFits) } }
为了测试并显示海量数据没有问题,我预加载了10000行。够了吗 您的问题:List 光明:,无限, 对齐:。顶部引导 ) } } 结构cl_任务_预览:PreviewProvider{ 静态var预览:一些视图{ cl_任务().previewLayout(.sizeThatFits) } },list,swiftui,List,Swiftui,为了测试并显示海量数据没有问题,我预加载了10000行。够了吗 您的问题: import SwiftUI struct Item { let uuid = UUID() let value: String } struct w_tasks: View { @State private var items = [Item]() var body: some View { ZStack(alignment:
import SwiftUI
struct Item {
let uuid = UUID()
let value: String
}
struct w_tasks: View {
@State private var items = [Item]()
var body: some View {
ZStack(alignment: .leading){
List(self.items, id: \.uuid) {item in
cl_task().listRowInsets(EdgeInsets())
}
.listStyle(SidebarListStyle())
.frame(width: UIScreen.main.bounds.width )
.onAppear {
DispatchQueue.main.async {
self.items.append(Item(value: "Item"))
self.items.append(Item(value: "Item"))
self.items.append(Item(value: "Item"))
self.items.append(Item(value: "Item"))
self.items.append(Item(value: "Item"))
self.items.append(Item(value: "Item"))
self.items.append(Item(value: "Item"))
self.items.append(Item(value: "Item"))
self.items.append(Item(value: "Item"))
self.items.append(Item(value: "Item"))
self.items.append(Item(value: "Item"))
self.items.append(Item(value: "Item"))
}
}
VStack {
Spacer()
HStack {
Spacer()
Button(action: {
self.items.append(Item(value: "Item"))
}, label: {
Text("+")
.font(.system(size: 30))
.frame(width: 50, height: 50)
.foregroundColor(Color.white)
.padding(.bottom, 5)
})
.background(Color(hex : "#216D94"))
.frame(width: 50, height: 50)
.cornerRadius(25)
.padding()
.shadow(color: Color.black.opacity(0.3),
radius: 3,
x: 3,
y: 3)
}
}
}.background(Color.black)
}
}
struct w_tasks_Previews: PreviewProvider {
static var previews: some View {
w_tasks()
}
}
import SwiftUI
struct cl_task: View {
@State private var offset: CGSize = .zero
var body: some View {
//Swipe to custom options ,by "Jack" this option not yet available in SwiftUI
let drag = DragGesture(minimumDistance: 25, coordinateSpace: .local)
.onChanged {
if (self.offset.width > 0 ){ return }
self.offset.width = $0.translation.width
}.onEnded {
if $0.translation.width < -100 {
self.offset = .init(width: -100, height: 0)
} else {
self.offset = .zero
}
}
ZStack{
Rectangle().foregroundColor(.blue).offset(x: offset.width, y: offset.height)
.gesture(drag)
.animation(.easeIn, value: offset)
Text("test").foregroundColor(.white)
}.frame(minWidth: 0,
maxWidth: .infinity,
minHeight: 120,
maxHeight: .infinity,
alignment: .topLeading
)
}
}
struct cl_task_Previews: PreviewProvider {
static var previews: some View {
cl_task().previewLayout(.sizeThatFits)
}
}
1.你应该让你的项目类型可以识别,然后你可以从你的列表或ForEach中输出uuid
2.您不应该为行指定帧大小,它们可以自动占用最大空间
3.你可以把你的按钮放在你的视图上,然后像我一样保存更多的编码
4.不应使用CGSize作为偏移量,因为您只需处理一维,CGFloat就足够了
5.你应该而且必须使用LazyVStack如果你的数据是海量的,就像你说的400对多,那么一定要使用LazyVStack
struct行视图:视图{
让stringOfText:String
@国家私有变量偏移量:CGFloat=CGFloat()
var body:一些观点{
ZStack{
蓝色
文本(stringOfText)
.foregroundColor(颜色.白色)
.padding()
}
.偏移量(x:偏移量)
.手势(德拉格斯特尔)
}
瓦尔·德拉格斯特尔:一些手势{
DragGesture(最小距离:25,坐标空间:本地)
.一旦改变{
如果(偏移量>0){return}
偏移量=$0.0.0转换宽度
}.ONENED{
如果$0.5,则宽度<-100{
偏移量=-100
}否则{
偏移量=0
}
}
}
}
为什么使用DispatchQueue.main.async{?因为您可以只使用items.append(Item(值:“Item”))添加值。为什么要调度队列?我确实尝试过查看行之间的分隔符是否从主线程返回,但它返回了,因为我添加了NavigationView您可以通过不使用列表来解决问题,如果可以的话,我可以help@swiftPunk,如果阵列有超过400个元素,这会影响性能吗?我在发布m你的回答解决了我在你的代码中发现的所有问题
struct Item {
let uuid = UUID()
let value: String
}
struct w_tasks: View {
@State private var items = [Item]()
var body: some View {
ZStack(alignment: .leading){
// List(self.items, id: \.uuid)
List {
ForEach(self.items, id: \.uuid) { item in
cl_task().listRowInsets(EdgeInsets(.init(top: 20, leading: -20, bottom: 20, trailing: -20)))
.frame(height: 50)
}
}
.listStyle(InsetListStyle())
.frame(width: UIScreen.main.bounds.width )
.onAppear {
DispatchQueue.main.async {
self.items.append(Item(value: "Item"))
self.items.append(Item(value: "Item"))
self.items.append(Item(value: "Item"))
self.items.append(Item(value: "Item"))
self.items.append(Item(value: "Item"))
self.items.append(Item(value: "Item"))
self.items.append(Item(value: "Item"))
self.items.append(Item(value: "Item"))
self.items.append(Item(value: "Item"))
self.items.append(Item(value: "Item"))
self.items.append(Item(value: "Item"))
self.items.append(Item(value: "Item"))
}
}
VStack {
Spacer()
HStack {
Spacer()
Button(action: {
self.items.append(Item(value: "Item"))
}, label: {
Text("+")
.font(.system(size: 30))
.frame(width: 50, height: 50)
.foregroundColor(Color.white)
.padding(.bottom, 5)
})
.background(Color("#216D94"))
.frame(width: 50, height: 50)
.cornerRadius(25)
.padding()
.shadow(color: Color.black.opacity(0.3),
radius: 3,
x: 3,
y: 3)
}
}
}.background(Color.black)
}
}
struct w_tasks_Previews: PreviewProvider {
static var previews: some View {
w_tasks()
}
}
struct cl_task: View {
@State private var offset: CGSize = .zero
var body: some View {
//Swipe to custom options ,by "Jack" this option not yet available in SwiftUI
let drag = DragGesture(minimumDistance: 25, coordinateSpace: .local)
.onChanged {
if (self.offset.width > 0 ){ return }
self.offset.width = $0.translation.width
}.onEnded {
if $0.translation.width < -100 {
self.offset = .init(width: -100, height: 0)
} else {
self.offset = .zero
}
}
ZStack{
Rectangle().foregroundColor(.blue).offset(x: offset.width, y: offset.height)
.gesture(drag)
.animation(.easeIn, value: offset)
Text("test").foregroundColor(.white)
}.frame(minWidth: 0,
maxWidth: .infinity,
minHeight: 120,
maxHeight: .infinity,
alignment: .topLeading
)
}
}
struct cl_task_Previews: PreviewProvider {
static var previews: some View {
cl_task().previewLayout(.sizeThatFits)
}
}
struct Item: Identifiable {
let id: UUID = UUID()
let value: String
}
struct ContentView: View {
@State private var items: [Item] = [Item]()
var body: some View {
ZStack {
Color.black.ignoresSafeArea()
ScrollView {
LazyVStack(spacing: 0) {
ForEach(items) {item in
RowView(stringOfText: item.value)
.frame(height: 120)
}
}
}
.background(Color.black)
.onAppear() { for _ in 0...10_000 { addNewData() } }
}
.overlay(addButton, alignment: .bottomTrailing)
.animation(.easeInOut)
}
var addButton: some View {
Button(action: { addNewData() }, label: {
Image(systemName: "plus.circle").foregroundColor(Color.white).font(Font.largeTitle.weight(Font.Weight.bold)).padding()
})
}
func addNewData() { items.append(Item(value: "item " + items.count.description)) }
}
struct RowView: View {
let stringOfText: String
@State private var offset: CGFloat = CGFloat()
var body: some View {
ZStack {
Color.blue
Text(stringOfText)
.foregroundColor(Color.white)
.padding()
}
.offset(x: offset)
.gesture(dragGesture)
}
var dragGesture: some Gesture {
DragGesture(minimumDistance: 25, coordinateSpace: .local)
.onChanged {
if (offset > 0 ){ return }
offset = $0.translation.width
}.onEnded {
if $0.translation.width < -100 {
offset = -100
} else {
offset = 0
}
}
}
}