借助 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 的子视图。
我也尝试了不同的方法,例如 OHAttributedLabel、rectForLetterAtIndex 和 this。但没有获得成功。我的想法是,在找到子字符串时创建按钮并根据子字符串的 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的主要内容,如果未能解决你的问题,请参考以下文章
有没有办法在 UILabel 中为 NSRange 获取 CGRects?
nsrange.location 不完全是麻烦 makerange 子字符串 ios 目标 c