iOS 7中的UITextView链接检测

我有一个UITextView通过Interface Builder进行pipe理。 作为数据检测我有“链接”选中。 在iOS 6中,一切工作正常,链接突出显示,可点击。 不过在iOS 7中,所有链接仍然只是纯文本。 可编辑和可select的checkbox未被选中。

值得关注的是UITextView是一个容器视图的子视图,它也是在UIScrollView

看来,在iOS 7链接检测只有在UITextView可选时才有效。 所以使我的UITextView不可选停止链接检测工作。

我也在iOS 6中testing了这一点,我可以确认,在iOS 6中,即使UITextView不可选,链接检测也能正常工作。

我今天遇到了一些电话号码检测问题。 看起来UITextView会保留旧的电话号码,并在将文本设置为其他内容后保持文本高亮显示。

我发现,如果我设置文本:无将文本设置为新的string,它会重置文本视图,电话号码将突出显示为正常。 我想知道这是否与iOS 7.0中的UITextView的某种types的错误

无论哪种方式,这对我有用。

当iOS7第一次出来这困扰着我,我在这个线程中find了答案(设置实际值的技巧之前设置UITextView的文本属性为零)。 然后突然,问题(对我来说,整个string被突出显示为一个链接)裁剪(假设由于iOS更新)。

对我来说终于做了什么是停止使用文本属性,并设置属性的文字。 一旦我这样做,需要设置字体/滚动/可选/可编辑/等。 以编程方式,消失。 我在IB中定义了我的UITextView,根据需要设置值(不可滚动,不可编辑,可选,检测链接和电话号码),然后构build属性string并设置:

 myUITextView.attributedString = myAttributedString; 

突然间一切都按预期工作。 希望这可以帮助其他人。

我有同样的问题,禁用滚动UITextView激活加载链接检测,而不是只有当用户已经与textview交互工作。 UITextView也必须是可选的和不可编辑的。

 detailTextView.scrollEnabled = NO; detailTextView.editable = NO; detailTextView.selectable = YES; 

在iOS6上可选或启用滚动不是必需的。

另一个要检查的是,在单元的单元格和内容视图上启用了用户交互,否则该链接将不可点击。

UItableView单元格中,必须添加检查这些行以使用textview数据检测器属性。

  txtvwMsgText.userInteractionEnabled = YES; txtvwMsgText.dataDetectorTypes = UIDataDetectorTypeLink; txtvwMsgText.scrollEnabled = NO; txtvwMsgText.editable = NO; txtvwMsgText.selectable = YES; 

你应该检查出NSDataDetector

您可以使用它来查找和处理不同的数据(链接,电话号码等)。 看看这个网站:

http://nshipster.com/nsdatadetector/

您还可以使用UITextViewdataDetectorTypes属性来设置代码中要检测的内容。 可能只是你的故事板转换问题。

 textView.dataDetectorTypes = UIDataDetectorTypeLink; 

请注意,您的textview只会识别不可编辑的链接

这里有一个很好的教程,介绍如何使用“链接检测”来editable UITextView

可编辑的UITextView链接检测

从现在起,我从来没有遇到任何问题。

诀窍是一个GestureRecognizer强制触摸和启用/禁用编辑。

你可以在iOS7上应用与selectable / not selectable问题相同的东西

经过几次testing,我find了解决办法。

如果您希望链接处于活动状态,并且不会启用select,则需要编辑gestureRecognizers。

例如 – 有3个LongPressGestureRecognizers。 一个用于点击链接(minimumPressDuration = 0.12),第二个用于放大可编辑模式(minimumPressDuration = 0.5),第三个用于select(minimumPressDuration = 0.8)。 此解决scheme删除LongPressGestureRecognizerselect,第二个放大编辑模式。

 NSArray *textViewGestureRecognizers = self.captionTextView.gestureRecognizers; NSMutableArray *mutableArrayOfGestureRecognizers = [[NSMutableArray alloc] init]; for (UIGestureRecognizer *gestureRecognizer in textViewGestureRecognizers) { if (![gestureRecognizer isKindOfClass:[UILongPressGestureRecognizer class]]) { [mutableArrayOfGestureRecognizers addObject:gestureRecognizer]; } else { UILongPressGestureRecognizer *longPressGestureRecognizer = (UILongPressGestureRecognizer *)gestureRecognizer; if (longPressGestureRecognizer.minimumPressDuration < 0.3) { [mutableArrayOfGestureRecognizers addObject:gestureRecognizer]; } } } self.captionTextView.gestureRecognizers = mutableArrayOfGestureRecognizers; 

在iOS 9上testing,但它应该适用于所有版本(iOS 7,8,9)。 我希望它有帮助! 🙂

我已经find了这个技巧,这在iOS 7中起作用!

你必须设置UITextView可select在你的xib或编程

 self.yourTextView.selectable = YES; 

然后你必须禁用滚动和设置您的文字后再次启用。

 self.yourTextView.scrollEnabled = NO; [self.yourTextView setText:contentString]; self.yourTextView.scrollEnabled = YES; 

所以使用UITextView保持启用,可select,不可滚动和链接可检测并不像看起来那么简单。 我在iOS 8中遇到了这个问题。所以我的解决scheme是在viewDidLoad中做这样的事情,然后在编辑完文本框(通常是像doneIsTapped这样的方法)时将editable属性设置为NO。 这里的技巧是将文本值设置为textview完成后,将可编辑的属性设置为NO。 这将启用UITextview中的链接。

 - (void)viewDidLoad { [super viewDidLoad]; self.txtViewComment.editable = YES; self.txtViewComment.selectable = YES; self.txtViewComment.dataDetectorTypes = UIDataDetectorTypeLink; self.txtViewComment.scrollEnabled = NO; } 

 - (IBAction)doneIsTapped:(id)sender { self.txtViewComment.text = @"set text what ever you want"; self.txtViewComment.editable = NO; } 

这使得在textview中启用链接。 此外,我会build议不要在此时使用故事板(或直到苹果修复这个问题),只是使用代码,以避免任何不必要的混淆。 希望这个帮助。

取消UITextViews滚动function对我来说也是类似的设置。

将色调颜色更改为其他颜色实际上起作用。 但是,如果select启用色彩也将是相同的颜色。

使UITextView的滚动属性号。它将工作… Self.textView.ScrollingEnable = NO;

此解决方法适用于我:

 textView.selectable = YES; textView.delegate = self; - (void) textViewDidChangeSelection:(UITextView *)textView; { NSRange range = NSMakeRange(NSNotFound, 0.0); if ( range.length && !NSEqualRanges(range, textView.selectedRange) ) { textView.selectedRange = range; } } 

如果以编程方式添加UITextview,只需添加以下几行:

  _textView.userInteractionEnabled = YES; _textView.dataDetectorTypes = UIDataDetectorTypeLink; _textView.scrollEnabled = NO; _textView.editable = NO; 

这对我有效。

以上都没有为我工作,而是我这样做:

 [self.textView setDataDetectorTypes:UIDataDetectorTypeNone]; [self.textView.setTextColor:[UIColor whiteColor]]; [self.textView setDataDetectorTypes:UIDataDetectorTypeNone]; 

我用我的textview应该检测所有types,并且没有检测到颜色设置为白色。 您可以更改代码以表示要检测的正确颜色和链接types。

虽然这个线程比较老,但是我没有看到Swift对我有用的答案,所以Swift 2.2就是这样

 textView.dataDetectorTypes = UIDataDetectorTypes.Link textView.selectable = true