2015-01-16 98 views
3

我试图获得类似于Facebook使用的设置(如果他们使用UITextView)。我希望自动检测链接,但我不想在UITextView中选择任何其他文本。因此,用户可以点击该链接,但无法选择任何其他文本。UITextView链接可选,无需选择文本的其余部分

尽管四处搜索,我还没有遇到一个解决方案,因为链接选择工作,它需要整个文本视图是可选的。

回答

2

您需要防止UITextView成为第一响应者。

1.子类UITextView到您自己的自定义类(MyTextView)。

2.覆盖canBecomeFirstResponder()。下面是斯威夫特的例子:

斯威夫特3:

class MyTextView: UITextView { 
    override func becomeFirstResponder() -> Bool { 
     return false 
    } 
} 

斯威夫特2:

class MyTextView: UITextView { 
    override func canBecomeFirstResponder() -> Bool { 
     return false 
    } 
} 

检测到的任何链接将仍然被启用。我用一个电话号码测试了这个。

+3

这不起作用。所有的文本仍然可以选择 –

+0

对不起@AlexSalom,我似乎无法重现。只用新的Swift 3项目测试过,我无法选择文本。你确定你重写了正在使用的Swift版本的正确方法吗? Swift 2和3之间存在差异。 – JAL

+0

我的问题可能与UITextView嵌入到UICollectionView中的事实有关吗? –

3

您需要继承UITextView和覆盖gestureRecognizerShouldBegin (_:)方法是这样的:

override func gestureRecognizerShouldBegin(_ gestureRecognizer: UIGestureRecognizer) -> Bool { 
    if isEditable == false { 
     if let gesture = gestureRecognizer as? UILongPressGestureRecognizer, gesture.minimumPressDuration == 0.5 { 
      return false 
     } 
    } 
    return true 
} 

这将TextView的防止被选中,但链接将如预期

编辑: 原来,当双击并坚持你仍然能够选择文字。当我发现它发生在两次敲击后(不是具有属性“minimalNumberOfTaps”的UITapGesture,而是一个接一个地敲击不同的敲击),所以解决方案是在第一步之后跟踪时间(大约0.7秒) 完整代码:

var lastTapTime: TimeInterval = 0 
    override func gestureRecognizerShouldBegin(_ gestureRecognizer: UIGestureRecognizer) -> Bool { 
     if isEditable == false { 
      if let gesture = gestureRecognizer as? UILongPressGestureRecognizer, gesture.minimumPressDuration == 0.5 { 
     return false 
      } 
     } 
     if Date().timeIntervalSince1970 >= lastTapTime + 0.7 { 
      lastTapTime = Date().timeIntervalSince1970 
      return true 
     } else { 
      return false 
     } 
    } 

这还不是最完美的解决方案,但它似乎工作♂️

+0

谢谢,它解决了我的问题 – Rivendell

+1

似乎部分工作,但如果你双击但在第二个水龙头上保留一点,那么你仍然可以选择文本。也许如果你调整了条件。游戏中使用断点似乎有许多不同的识别器。 – shim

+1

@shim是对的,但这是问题的最佳答案 - 谢谢! – Fraser

1

选定的答案并不在我的情况下工作,我不舒服的未经证实的值内部UIGestureRecognizer S的内部比较。

我的解决办法是覆盖point(inside:with:),并允许抽头通过当用户没有触摸倒在链接的文本:https://stackoverflow.com/a/44878203/1153630

+0

这个解决方案非常出色。 –

0

这是对我工作;

class LinkDetectingTextView: UITextView { 
    override func gestureRecognizerShouldBegin(_ gestureRecognizer: UIGestureRecognizer) -> Bool { 
     if isEditable == false { 
      if let _ = gestureRecognizer as? UITapGestureRecognizer { 
       return false 
      } 

      if let longPressRecognizer = gestureRecognizer as? UILongPressGestureRecognizer, 
       longPressRecognizer.minimumPressDuration == 0.5 { // prevent to select text but allow certain functionality in application 

       return false 
      } 
     } 

     return true 
    } 
} 

此外,在应用程序设置的longPressGestureRecognizer的minimumPressDuration大于0.5不同的另一值。