首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >UIViewControllerRepresentable高度太大了

UIViewControllerRepresentable高度太大了
EN

Stack Overflow用户
提问于 2021-04-18 10:07:04
回答 1查看 261关注 0票数 1

我试图将UIKit上下文菜单添加到SwiftUI视图中,因为SwiftUI上下文菜单非常有限。我设法做到了,但是UIViewControllerRepresentable占用的空间比它所需要的要多。我如何调整它的大小,以适应里面的内容?这是我的密码。

筛热

SwiftUI代码

代码语言:javascript
复制
struct TrackerCard: View {
    var tracker: Tracker
    var body: some View {
        HStack {
            HStack {
               ...
            }
            .padding()
            .background(Color("Wrapper"))
            .cornerRadius(15)
        }
        .padding(.horizontal)
    }
}

struct TrackerCardView: View {
    var tracker: Tracker
    var body: some View {
        ContextMenuView(card: TrackerCard(tracker: tracker))
    }
}

UIKit代码

代码语言:javascript
复制
class ContextMenuController : UIViewController, UIContextMenuInteractionDelegate {
    
    var card: TrackerCard?
    var hostingViewController: UIHostingController<TrackerCard>?
    
    func setViewController(_ controller : UIHostingController<TrackerCard>) {
        hostingViewController = controller
        self.addChild(controller)
        controller.view.translatesAutoresizingMaskIntoConstraints = false
        view.backgroundColor = .init(white: 1, alpha: 1)
        view.addSubview(controller.view)
        controller.didMove(toParent: self)
        controller.view.widthAnchor.constraint(equalTo: view.widthAnchor).isActive = true
    }
    
    func setInteraction() {
        let interaction = UIContextMenuInteraction(delegate: self)
        hostingViewController?.view.addInteraction(interaction)
    }
    
    func contextMenuInteraction(_ interaction: UIContextMenuInteraction, configurationForMenuAtLocation location: CGPoint) -> UIContextMenuConfiguration? {
        return ...
}

struct ContextMenuView: UIViewControllerRepresentable {
    typealias UIViewControllerType = ContextMenuController
    var card: TrackerCard
    var controller : UIViewControllerType? = nil
    
    func makeUIViewController(context: Context) -> ContextMenuController {
        let contextMenuController = controller ?? ContextMenuController()
        contextMenuController.card = card
        return contextMenuController
    }

    func updateUIViewController(_ contextMenuController: ContextMenuController, context: Context) {
        contextMenuController.setViewController(UIHostingController(rootView: card))
        contextMenuController.setInteraction()
    }
}
EN

回答 1

Stack Overflow用户

发布于 2022-04-07 07:00:35

尝尝这个。首先,将.fixedSize添加到SwiftUI视图中:

代码语言:javascript
复制
ContextMenuView(card: TrackerCard(tracker: tracker))
    .fixedSize(horizontal: false, vertical: true)

这样,视图应该是水平不受约束的,但根据其首选的大小,它只需要垂直占用尽可能多的空间。

但是您可能会注意到,对于当前的布局,高度会被压缩(一直到0)。

要解决这个问题,我们需要像这样在preferredContentSize中设置UIViewController

代码语言:javascript
复制
override func viewDidLayoutSubviews() {
    super.viewDidLayoutSubviews()

    let targetSize = CGSize(width: view.bounds.width, height: UIView.layoutFittingCompressedSize.height)
    self.preferredContentSize = view.systemLayoutSizeFitting(targetSize)
}

有关这方面的更多细节,请参见博客文章自动调整大小的儿童视图

但是高度可能仍然会被设置为0。在我的例子中,我必须为要按需要计算的首选高度(而不是0)添加一个约束。

代码语言:javascript
复制
controller.view.heightAnchor.constraint(lessThanOrEqualTo: view.heightAnchor).isActive = true

希望这能有所帮助。如果不是,如果您编辑了您的答案以包含一个显示问题的预览的最小工作示例,那就更好了。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/67147350

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档