Detecting taps on attributed text in a UITextView in iOS(在 iOS 的 UITextView 中检测属性文本的点击)
问题描述
我有一个显示 NSAttributedString
的 UITextView
.该字符串包含我希望使其可点击的单词,这样当他们被点击时,我会被回调,以便我可以执行操作.我意识到 UITextView
可以检测 URL 上的点击并回调我的委托,但这些不是 URL.
I have a UITextView
which displays an NSAttributedString
. This string contains words that I'd like to make tappable, such that when they are tapped I get called back so that I can perform an action. I realise that UITextView
can detect taps on a URL and call back my delegate, but these aren't URLs.
在我看来,借助 iOS 7 和 TextKit 的强大功能,这现在应该是可能的,但是我找不到任何示例,我不知道从哪里开始.
It seems to me that with iOS 7 and the power of TextKit this should now be possible, however I can't find any examples and I'm not sure where to start.
我知道现在可以在字符串中创建自定义属性(尽管我还没有这样做),也许这些对于检测是否已点击其中一个魔术词很有用?无论如何,我仍然不知道如何拦截该点击并检测点击发生在哪个单词上.
I understand that it's now possible to create custom attributes in the string (although I haven't done this yet), and perhaps these will be useful to detecting if one of the magic words has been tapped? In any case, I still don't know how to intercept that tap and detect on which word the tap occurred.
请注意,不需要兼容 iOS 6.
Note that iOS 6 compatibility is not required.
推荐答案
我只是想帮助别人多一点.根据 Shmidt 的回答,可以完全按照我在原始问题中的要求进行操作.
I just wanted to help others a little more. Following on from Shmidt's response it's possible to do exactly as I had asked in my original question.
1) 创建一个属性字符串,并将自定义属性应用于可点击的单词.例如.
1) Create an attributed string with custom attributes applied to the clickable words. eg.
NSAttributedString* attributedString = [[NSAttributedString alloc] initWithString:@"a clickable word" attributes:@{ @"myCustomTag" : @(YES) }];
[paragraph appendAttributedString:attributedString];
2) 创建一个 UITextView 来显示该字符串,并向其中添加一个 UITapGestureRecognizer.然后处理水龙头:
2) Create a UITextView to display that string, and add a UITapGestureRecognizer to it. Then handle the tap:
- (void)textTapped:(UITapGestureRecognizer *)recognizer
{
UITextView *textView = (UITextView *)recognizer.view;
// Location of the tap in text-container coordinates
NSLayoutManager *layoutManager = textView.layoutManager;
CGPoint location = [recognizer locationInView:textView];
location.x -= textView.textContainerInset.left;
location.y -= textView.textContainerInset.top;
// Find the character that's been tapped on
NSUInteger characterIndex;
characterIndex = [layoutManager characterIndexForPoint:location
inTextContainer:textView.textContainer
fractionOfDistanceBetweenInsertionPoints:NULL];
if (characterIndex < textView.textStorage.length) {
NSRange range;
id value = [textView.attributedText attribute:@"myCustomTag" atIndex:characterIndex effectiveRange:&range];
// Handle as required...
NSLog(@"%@, %d, %d", value, range.location, range.length);
}
}
知道怎么做就这么简单!
So easy when you know how!
这篇关于在 iOS 的 UITextView 中检测属性文本的点击的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持编程学习网!
本文标题为:在 iOS 的 UITextView 中检测属性文本的点击
基础教程推荐
- 在 gmail 中为 ios 应用程序检索朋友的朋友 2022-01-01
- 如何让对象对 Cocos2D 中的触摸做出反应? 2022-01-01
- UIWebView 委托方法 shouldStartLoadWithRequest:在 WKWebView 中等效? 2022-01-01
- 当从同一个组件调用时,两个 IBAction 触发的顺序是什么? 2022-01-01
- 如何在没有IB的情况下将2个按钮添加到右侧的UINavigationbar? 2022-01-01
- android 应用程序已发布,但在 google play 中找不到 2022-01-01
- 如何在 UIImageView 中异步加载图像? 2022-01-01
- 如何在 iPhone 上显示来自 API 的 HTML 文本? 2022-01-01
- Android:对话框关闭而不调用关闭 2022-01-01
- Kivy Buildozer 无法构建 apk,命令失败:./distribute.sh -m “kivy"d 2022-01-01