微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

UIViewControllerRepresentable 高度太大

如何解决UIViewControllerRepresentable 高度太大

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

Screenhot

SwiftUI 代码

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 代码

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()
    }
}

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。