SwiftUI - 如何扩展TextField以填充整个视图

3

我正在尝试创建一个跨越整个窗口的文本字段。目前它只能在水平轴上扩展以填充视图。我希望实现类似TextEdit中看到的效果。

以下是我的代码:

struct ContentView: View {
    @State var contents: String = "Hello World\nThis is a test.";

    var body: some View {
        VStack() {
            TextField("Notes", text: $contents)
                .lineLimit(nil)
        }
        .frame(height: 600)
    }
}

应用截图

在SwiftUI中是否有可能实现这个功能,还是需要使用传统的AppKit组件?


1
我相信这是一个独立的问题,因为我在创建多行文本框方面没有问题,这已经实现了。我的问题是询问如何将此文本框扩展以填充视图。 - Stanley Fuller
3个回答

2

我来回复一下,因为除了包装UIKit之外,还没有人给出一个像样的答案。

TextEditor(text: $contents)

使用Better Path是更好的选择,因为它会按照您的意愿进行操作,而不像TextField()。它会自动处理滚动和扩展到允许的视图区域。

TextEditor需要至少iOS 14。如果您没有iOS 14,则包装UIKit控件是最佳选择。


1

看起来,TextField 的行限制存在漏洞,根据这个答案和相关评论。

我相信在这个帖子中,你可以找到答案,如何实现你想要的。


1

我发现在SwiftUI中实现类似TextEdit的文本包装仍然需要使用NSTextView,因此现在你至少需要在SwiftUI代码中使用传统的AppKit组件。

struct MultilineTextView: NSViewRepresentable {
    typealias NSViewType = NSTextView

    @Binding var text: String

    func makeNSView(context: Self.Context) -> Self.NSViewType{
        let view = NSTextView()
        view.isEditable = true
        view.isRulerVisible = true
        return view
    }

    func updateNSView(_ nsView: Self.NSViewType, context: Self.Context) {
        nsView.string = text
    }
}


struct ContentView: View {
    @State var contents: String = "Hello World\nThis is a test.";

    var body: some View {
        VStack() {
            MultilineTextView(text: $contents)
        }.background(Color.white)
    }
}

谢谢,这是一个不错的替代方案。希望苹果在未来更新SwiftUI以支持此功能,而无需使用AppKit。 - Stanley Fuller

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接