如何将不同的 UITapGestureRecognizer 添加到单个 UILabel 的许多部分?

Posted

技术标签:

【中文标题】如何将不同的 UITapGestureRecognizer 添加到单个 UILabel 的许多部分?【英文标题】:How to add different UITapGestureRecognizer to many parts of a single UILabel? 【发布时间】:2013-03-08 01:26:11 【问题描述】:

例如,我想显示一个UILabel,其中包含指向许多用户个人资料的链接,例如:

“[John]、[Josef]、[Doe]、[May] 和 [You] 喜欢这个”

这个想法是每个 [name] 调用不同的 TapGestureRecognizer。

另一种选择是创建不同的 UILabels 并将它们像字符串一样连接起来,但也不知道该怎么做。

【问题讨论】:

【参考方案1】:

确实,您不能仅将手势识别器附加到 UIView 的某些部分。 Label 是单个 UIView,因此仅使用这两个部分除了拦截 touchesBegan 并试图找出 base don touch 坐标是哪个单词之外没有其他解决方案。

如果你想走这条路,你会发现这很有帮助:

NSString* text = @"John";
CGSize size = [text sizeWithFont:font];

这使您可以计算出给定字体(您的标签使用的字体)中绘制文本的大小,然后进行一些可怕的数学运算来确定您的文字在哪里并比较触摸位置。

另一种可能性是为每个单词使用单独的 UILabel。同样,您将使用sizeWithFont,但现在您使用它来设置每个标签的 label.frame.size.width 以适合给定的文本。然后,您可以编写代码来设置所有标签的 .frame,使它们彼此相邻。

NSString* text = @"John";
CGSize size = [text sizeWithFont:font];
CGRect frame = myUILabelObject.frame;
frame.size.width = size.width;
myUILabelObject.frame = frame;
// Now next label, setting label.frame to position it next to this label.

【讨论】:

【参考方案2】:

已经为您发明了显示文本中可点击的单个单词:使用UIWebView 而不是标签。将您的文本格式化为 html,使每个名称成为一个链接,并使用 Web 视图委托方法查看已点击的内容。

【讨论】:

虽然这在某些情况下可能有效(并且它确实适用于我的第一个应用程序),但 UIWebViews 可能不实用。例如,如果 OP 试图在 UITableViewCells 中使用这些标签,那么 webviews 就不是一个好的解决方案。 是的!可能是您的答案完全合法,只是想向 OP 指出这不是该问题的通用答案。 :)

以上是关于如何将不同的 UITapGestureRecognizer 添加到单个 UILabel 的许多部分?的主要内容,如果未能解决你的问题,请参考以下文章

如何在被父视图部分裁剪的子视图上触发 UITapGestureRecognizer?

用手指使 UIView 可拖动

如何将不同的逗号分隔值插入mysql中的不同列

如何将不同的成本函数应用于卷积网络的不同输出通道?

如何将数据分为 3 个不同的类别

如何将记录拆分为不同的流,从一个主题到不同的流?