SwiftUI UITextView包装器如何调整内容大小以匹配父对象

时间:2020-03-20 16:51:03

标签: uitextview swiftui uiviewrepresentable

我有这样的UITextView包装器,它可以工作,但是当我将其放在List行中时。我希望它自动调整大小,即在这种情况下,其宽度与父级匹配,即List Row VStack {},而高度则根据文本长度自动调整大小。文字应换行。 现在它几乎可以使用了,但是较长的文本(如URL)超出了可用的行宽。

List {
VStack(alignment: .leading) {
     if self.hasNote {
        TextView(text: text)

     }
}
struct TextView: UIViewRepresentable {

    // MARK: - Properties
    let text: String

    init(text: String) {
        self.text = text
    }

    func makeUIView(context: Context) -> UITextView {

        let textView = UITextView()
        //textView.autoresizingMask = [.flexibleWidth, .flexibleHeight]
        textView.backgroundColor = UIColor.clear
        textView.isScrollEnabled = false
        textView.attributedText = self.attributedText
        textView.textContainer.lineBreakMode = .byWordWrapping
        //textView.layoutIfNeeded()
        textView.sizeToFit()
        return textView
    }

}

更新

现在我有了类似的东西,它确实适合父SwiftUI视图(列表中的行),但是它不包裹文本(或根据内容大小垂直拉伸。如果滚动,则可以正确包裹文本)。 另外,如果我设置.frame(height:500),我可以看到它包装了文字。但是无法正确调整大小。

 func makeUIView(context: Context) -> UITextView {

        let textView = UITextView()

        textView.backgroundColor = UIColor.clear
        textView.isScrollEnabled = false
        textView.isSelectable = true

        let linkAttrs : [NSAttributedString.Key : Any]  = [
            .foregroundColor: accentColor,
            .underlineColor: accentColor,
            .underlineStyle: NSUnderlineStyle.single.rawValue
        ]

        textView.linkTextAttributes = linkAttrs
        textView.attributedText = self.attributedText
        textView.textContainer.lineBreakMode = .byWordWrapping

        textView.setContentCompressionResistancePriority(.defaultLow, for: .horizontal)
        textView.setContentCompressionResistancePriority(.defaultHigh, for: .vertical)
        textView.setContentHuggingPriority(.defaultHigh, for: .horizontal)
        textView.setContentHuggingPriority(.defaultLow, for: .vertical)
        textView.sizeToFit()

        return textView
    }

0 个答案:

没有答案