【问题标题】:SwiftUI: Spacing between List ItemsSwiftUI:列表项之间的间距
【发布时间】:2021-10-24 18:28:44
【问题描述】:

我有一些代码显示一个带有标题和矩形的列表,如果用户点击它,它会导航到详细信息页面。

但我的代码似乎有多个问题:

  1. 垫片不工作。我想要左边的名字和右边的矩形,就像堆栈中的一个垫片会推动它。
  2. 不应用矩形的背景颜色。它只是黑色
  3. 如果我添加一个导航标题,我会看到约束错误(见下文)

( "<0x600002438f50 h:><0x600002438fa0 _uimodernbarbutton:0x7fd15fe064d0 _uibuttonbarbutton:0x7fd15fe05310.trailing><0x600002439d10 _uimodernbarbutton:0x7fd15fe088b0.leading="=" uilayoutguide:0x600003e04a80><0x600002439d60 h:><0x6000024350e0 uilayoutguide:0x600003e049a0 _uinavigationbarcontentview:0x7fd15fd0a640.trailing><0x60000243a4e0 _uinavigationbarcontentview:0x7fd15fd0a640.width="="><0x6000024354a0 h:>

  • &gt;

标签: swiftui swiftui-list


【解决方案1】:

您的分隔符不起作用,因为 HStack 中有 NavigationLink 占用了所有空间:它的优先级高于 Spacer

如果您想将NavigationLinkEmptyView 一起使用,则应将其放置在具有附近视图的ZStack 中,但在这种情况下,您只需将单元格的内容放在NavigationLink label 中即可。

Rectangle 不是视图而是Shape,与任何其他Shape 一样,它的颜色应使用foregroundColor 设置,而不是background

GeometryReader 总是占用所有可用空间,除非您为其添加大小修饰符。它不能自行环绕内容。所以你可以使用以下技巧:为GeometryReader 中的项目添加onAppear,并将width 传递给状态变量,然后将宽度修饰符添加到GeometryReader

struct ContentView: View {
    @ObservedObject var viewModel = CityListViewModel()

    
    var body: some View {
        NavigationView {
            List {
                ForEach(viewModel.cityList, id: \.name) { city in
                    NavigationLink(
                        destination: Text(city.name)){
                        HStack{
                            Text(city.name)
                            Spacer()
                            CustomView()
                        }
                    }.frame(height: 100)
                }
            }
            .navigationTitle("World Clock")
        }
    }
}

struct CustomView: View {
    @State
    var width: CGFloat?
    
    var body: some View {
        GeometryReader { geo in
            Circle().frame(width: geo.size.height, height: geo.size.height)
                .background(Color.green)
                .onAppear {
                    width = geo.size.height
                }
        }.frame(width: width)
    }
}

如果您看到一些不是您创建的 NSLayoutConstraint 损坏,例如在使用 SwiftUI 时,您可以忽略它:这不是您的错误。

【讨论】:

  • 你是对的。使用 Shapes,这是可行的。但是在我的项目中,我有一个视图,并且这个视图的大小是使用几何阅读器进行的。让我更新一下我的问题。
  • @netshark1000 这是一个真实的代码还是远非真实的?为什么不能将.frame(width: 100, height: 100) 添加到圈子而不是GeometryReader?它就像NavigationLink 一样贪婪,也占用了所有可用空间。您有SpacerGeometryReader,您希望GeometryReader 如何计算可用高度?不能把 GeometryReader 放在 HStack 下吗?
  • 这是一个简化的例子。除了 Circle,我还有其他需要根据可用空间调整其大小的视图。但是我可以用这个简单的圆圈示例来重现它。
  • @netshark1000 我已经更新了我的答案,看看你如何欺骗GeometryReader 不填满所有空间
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-03-17
  • 2017-11-09
  • 2013-10-15
  • 2021-05-08
  • 1970-01-01
  • 2014-04-07
  • 1970-01-01
相关资源
最近更新 更多