SwiftUI 列表中所有行的高度相同

Posted

技术标签:

【中文标题】SwiftUI 列表中所有行的高度相同【英文标题】:Same height for all rows in SwiftUI List 【发布时间】:2020-02-10 07:07:23 【问题描述】:

我正在尝试构建一个List,其中所有行都具有相同的高度

struct ContentView: View 

    @State var content = ["row1", "row2\nrow2\nrow2", "row3"]

    var body: some View 
        List 
            ForEach(0..<content.count, id: \.self)  index in
                Text(self.content[index])
            
        
    

Row1 和 row3 应该与 row2 具有相同的高度

【问题讨论】:

您是否尝试为 Text(self.content[index]) 设置 .frame ? @KeyurTailor 不知道框架,高度应该按照列表中最大的高度 @KeshuR。不是真的,.defaultMinListRowHeight 可以用来设置最小高度,但我不知道我的行的高度 您需要计算内容中最长字符串的最大height,然后将frame 用于Text 与计算出的height @Kamran 我在这个例子中使用了Text 视图,我的真实行比这复杂得多,几个Text 视图排列成HStackVStack,所以这不会工作 【参考方案1】:

这是一个解决方法。 我使用geometryReader 计算内容高度。一旦我们获得内容的最大高度,在首选项的帮助下更新单元格。

struct TestView: View 
@State var content = ["row1", "row2\nrow2\nrow2", "row3"]
@State var rowHeight: CGFloat = 0

var body: some View 
  List 
      ForEach(0..<content.count, id: \.self)  index in
        Text(self.content[index])
            .frame(minHeight: self.rowHeight)  // set height as max height
            .background(
                GeometryReader (proxy) in
                    Color.clear.preference(key: SizePreferenceKey.self, value: proxy.size)  
            )
            .onPreferenceChange(SizePreferenceKey.self)  (preferences) in
                let currentSize: CGSize = preferences
                if (currentSize.height > self.rowHeight) 
                    self.rowHeight = currentSize.height     //As height get change upto max height , put value in self.rowHeight
                
            
      
  



struct SizePreferenceKey: PreferenceKey 
    typealias Value = CGSize
    static var defaultValue: Value = .zero

    static func reduce(value: inout Value, nextValue: () -> Value) 
        nextValue()
    

【讨论】:

以上是关于SwiftUI 列表中所有行的高度相同的主要内容,如果未能解决你的问题,请参考以下文章

SwiftUI 动画列表行的展开和折叠

根据android中的长度文本更改listview行的高度

如何缩放 SwiftUI 列表行高以匹配列表的宽度

按返回键“不”关闭软件键盘 - SwiftUI

SwiftUI 列表中某些行的布局问题

如何使用 SwiftUI 将图像对齐到列表行的右上角?