#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. Вот почему на данный момент мне нужны расчеты.