【问题标题】:Layout Issue when Reordering SwiftUI Lists on macOS在 macOS 上重新排序 SwiftUI 列表时的布局问题
【发布时间】:2021-05-04 14:59:51
【问题描述】:

在 macOS 上使用拖放对 SwiftUI List 重新排序时,使用 SidebarListStyle,在已移动的行下方会出现大量空白。

这不会在 iOS 或列表样式设置为 SidebarListStyle 时发生。

这是显示问题的示例代码。

import SwiftUI

struct Item: Hashable, Identifiable {
    var id = UUID()
    var title: String
}

struct ContentView: View {
    @State var items = [
        Item(title:"Number 1"),
        Item(title:"Number 2"),
        Item(title:"Number 3"),
        Item(title:"Number 4"),
        Item(title:"Number 5"),
        Item(title:"Number 6"),
        Item(title:"Number 7"),
        Item(title:"Number 8"),
        Item(title:"Number 9"),
        Item(title:"Number 10")
    ]
    
    var body: some View {
        List {
            ForEach(items, id: \.id) { item in
                Text(item.title)
                    .frame(maxWidth: .infinity, alignment: .center)
            }
            .onMove { (indexSet, index) in
                self.items.move(fromOffsets: indexSet, toOffset: index)
            }
        }
        .listStyle(PlainListStyle())
    }
}

struct ContentView_Previews: PreviewProvider {
    static var previews: some View {
        ContentView()
    }
}

有什么办法可以防止这个多余的空间出现?

【问题讨论】:

  • 我向 Apple 开具了开发人员技术支持 (DTS) 票证,并在他们的反馈系统中创建了一个错误。我收到以下回复:“没有解决方法;仍在调查中。”那是在 2 月 2 日,从那以后再也没有听到任何进一步的消息。
  • 从 macOS Big Sur 11.3 Beta (20E5231a) 开始,此功能仍然存在问题

标签: swift list macos swiftui


【解决方案1】:

又脏又丑1但暂时可以接受的解决方法:

self.items.move(fromOffsets: indexSet, toOffset: index)
let container = self.items
self.items.removeAll()
DispatchQueue.main.async {
    self.items = container
}

1由于列表重新加载导致鼠标放下时有些闪烁

【讨论】:

    猜你喜欢
    • 2022-07-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-06-13
    相关资源
    最近更新 更多