Iphone 在NSRange的帮助下在子字符串上创建UIButton
我有一些来自服务器的文本。它可以是单行或多行文本。我必须在UILabel上显示文本,这对我来说没有问题。问题是,我必须在查找同一文本的特定子字符串时显示UIButton。例如,文本为Nitish\n435-234-6543\nIndia,显示如下:Iphone 在NSRange的帮助下在子字符串上创建UIButton,iphone,ios,nsstring,uibutton,nsrange,Iphone,Ios,Nsstring,Uibutton,Nsrange,我有一些来自服务器的文本。它可以是单行或多行文本。我必须在UILabel上显示文本,这对我来说没有问题。问题是,我必须在查找同一文本的特定子字符串时显示UIButton。例如,文本为Nitish\n435-234-6543\nIndia,显示如下: Nitish 435-234-6543 India 因此,当我找到435-234-6543时,我必须在435-234-6543上显示UIButton 注: 文本是动态的-来自服务器。以上只是一个例子 UIButton将是UILabel的
Nitish
435-234-6543
India
因此,当我找到435-234-6543时,我必须在435-234-6543上显示UIButton
注:
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);
-->我曾试图保住这个职位,但没有成功。似乎有很多工作要做。我想到的一个直接的解决办法是为什么你不带一两个标签和一个按钮。
假设。您从webservice获得的动态字符串是:“Nitesh-56789-Test”。在这里,您必须使用sizeWithFont方法,使用动态高度-宽度计算,计算出所有标签和按钮的框架。对于那些想要完美解决方案的人,这里介绍了如何获得子字符串的CGRect。您想详细说明您的问题吗?我不清楚你的问题。在标签内添加按钮时,您是否没有获得正确的rect或问题。获取子字符串所在按钮的rect是我的问题。上面的字符串只是一个示例。电话号码和地址可以在同一条线上。使用NSDataDetector获取电话号码并不困难。它还可以与UILabel一起使用。因此,您可以插入自己的
\n
,并对任何数据类型使用相同的逻辑。我需要识别四件事:电话号码、电子邮件、邮件地址和web地址。这意味着,正如你所说,管理谁将是不容易的,我必须接受几个标签。此外,由于字符串来自服务器,它可能包含也可能不包含上述信息。在这种情况下,管理不同标签的框架将非常困难。UITextView将满足您的所有四个要求。您可以使用它