首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何以编程方式触发UIContextMenuInteraction上下文菜单?

如何以编程方式触发UIContextMenuInteraction上下文菜单?
EN

Stack Overflow用户
提问于 2019-09-01 09:31:34
回答 3查看 10.1K关注 0票数 17

我已经将UIButton设置为UINavigationController中的UIViewController中的rightBarButtonItem,并将iOS13上下文菜单与其相关联。

长时间按下按钮将显示预期的上下文菜单。

是否也可以通过点击按钮来显示上下文菜单(例如,为.touchUpInside事件添加一个目标)?

按钮/barButtonItem设置如下:

代码语言:javascript
复制
let button = UIButton(type: .system)
button.setImage(UIImage(systemName: "plus"), for: .normal)

let barButton = UIBarButtonItem(customView: button)
self.navigationItem.rightBarButtonItem = barButton

let interaction = UIContextMenuInteraction(delegate: self)
button.addInteraction(interaction)

上下文菜单的定义如下:

代码语言:javascript
复制
extension ViewController: UIContextMenuInteractionDelegate {
    func contextMenuInteraction(_ interaction: UIContextMenuInteraction, configurationForMenuAtLocation location: CGPoint) -> UIContextMenuConfiguration? {
        return UIContextMenuConfiguration(identifier: nil, previewProvider: nil) { suggestedActions in
            let importAction = UIAction(title: "Import", image: UIImage(systemName: "folder")) { action in }
            let createAction = UIAction(title: "Create", image: UIImage(systemName: "square.and.pencil")) { action in }
            return UIMenu(title: "", children: [importAction, createAction])
        }
    }
}
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2019-09-03 16:21:53

根据设计,当适当的手势(用力触摸或长按压)发生时,系统会自动显示上下文菜单。你不能手动显示。

来自文档

一个上下文菜单交互对象跟踪支持3D触摸的设备上的Force 手势,以及不支持它的设备上的长按手势。 UIKit 管理所有与菜单相关的交互,并将选定的操作(如果有的话)报告给应用程序。

更新

尽管仍然无法在iOS 14中手动显示上下文菜单,但现在可以将我们为上下文菜单创建的UIMenu显示为下拉菜单。有关如何在@Lobo的回答 14上执行此操作,请查看iOS。

票数 8
EN

Stack Overflow用户

发布于 2020-07-13 11:43:18

iOS 14

iOS 14 (first )现在支持所需的功能。有了下面的代码,UIBarButtonItem上的点击将立即显示菜单(也避免了调用UIContextMenuInteraction造成的模糊背景):

代码语言:javascript
复制
override func viewDidLoad() {
    super.viewDidLoad()
    
    let importAction = UIAction(title: "Import", image: UIImage(systemName: "folder")) { action in }
    let createAction = UIAction(title: "Create", image: UIImage(systemName: "square.and.pencil")) { action in }
    
    let menuBarButton = UIBarButtonItem(
        title: "Add",
        image: UIImage(systemName:"plus"),
        primaryAction: nil,
        menu: UIMenu(title: "", children: [importAction, createAction])
    )
    
    self.navigationItem.rightBarButtonItem = menuBarButton
}

该功能是通过不提供primaryAction来实现的。

您可以使用UIButton实现同样的效果。在这种情况下,您需要设置

代码语言:javascript
复制
button.showsMenuAsPrimaryAction = true

UIButton的完整代码如下所示:

代码语言:javascript
复制
override func viewDidLoad() {
    super.viewDidLoad()
   
    let button = UIButton(type: .system)
    button.setImage(UIImage(systemName: "plus"), for: .normal)
    button.translatesAutoresizingMaskIntoConstraints = false
    view.addSubview(button)
    
    NSLayoutConstraint.activate([
        button.centerXAnchor.constraint(equalTo: view.centerXAnchor),
        button.centerYAnchor.constraint(equalTo: view.centerYAnchor)
    ])
    
    let importAction = UIAction(title: "Import", image: UIImage(systemName: "folder")) { action in }
    let createAction = UIAction(title: "Create", image: UIImage(systemName: "square.and.pencil")) { action in }
    
    let items = [importAction, createAction]
    
    button.menu = UIMenu(title: "Add", children: items)
    button.showsMenuAsPrimaryAction = true
}
票数 9
EN

Stack Overflow用户

发布于 2022-05-06 09:52:55

使用私有API可以完成这项工作。

代码语言:javascript
复制
@objc
func buttonTapped() {
    // _presentMenuAtLocation:
    guard let interaction = imageView.interactions.first,
          let data = Data(base64Encoded: "X3ByZXNlbnRNZW51QXRMb2NhdGlvbjo="),
          let str = String(data: data, encoding: .utf8)
    else {
        return
    }
    let selector = NSSelectorFromString(str)
    guard interaction.responds(to: selector) else {
        return
    }
    interaction.perform(selector, with: CGPoint.zero)
}
票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/57744812

复制
相关文章

相似问题

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