从SwiftUI中的UIKit更新UIViewRepresentable大小

时间:2019-07-28 02:47:23

标签: swiftui

我将高度为UITextView的视图控制器嵌入父SwiftUI VStack中,并且视图控制器将其帧大小调整为viewDidLoadviewDidLayoutSubviews之间的整个屏幕。 UITextView仅在其内部扩展为文本大小,并在父视图内部居中。

我正在尝试在VStack中添加此视图控制器,并使其外部行为像其他SwiftUI组件一样-精确调整其包含的内容的大小-但它希望调整为整个屏幕的大小,减去其他VStack元素。

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

在下面的示例屏幕快照中,橙色是嵌入的UIView背景,绿色是UITextView,VStack如下所示:

    VStack {
        HighligherVC()
        Text("Tap and drag to highlight")
            .foregroundColor(.gray)
            .font(.caption)
    }

example of the parent uiview expanding to be too high

2 个答案:

答案 0 :(得分:2)

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

  

我可以在didLayoutSubviews中获取正确的UITextView大小,然后将其向上传递到可以正确设置的SwiftUI,但是我应该在哪里做呢?

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

@State private var textViewHeight: CGFloat = 0

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

@Binding var textViewHeight: CGFloat

init(textViewHeight: Binding<CGFloat>) {
    self._textViewHeight = textViewHeight
}

然后将textViewHeight设置为didLayoutSubviews中的计算高度,并向.frame中添加HighlighterVC修饰符,如下所示:

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

就像我在回答开始时所说的那样,此解决方案(我相信会奏效,但由于我无法对其进行测试,所以我不是100%肯定)是基于您对您的想法的想法需要。没有看到更多的代码,我无法说这是否是最好的解决方案。

答案 1 :(得分:0)

添加fixedSize可能会解决此问题。 .fixedSize(horizontal: false, vertical: true)