Iphone 在NSRange的帮助下在子字符串上创建UIButton

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的

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

Nitish  
435-234-6543  
India  
因此,当我找到435-234-6543时,我必须在435-234-6543上显示UIButton

注:

  • 文本是动态的-来自服务器。以上只是一个例子
  • UIButton将是UILabel的子视图 我也尝试了不同的方法,比如OHAttributedLabel。但是没有成功。我的想法是,在找到子字符串时创建按钮,并根据子字符串的NSRange设置按钮的帧。这有可能吗?怎样才能做到呢?还是有其他方法可以做到这一点

    我想这是我担心的方法

    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); 
    
    -->我曾试图保住这个职位,但没有成功。似乎有很多工作要做。我想到的一个直接的解决办法是为什么你不带一两个标签和一个按钮。

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

  • 查找字符串的范围,例如“56789”
  • 在该范围的起始位置之前的字符串分配给一个标签,即分配“Nitesh”给标签一。
  • 现在添加一个自定义按钮,将搜索的字符串作为文本(56789)。
  • 现在确保主字符串中的子字符串后面有或没有。这里我的意思是,在搜索字符串“56789”之后,仍然“Test”保持不变,因此将其分配给第三个标签。

  • 在这里,您必须使用sizeWithFont方法,使用动态高度-宽度计算,计算出所有标签和按钮的框架。

    对于那些想要完美解决方案的人,这里介绍了如何获得子字符串的CGRect。

    您想详细说明您的问题吗?我不清楚你的问题。在标签内添加按钮时,您是否没有获得正确的rect或问题。获取子字符串所在按钮的rect是我的问题。上面的字符串只是一个示例。电话号码和地址可以在同一条线上。使用NSDataDetector获取电话号码并不困难。它还可以与UILabel一起使用。因此,您可以插入自己的
    \n
    ,并对任何数据类型使用相同的逻辑。我需要识别四件事:电话号码、电子邮件、邮件地址和web地址。这意味着,正如你所说,管理谁将是不容易的,我必须接受几个标签。此外,由于字符串来自服务器,它可能包含也可能不包含上述信息。在这种情况下,管理不同标签的框架将非常困难。UITextView将满足您的所有四个要求。您可以使用它