この「複製/削除」ね |
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 件のコメント:
コメントを投稿