给 View 加长按手势弹出自定义 Items 的 Menu 大概如下:
let longPress = UILongPressGestureRecognizer(target: self, action: "handleLongPress:") textContentTextView.addGestureRecognizer(longPress) func handleLongPress(longPress: UILongPressGestureRecognizer) { if longPress.state == .Began { if let view = longPress.view, superview = view.superview { let menu = UIMenuController.sharedMenuController() let loveItem = UIMenuItem(title: "Love", action:"loveAction") menu.menuItems = [loveItem] menu.setTargetRect(view.frame, inView: superview) menu.setMenuVisible(true, animated: true) } } }
但 UIMenuController 必须要在 View canBecomeFirstResponder 的前提下才能弹出。而对于自定义的 UITextView,若我们需要禁止选择(但不禁止点击链接),那要重载 canBecomeFirstResponder()
为:
override func canBecomeFirstResponder() -> Bool { return false }
由此,我们就不能在这个自定义的 TextView 上通过加长按手势进而弹出 UIMenuController,得自己写一个自定义的 Menu 了。
如果不想自己画 Menu 那么可以将 UITextView 嵌套进一个 UIView 里,把 UILongPressGestureRecognizer 添加到 UIView 上。
通过设置 Gesture 的 Delegate
func gestureRecognizer(gestureRecognizer: UIGestureRecognizer, shouldRecognizeSimultaneouslyWithGestureRecognizer otherGestureRecognizer: UIGestureRecognizer) -> Bool { return true }
来使 UITextView 和 UIView 上的 UILongPressGestureRecognizer 都可以被识别出来。