我试图将UIKit上下文菜单添加到SwiftUI视图中,因为SwiftUI上下文菜单非常有限。我设法做到了,但是UIViewControllerRepresentable占用的空间比它所需要的要多。我如何调整它的大小,以适应里面的内容?这是我的密码。
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()
}
}发布于 2022-04-07 07:00:35
尝尝这个。首先,将.fixedSize添加到SwiftUI视图中:
ContextMenuView(card: TrackerCard(tracker: tracker))
.fixedSize(horizontal: false, vertical: true)这样,视图应该是水平不受约束的,但根据其首选的大小,它只需要垂直占用尽可能多的空间。
但是您可能会注意到,对于当前的布局,高度会被压缩(一直到0)。
要解决这个问题,我们需要像这样在preferredContentSize中设置UIViewController
override func viewDidLayoutSubviews() {
super.viewDidLayoutSubviews()
let targetSize = CGSize(width: view.bounds.width, height: UIView.layoutFittingCompressedSize.height)
self.preferredContentSize = view.systemLayoutSizeFitting(targetSize)
}有关这方面的更多细节,请参见博客文章自动调整大小的儿童视图。
但是高度可能仍然会被设置为0。在我的例子中,我必须为要按需要计算的首选高度(而不是0)添加一个约束。
controller.view.heightAnchor.constraint(lessThanOrEqualTo: view.heightAnchor).isActive = true希望这能有所帮助。如果不是,如果您编辑了您的答案以包含一个显示问题的预览的最小工作示例,那就更好了。
https://stackoverflow.com/questions/67147350
复制相似问题