UITextView - настроить размер на основе содержимого в SwiftUI - PullRequest
2 голосов
/ 02 ноября 2019

Я пытаюсь выяснить, как сделать размер UITextView зависимым от его содержимого в SwiftUI. Я обернул UITextView в UIViewRepresentable следующим образом:

struct TextView: UIViewRepresentable {

    @Binding var showActionSheet: Bool

    func makeCoordinator() -> Coordinator {
        Coordinator(self)
    }

    func makeUIView(context: Context) -> UITextView {

        let uiTextView = UITextView()
        uiTextView.delegate = context.coordinator

        uiTextView.font = UIFont(name: "HelveticaNeue", size: 15)
        uiTextView.isScrollEnabled = true
        uiTextView.isEditable = true
        uiTextView.isUserInteractionEnabled = true
        uiTextView.backgroundColor = UIColor(white: 0.0, alpha: 0.05)
        uiTextView.isEditable = false

        return uiTextView
    }

    func updateUIView(_ uiView: UITextView, context: Context) {
        uiView.attributedText = prepareText(question: question)

        var frame = uiView.frame
        frame.size.height = uiView.contentSize.height
        uiView.frame = frame
    }

    func prepareText(text: string) -> NSMutableAttributedString {
        ...................
        return attributedText
    }

    class Coordinator : NSObject, UITextViewDelegate {

        var parent: TextView

        init(_ view: TextView) {
            self.parent = view
        }

        func textView(_ textView: UITextView, shouldInteractWith URL: URL, in characterRange: NSRange) -> Bool {
            parent.showActionSheet = true
            return false
        }
    }
}

Далее я попытался изменить размер кадра в updateUIView на основе его размера содержимого, но это не имело никакого эффекта. Я полагаю, что на этом этапе представление не является даже макетом, и его кадр переопределяется где-то еще. Буду очень признателен, если кто-нибудь укажет мне правильное направление.

...