16

UINavigationController 内の UIViewController で UIButton を rightBarButtonItem として設定し、それに iOS13 コンテキスト メニューを関連付けました。

ボタンを長押しすると、期待どおりにコンテキスト メニューが表示されます。

ボタンをタップしてもコンテキスト メニューを表示する方法はありますか (.touchUpInside イベントのターゲットを追加するなど)?

button/barButtonItem は次のように設定されます。

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)

コンテキスト メニューは次のように定義されます。

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])
        }
    }
}
4

2 に答える 2

10

iOS14

iOS 14 (最初のベータ版) は、必要な機能をサポートするようになりました。次のコードでは、UIBarButtonItemをタップするとすぐにメニューが表示されます (また、UIContextMenuInteraction の呼び出しによる背景のぼやけも回避されます)。

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を使用して同じ効果を実現できます。その場合、設定する必要があります

button.showsMenuAsPrimaryAction = true

UIButton の完全なコードは次のようになります。

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
}

于 2020-07-13T11:43:18.537 に答える