UIHostingController应该扩展为适合内容

问题描述 投票:11回答:1

我有一个自定义的UIViewControllerRepresentable(下面显示了与布局相关的代码)。这会尝试复制本机SwiftUI ScrollView,除了它会从顶部(底部除外)滚动。

查看层次结构

view: UIView
|
\- scrollView: UIScrollView
   |
   \- innerView: UIView
      |
      \- hostingController.view: SwiftUI hosting view

初始化视图后,所有这些均按预期工作。托管视图填充了其内容,并且约束条件确保正确设置了滚动视图的contentSize

但是,当托管视图的内容更改时,hostingController.view不会调整大小以适合其内容。

Screenshot of UI capture from app in Xcode. Shows contents of hosting controller expanding behind the bounds of the hosting view itself, without properly resizing.

绿色:按预期,滚动视图与托管视图控制器的大小匹配。

蓝色:托管视图本身。它保持了第一次加载时的大小,并且不会像预期的那样消耗。

红色:主机视图中的堆栈视图。在此屏幕快照中,内容已添加到堆栈中,导致其扩展。您可以看到大小上的差异。

UIHostingController(蓝色)应展开以适合其内容(红色)。

显式设置滚动视图的内容大小,因为这是由自动布局处理的。约束代码如下所示,如果有帮助。

class UIBottomScrollViewController<Content: View>: UIViewController, UIScrollViewDelegate { var hostingController: UIHostingController<Content>! = nil init(rootView: Content) { self.hostingController = UIHostingController<Content>(rootView: rootView) super.init(nibName: nil, bundle: nil) } required init?(coder: NSCoder) { fatalError("init(coder:) has not been implemented") } var scrollView: UIScrollView = UIScrollView() var innerView = UIView() override func loadView() { self.view = UIView() self.addChild(hostingController) view.addSubview(scrollView) scrollView.addSubview(innerView) innerView.addSubview(hostingController.view) scrollView.delegate = self scrollView.scrollsToTop = true scrollView.isScrollEnabled = true scrollView.clipsToBounds = false scrollView.layoutMargins = .zero scrollView.preservesSuperviewLayoutMargins = true scrollView.leftAnchor.constraint(equalTo: view.leftAnchor).isActive = true scrollView.rightAnchor.constraint(equalTo: view.rightAnchor).isActive = true scrollView.topAnchor.constraint(equalTo: view.topAnchor).isActive = true scrollView.bottomAnchor.constraint(equalTo: view.bottomAnchor).isActive = true innerView.topAnchor.constraint(equalTo: scrollView.topAnchor).isActive = true innerView.leftAnchor.constraint(equalTo: view.leftAnchor).isActive = true innerView.rightAnchor.constraint(equalTo: view.rightAnchor).isActive = true innerView.leftAnchor.constraint(equalTo: scrollView.leftAnchor).isActive = true innerView.rightAnchor.constraint(equalTo: scrollView.rightAnchor).isActive = true innerView.bottomAnchor.constraint(equalTo: scrollView.bottomAnchor).isActive = true hostingController.view.topAnchor.constraint(equalTo: innerView.topAnchor).isActive = true hostingController.view.leftAnchor.constraint(equalTo: innerView.leftAnchor).isActive = true hostingController.view.rightAnchor.constraint(equalTo: innerView.rightAnchor).isActive = true hostingController.view.bottomAnchor.constraint(equalTo: innerView.bottomAnchor).isActive = true hostingController.view.autoresizingMask = [] hostingController.view.layoutMargins = .zero hostingController.view.insetsLayoutMarginsFromSafeArea = false hostingController.view.translatesAutoresizingMaskIntoConstraints = false scrollView.autoresizingMask = [] scrollView.layoutMargins = .zero scrollView.insetsLayoutMarginsFromSafeArea = false scrollView.translatesAutoresizingMaskIntoConstraints = false innerView.autoresizingMask = [] innerView.layoutMargins = .zero innerView.insetsLayoutMarginsFromSafeArea = false innerView.translatesAutoresizingMaskIntoConstraints = false hostingController.didMove(toParent: self) scrollView.keyboardDismissMode = .interactive } } struct BottomScrollView<Content: View>: UIViewControllerRepresentable { var content: () -> Content init(@ViewBuilder content: @escaping () -> Content) { self.content = content } func makeUIViewController(context: Context) -> UIBottomScrollViewController<Content> { let vc = UIBottomScrollViewController(rootView: self.content()) return vc } func updateUIViewController(_ viewController: UIBottomScrollViewController<Content>, context: Context) { viewController.hostingController.rootView = self.content() } }

我有一个自定义的UIViewControllerRepresentable(下面显示了与布局相关的代码)。这会尝试复制本机SwiftUI ScrollView,但它会从底部(顶部除外)滚动。查看...
ios swift swiftui ios-autolayout uihostingcontroller
1个回答
0
投票
我在类似的视图层次结构中遇到了相同的问题,并发现了一个丑陋的骇客使其工作。基本上,我添加一个高度约束并手动更新常量:
© www.soinside.com 2019 - 2024. All rights reserved.