【问题标题】:Update UIViewRepresentable size from UIKit in SwiftUI在 SwiftUI 中从 UIKit 更新 UIViewRepresentable 大小
【发布时间】:2019-12-05 20:01:06
【问题描述】:

我在父 SwiftUI VStack 中嵌入了一个高度可变的视图控制器 UITextView,视图控制器将其框架调整为在 viewDidLoadviewDidLayoutSubviews 之间的整个屏幕。 UITextView 仅扩展到自身内部的文本大小,并在父视图中居中。

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

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

在下面的示例截图中,橙色是嵌入的UIView 背景,绿色是UITextView,VStack 如下所示:

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

【问题讨论】:

标签: swiftui


【解决方案1】:

添加 fixedSize 可以解决这个问题。 .fixedSize(horizontal: false, vertical: true)

【讨论】:

    【解决方案2】:

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

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

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

    @State private var textViewHeight: CGFloat = 0
    

    然后,您将在您的 HighlighterVC 上声明 @Binding 属性并添加如下初始化器:

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

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

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

    就像我在回答开头所说的那样,这个解决方案(我相信它会起作用,但由于我无法测试它,我不能 100% 确定)是基于你对你的想法需要。没有看到更多代码,我无法说这是否是最好的解决方案。

    【讨论】:

      猜你喜欢
      • 2023-04-06
      • 1970-01-01
      • 2022-08-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-01-22
      • 1970-01-01
      • 2021-04-20
      相关资源
      最近更新 更多