借助 NSRange 在子字符串上创建 UIButton

Posted

技术标签:

【中文标题】借助 NSRange 在子字符串上创建 UIButton【英文标题】:Create UIButton on substring with help of NSRange 【发布时间】:2012-01-14 08:16:59 【问题描述】:

我有一些来自服务器的文本。它可以是单行或多行文本。我必须在 UILabel 上显示文本,这对我来说没问题。问题是,我必须在查找相同文本的特定子字符串时显示 UIButton。例如文本是 Nitish\n435-234-6543\nIndia 显示如下:

Nitish  
435-234-6543  
India  

所以,当我找到 435-234-6543 时,我必须在 435-234-6543 上显示 UIButton。

注意事项:

    文本是动态的 - 来自服务器。以上只是一个例子。 UIButton 将是 UILabel 的子视图。

我也尝试了不同的方法,例如 OHAttributedLabelrectForLetterAtIndexthis。但没有获得成功。我的想法是,在找到子字符串时创建按钮并根据子字符串的 NSRange 设置按钮的框架。这是一种可能吗?如何做呢?还是有其他方法可以做到这一点?

我想这是我担心的方法。

【问题讨论】:

您想详细说明您的问题吗?我不清楚你的问题。您在标签内添加按钮时没有得到正确的矩形或问题。 获取子字符串所在按钮的矩形是我的问题。 【参考方案1】:

-->我尝试计算位置但没有成功。计算位置似乎需要做很多工作。我想到的一个直接解决方案是你为什么不拿一两个标签和一个按钮。

假设。您从 web 服务获得的动态字符串是:“Nitesh-56789-Test”。

    假设查找字符串范围,即“56789”。 将该范围的起始位置之前的字符串分配给一个标签,即将“Nitesh”分配给一个标签。 现在添加一个自定义按钮,将我们搜索的字符串作为文本 (56789)。 现在确保在主字符串中我们的子字符串之后是否有某些内容。这里我的意思是在我们的搜索字符串“56789”之后仍然存在“测试”,因此将其分配给第三个标签。

这里您必须使用 sizeWithFont 方法使用动态高度宽度计算来确定所有标签和按钮的框架。

【讨论】:

我需要识别四件事:电话号码、电子邮件、邮件地址和网址。这意味着我必须贴上几个标签,正如你所说,管理谁并不容易。此外,由于字符串来自服务器,它可能包含也可能不包含上述信息。那样的话,管理不同标签的框架会很困难。 UITextView 可以满足你的四个要求,你可以去【参考方案2】:

1) 简单的解决方案:

将您的 UILabel 设为 UITextView 并使用属性 dataDetectorTypes 自动将电话号码作为链接。


2) 更复杂的解决方案:

有一种方便的方法可以确定需要绘制的任何文本的大小:

CGSize size = [label.text sizeWithFont:label.font 
                     constrainedToSize:CGSizeMake(label.frame.size.width, CGFLOAT_MAX) 
                         lineBreakMode:UILineBreakModeWordWrap];

您现在可以通过将字符串分成几行来确定哪个字段是电话号码:

NSArray *comp = [label.text componentsSeparatedByString:@"\n"];

然后检查哪一个是数字。现在你必须从你的size 变量的height 计算出精确的帧,可能是这样的:

CGFloat positionOfNumber; // the index of your line in comp cast to CGFloat
CGFloat buffer = 10; // fiddle with this
CGFloat buttonHeight = (size.height- 2*buffer)/[comp length];
CGFloat buttonY = buffer + positionOfNumber * buttonHeight;
CGRect buttonFrame = CGRectMake(0, buttonY, label.frame.size.width, buttonHeight); 

【讨论】:

以上字符串只是一个例子。电话号码和地址可以相同。我很容易通过 NSDataDetector 获取电话号码。它也适用于 UILabel。 因此您可以插入自己的\n 并对任何数据类型使用相同的逻辑。【参考方案3】:

对于那些想要完美解决方案的人来说,这里是solution,了解如何获取子字符串的 CGRect。

【讨论】:

以上是关于借助 NSRange 在子字符串上创建 UIButton的主要内容,如果未能解决你的问题,请参考以下文章

NSRange 在 for 循环中改变自身

有没有办法在 UILabel 中为 NSRange 获取 CGRects?

如何从 NSRange 中提取整数值?

nsrange.location 不完全是麻烦 makerange 子字符串 ios 目标 c

iOS 中文字符判断 正则NSRegularExpression 谓词NSPredicate 和 NSRange

NSRegularExpression如何让NSRange超出范围?