2018年5月10日木曜日

MenuControllerを表示

この「複製/削除」ね
Text関係をタップした時なんかにコピー/カット/ペースト/ユーザ辞書…とか表示される横長のメニューあるでしょ? あれを使いたいの。

お約束としてやらなきゃならないことはあるけど、難しくないんでコードだけ書いとく。
UIViewのサブクラスとして作っておかないとcanPerformAction()とかが使えないので注意。
タップしてメニューを出したいUIをFirstResponderにするのがキモ。TextFieldとかなら、編集始めると自動でFirstResponderになってくれるからその辺の処理がいらないかも?


//Swift4
//メニュー表示
func makeMenu() -> Void {
    //先にFirstResponderにしとかないとメニューは表示されない
    becomeFirstResponder()
    //複製、削除メニュー
    let menu = UIMenuController.shared
    menu.isMenuVisible = true
    menu.arrowDirection = .up //メニューの矢印(ふきだしのしっぽみたいなの)の向き
    menu.setTargetRect(self.bounds, in: self)
    //メニューアイテム
    let menuItem1 = UIMenuItem(title: "複製", action: #selector(Fukidasi.onDuplicate(sender:)))
    let menuItem2 = UIMenuItem(title: "削除", action: #selector(Fukidasi.onDelete(sender:)))
    let menuItems = [menuItem1, menuItem2]
    menu.menuItems = menuItems
    menu.setMenuVisible(true, animated: true)

}


//ふきだしのUIViewがFirstResponderにならないとメニューは表示されない
//以前はfuncだったものが最近readOnlyでfalseを返すvarに変わったので、overrideしてtrueを返させる
override var canBecomeFirstResponder: Bool {
    return true
}

//これmenu表示に必要
override func canPerformAction(_ action: Selector, withSender sender: Any!) -> Bool {
    if action == #selector(Fukidasi.onDuplicate(sender:)) ||
        action == #selector(Fukidasi.onDelete(sender:)) {
        return true
    }
    return false
}

@objc func onDuplicate(sender: UIMenuItem) {
    print("複製された")
}

@objc func onDelete(sender: UIMenuItem) {
    print("削除された")
}

0 件のコメント:

コメントを投稿