在SwiftUI中,如何在ScrollView中创建多行文本?

时间:2019-06-14 07:07:14

标签: swift swiftui

由于List目前似乎无法配置为删除行分隔符,因此我使用的ScrollView中带有VStack来创建垂直布局文字元素。下面的示例:

ScrollView {
    VStack {
        // ...
        Text("Lorem ipsum dolor sit amet, consectetur adipiscing elit. Integer mattis ullamcorper tortor, nec finibus sapien imperdiet non. Duis tristique eros eget ex consectetur laoreet.")
            .lineLimit(0)
    }.frame(width: UIScreen.main.bounds.width)
}

生成的Text被截断为单行。在ScrollView之外,它呈现为多行。除了明确设置ScrollView框架的高度之外,如何在Text内实现此目标?

5 个答案:

答案 0 :(得分:5)

Xcode Beta 3 中:

如果您在滚动视图中嵌套的堆栈中有一个Text视图,请使用frame(idealHeight: .infinity)解决方法:

ScrollView {
    VStack {
        Text(someString)
            .lineLimit(nil)
            .frame(idealHeight: .infinity)
    }
}

如果有多个多行文字,请从以后的视图中删除.frame

如果堆栈中有多个Text元素,并且将frame(idealHeight: .infinity)应用于多个元素,则会在StackLayout.Header.init(layoutContext:proxies:majorAxis:minorAxisAlignment:uniformSpacing:childStorage:capacity:)处发现SwiftUI的堆栈布局代码崩溃。 / p>

要解决此问题,请仅将idealHeight应用于第一个Text视图。至少在Beta 3中,这具有后来包装Text视图的副作用。

ScrollView {
    VStack {
        Text(someString)
            .lineLimit(nil)
            .frame(idealHeight: .infinity) // Only to the first!
        Text(anotherLongString)
            .lineLimit(nil)
    }
}

如果堆栈中的内容是动态的,请使用以下技巧:

在顶部带有Text("")的单个空白frame(idealHeight: .infinity)视图将产生使后面的Text节点换行的副作用。

ScrollView {
    VStack {
        // Place a single empty / "" at the top of your stack.
        // It will consume no vertical space.
        Text("")
            .lineLimit(nil)
            .frame(idealHeight: .infinity)

        ForEach(someArray) { someString in
            // Omit the `idealHeight: .infinity` trick from
            // all the later Text views.
            Text(someString)
                .lineLimit(nil)
        }
    }
}

注意:

如果堆栈中有.frame(idealHeight: .infinity),则Spacer()不起作用。

以下内容将崩溃:

ScrollView {
    VStack {
        Text(someString)
            .lineLimit(nil)
            .frame(idealHeight: .infinity)
        Spacer()
    }
}

...,除了:

*** Terminating app due to uncaught exception 'CALayerInvalidGeometry', 
reason: 'CALayer position contains NaN: [nan nan].

答案 1 :(得分:4)

您可以强制视图填充其理想大小,例如在垂直ScrollView中:

ScrollView {
    Text("Lorem ipsum dolor sit amet, consectetur adipiscing elit. Integer mattis ullamcorper tortor, nec finibus sapien imperdiet non. Duis tristique eros eget ex consectetur laoreet.")
        .fixedSize(horizontal: false, vertical: true)
}

对我来说,比修改框架好一点。

答案 2 :(得分:2)

以下对我来说适用于 Beta 3 -无间隔,无宽度限制,灵活的高度限制?:

ScrollView {
    VStack {
        Text(longText)
            .lineLimit(nil)
            .font(.largeTitle)
            .frame(idealHeight: .infinity)
    }
}

答案 3 :(得分:1)

SwiftUI中似乎有错误。现在,您必须为VStack容器指定高度

ScrollView {
      VStack {
           // ...
               Text("Lorem ipsum dolor sit amet, consectetur adipiscing elit. Integer mattis ullamcorper tortor, nec finibus sapien imperdiet non. Duis tristique eros eget ex consectetur laoreet.")
                    .lineLimit(nil)
            }.frame(width: UIScreen.main.bounds.width, height: 500)
       }

答案 4 :(得分:0)

正确的解决方案是确保为您的堆栈设置对齐方式:

jq 'reduce inputs[] as $rec (INDEX(.reference); .[$rec.reference | tostring].details += [$rec] ) | map(.)' es_file1.json es_file2.json

VStack(alignment: .leading)

这样您就不需要 ScrollView { VStack(alignment: .leading) { // ... Text("Lorem ipsum dolor sit amet, consectetur adipiscing elit. Integer mattis ullamcorper tortor, nec finibus sapien imperdiet non. Duis tristique eros eget ex consectetur laoreet.") .lineLimit(0) }.frame(width: UIScreen.main.bounds.width) } ,因为布局已正确定义。