有啥方法可以避免 SwiftUI GeometryReader 阻止嵌套视图在列表中增长?

Posted

技术标签:

【中文标题】有啥方法可以避免 SwiftUI GeometryReader 阻止嵌套视图在列表中增长?【英文标题】:Any way to avoid SwiftUI GeometryReader preventing nested view to grow inside List?有什么方法可以避免 SwiftUI GeometryReader 阻止嵌套视图在列表中增长? 【发布时间】:2019-08-20 01:05:46 【问题描述】:

出于某种原因,将GeometryReader 作为中介,如果它是List“单元格”,则会杀死其嵌套视图的几何形状。

示例代码:

struct SampleView: View 
    var multilineText: some View 
        Text(
            """
            Some
            Amazing
            Multiline
            Copy
            """
        )
    

    var body: some View 
        List(1...5, id: \.self)  _ in
            GeometryReader  _ in
                self.multilineText
            
        
    

没有GeometryReader(预期)/实际有GeometryReader

显然,此示例过于简单,但有正当理由为我正在构建的嵌套视图测量几何图形。

这是在 Xcode 11 beta 6 上发布的。我应该直接将其报告为错误,还是可以预期且可行?

【问题讨论】:

我不知道这是否是一个错误,但我知道 GeometryReader 在所有测试版中为原本大小不灵活的子视图增加了灵活性。如果您解释了您真正想要使用 GeometryReader 的目的,也许我们可以帮助您使其更好地为您服务。例如,如果您在overlaybackground 修饰符中使用GeometryReaderGeometryReader 将无法影响修改后视图的布局,但会采用修改后视图的大小。 @robmayoff 我目前有一个十六进制视图,它在叠加层上使用GeometryReader 来计算单个等宽字符的大小,并根据视图的几何大小组成一组偶数列单个字符的。如果没有GeometryReader,就无法构建它。但总的来说,让我感到困惑的是,作为某种观点的消费者,我可能甚至不知道它测量几何,把它放在List 中——然后繁荣,它坏了。对我来说听起来不太对。 看看this answer对你有没有帮助。 当我使用 this answer 在列表中嵌入多行 UILabel 时,我刚刚遇到了这个问题。 GeometryReader 改变了嵌套项的行为对我来说似乎很奇怪。由于GeometryReader 实际读取了包含它的容器,因此我很幸运地将其设置为Group 内的空兄弟。 GeometryReaderZStack 内部似乎特别奇怪 【参考方案1】:

为列表添加最小行高。

List(1...5, id: \.self)  _ in
    GeometryReader  _ in
        self.multilineText
    
.environment(\.defaultMinListRowHeight, 100)

【讨论】:

以上是关于有啥方法可以避免 SwiftUI GeometryReader 阻止嵌套视图在列表中增长?的主要内容,如果未能解决你的问题,请参考以下文章

有啥方法可以将视图从 swiftUI 更改为 UIKit?

有啥方法可以在 SwiftUI 中使用 @ViewBuilder 创建/提取视图数组

有啥方法可以判断哪个状态更改导致在 SwiftUI 中重建视图?

有啥方法可以在 SwiftUI 中的可搜索导航修饰符上关闭自动更正/设置键盘类型

SwiftUI 有啥方法可以创建一个 TabView 来显示 Tab Item 下面的 View

在 UIKit 中我们可以设置 label.numberOfLines = 0 当我们不知道文本将占用多少行时?在 SwiftUI 中有啥替代方法? [复制]