借助NSRange在子串上创建UIButton

时间:2012-01-14 08:16:59

标签: iphone ios nsstring uibutton nsrange

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

Nitish  
435-234-6543  
India  

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

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

我尝试了不同的方式,例如 OHAttributedLabel rectForLetterAtIndexthis。但没有成功。
我的想法是,在找到子串时创建按钮,并根据子串的 NSRange 设置按钮的框架。
这有可能吗?怎么做到呢?或者还有其他方法可以做到这一点吗? 发布代码对我来说不是问题。但我想这是我担心的方法。
如果需要进一步澄清,请告诉我 谢谢,
尼蒂什

3 个答案:

答案 0 :(得分:0)

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"];

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

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); 

答案 1 :(得分:0)

- >我试图计算位置,但没有取得成功。似乎有很多工作来计算位置。一个直接的解决方案让我想到你为什么不拿一个或两个标签和一个按钮。

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

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


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

答案 2 :(得分:0)

对于那些想要完美解决方案的人来说,solution关于如何获得子串的CGRect。