我将高度为UITextView
的视图控制器嵌入父SwiftUI VStack中,并且视图控制器将其帧大小调整为viewDidLoad
和viewDidLayoutSubviews
之间的整个屏幕。 UITextView
仅在其内部扩展为文本大小,并在父视图内部居中。
我正在尝试在VStack中添加此视图控制器,并使其外部行为像其他SwiftUI组件一样-精确调整其包含的内容的大小-但它希望调整为整个屏幕的大小,减去其他VStack元素。
我可以在UITextView
中获得didLayoutSubviews
的正确大小,并将其向上传递到可以正确设置的SwiftUI-但是我应该在哪里做呢?
在下面的示例屏幕快照中,橙色是嵌入的UIView
背景,绿色是UITextView
,VStack如下所示:
VStack {
HighligherVC()
Text("Tap and drag to highlight")
.foregroundColor(.gray)
.font(.caption)
}
答案 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)