转载

使用 UIMenuController 的前提

一种取舍

给 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 了。

来自 @Naituw 的 Workaround

如果不想自己画 Menu 那么可以将 UITextView 嵌套进一个 UIView 里,把 UILongPressGestureRecognizer 添加到 UIView 上。

通过设置 Gesture 的 Delegate

func gestureRecognizer(gestureRecognizer: UIGestureRecognizer, shouldRecognizeSimultaneouslyWithGestureRecognizer otherGestureRecognizer: UIGestureRecognizer) -> Bool {     return true       } 

来使 UITextView 和 UIView 上的 UILongPressGestureRecognizer 都可以被识别出来。

正文到此结束
Loading...