Автоматический внутренний размер для пользовательского просмотра UIKit внутри SwiftUI

#swift #swiftui #uikit

#быстрый #свифтуи #уикит

Вопрос:

Я пытаюсь использовать пользовательское представление UIKit с именем LegalMentionView (состоящее из 1 вертикального стекового представления с 2 метками внутри и 1 кнопкой) в моем представлении SwiftUI.

Таким образом, представление стека имеет фиксированную ширину, но не заданную высоту, поскольку метки являются многострочными.

Я попытался поиграть с ограничениями автоматической компоновки, но это не сработало.

Единственный способ (плохой, я думаю) Я обнаружил, что вычисление высоты с помощью GeometryReader with Bindinglt;CGFloatgt; позволяет передавать значение через представление SwiftUI.

Вот код:

 @State private var legalMentionViewHeight: CGFloat = .zero  /// body VStack {  ...  GeometryReader { reader in  LegalMentionViewWrapped(  desiredWidth: reader.size.width, // read full available width  viewModel: legalMentionViewModel,  computedHeight: $legalMentionViewHeight) // pass `legalMentionViewHeight` as binding  }  .frame(height: legalMentionViewHeight) // set frame height on `legalMentionViewHeight` changes  ... }  /// Wrapper final class LegalMentionViewWrapped: UIViewRepresentable {    public init(desiredWidth: CGFloat, viewModel: LegalMentionViewModel, computedHeight: Bindinglt;CGFloatgt;) {  self.desiredWidth = desiredWidth  self.viewModel = viewModel  _computedHeight = computedHeight  }    /// The desired width helping to compute its intrinsic size  private var desiredWidth: CGFloat    private var viewModel: LegalMentionViewModel    /// Binding computed height used for the SwiftUI view  @Binding private var computedHeight: CGFloat    public func makeUIView(context: Context) -gt; some LegalMentionView {  return LegalMentionView(viewModel: viewModel)  }    public func updateUIView(_ legalMentionView: UIViewType, context: Context) {  legalMentionView.viewModel = viewModel    computeIntrisicSize(legalMentionView)  }   private func computeIntrisicSize(_ view: LegalMentionView) {  let targetSize = CGSize(width: desiredWidth, height: UIView.layoutFittingCompressedSize.height)  let fittingSize = view.systemLayoutSizeFitting(targetSize,  withHorizontalFittingPriority: .defaultHigh,  verticalFittingPriority: .fittingSizeLevel)    computedHeight = fittingSize.height  } }  

У кого-нибудь есть идея получше, чтобы получить правильную высоту более динамично / без странных вычислений?

Комментарии:

1. Не совсем уверен, чего вы пытаетесь достичь. В большинстве случаев вообще не требуется никаких вычислений для представимых (если только их собственные внутренние! макет правильный)

2. Когда я не использую GeometryReader и привязку computedHeight, внутренний размер моего пользовательского представления UIKit всегда равен 0. Вот почему на данный момент мне нужны расчеты.