在 SwiftUI 中从 UIKit 更新 UIViewRepresentable 大小

Nic*_*ick 7 swiftui

我在UITextView父 SwiftUI VStack 中嵌入了一个具有可变高度的视图控制器,并且视图控制器将它的框架大小调整为viewDidLoad和之间的整个屏幕viewDidLayoutSubviews。该UITextView扩展只能内部本身和中心本身的文本父视图内的大小。

我正在尝试将这个视图控制器添加到 VStack 中,并让它在外部表现得像其他 SwiftUI 组件一样 - 大小与它包含的内容完全一致 - 但它希望大小为整个屏幕减去其他 VStack 元素。

我可以获得正确的UITextViewin大小didLayoutSubviews并将其向上传递给 SwiftUI,在那里它可以正确设置 - 但我在哪里做呢?

在下面的示例截图中,橙色是嵌入的UIView背景,绿色是UITextView并且 VStack 看起来像这样:

    VStack {
        HighligherVC()
        Text("Tap and drag to highlight")
            .foregroundColor(.gray)
            .font(.caption)
    }
Run Code Online (Sandbox Code Playgroud)

父 uiview 扩展过高的示例

gra*_*ell 6

由于无法看到更多代码,因此很难说出最佳解决方案是什么,但纯粹基于您问题的这一部分......

我可以在 didLayoutSubviews 中获得 UITextView 的正确大小并将其向上传递给 SwiftUI,在那里可以正确设置它 - 但我在哪里做呢?

我建议您将绑定属性传递给您的视图控制器,该属性可以设置为计算出的文本视图高度,这意味着包含您的视图VStack将具有如下@State属性:

@State private var textViewHeight: CGFloat = 0
Run Code Online (Sandbox Code Playgroud)

然后,您将@Binding在您的上声明一个属性HighlighterVC并添加一个如下所示的初始化程序:

@Binding var textViewHeight: CGFloat

init(textViewHeight: Binding<CGFloat>) {
    self._textViewHeight = textViewHeight
}
Run Code Online (Sandbox Code Playgroud)

然后您将设置textViewHeight为您的计算高度并为您didLayoutSubviews添加一个.frame修改器,HighlighterVC如下所示:

VStack {
    HighlighterVC(textViewHeight: self.$textViewHeight)
        .frame(height: self.textViewHeight)
    Text("Tap and drag to highlight")
        .foregroundColor(.gray)
        .font(.caption)
}
Run Code Online (Sandbox Code Playgroud)

就像我在回答开头所说的那样,这个解决方案(我认为可行,但由于我无法对其进行测试,因此我不是 100% 确定)基于您对所需内容的想法。在没有看到更多代码的情况下,我不可能说这是否是最好的解决方案。