我试图获得类似于Facebook使用的设置(如果他们使用UITextView
)。我希望自动检测链接,但我不想在UITextView
中选择任何其他文本。因此,用户可以点击该链接,但无法选择任何其他文本。UITextView链接可选,无需选择文本的其余部分
尽管四处搜索,我还没有遇到一个解决方案,因为链接选择工作,它需要整个文本视图是可选的。
我试图获得类似于Facebook使用的设置(如果他们使用UITextView
)。我希望自动检测链接,但我不想在UITextView
中选择任何其他文本。因此,用户可以点击该链接,但无法选择任何其他文本。UITextView链接可选,无需选择文本的其余部分
尽管四处搜索,我还没有遇到一个解决方案,因为链接选择工作,它需要整个文本视图是可选的。
您需要防止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
}
}
检测到的任何链接将仍然被启用。我用一个电话号码测试了这个。
您需要继承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
}
}
这还不是最完美的解决方案,但它似乎工作♂️
选定的答案并不在我的情况下工作,我不舒服的未经证实的值内部UIGestureRecognizer
S的内部比较。
我的解决办法是覆盖point(inside:with:)
,并允许抽头通过当用户没有触摸倒在链接的文本:https://stackoverflow.com/a/44878203/1153630
这个解决方案非常出色。 –
这是对我工作;
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不同的另一值。
这不起作用。所有的文本仍然可以选择 –
对不起@AlexSalom,我似乎无法重现。只用新的Swift 3项目测试过,我无法选择文本。你确定你重写了正在使用的Swift版本的正确方法吗? Swift 2和3之间存在差异。 – JAL
我的问题可能与UITextView嵌入到UICollectionView中的事实有关吗? –