Создайте UIButton на подстроке с помощью NSRange

У меня есть текст, поступающий с сервера. Это может быть однострочный или многострочный текст. Мне нужно отобразить текст на UILabel, что для меня не проблема. Проблема в том, что я должен отображать UIButton при поиске определенной подстроки того же текста. Например, текст Nitish\n435-234-6543\nIndia отображается следующим образом:

Nitish  
435-234-6543  
India  

Итак, когда я нахожу 435-234-6543, мне нужно отобразить UIButton на 435-234-6543.

Примечания:

  1. Текст динамический - исходящий с сервера. Выше приведен только пример.
  2. UIButton будет подвидом UILabel.

Я пробовал разные способы, такие как OHAttributedLabel, rectForLetterAtIndex и это тоже. Но не добиться успеха. Моя идея заключается в том, чтобы создать кнопку при обнаружении подстроки и установить рамку кнопки на основе NSRange подстроки. Возможно ли это? Как это сделать? Или есть другой способ сделать это?

Я думаю, это подход, который меня беспокоит.


person Nitish    schedule 14.01.2012    source источник
comment
Хотите уточнить свой вопрос? Мне не ясна ваша проблема. Вы не получаете правильный ответ или проблему при добавлении кнопки внутри метки.   -  person Iducool    schedule 14.01.2012
comment
Для меня проблема получить прямоугольник для кнопки, в которой находится подстрока.   -  person Nitish    schedule 14.01.2012


Ответы (3)


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); 
person Mundi    schedule 14.01.2012
comment
Приведенная выше строка является только примером. Телефон и адрес могут совпадать. У меня нет проблем с получением номера телефона с помощью NSDataDetector. Он также работает с UILabel. - person Nitish; 14.01.2012
comment
Таким образом, вы можете вставить свой собственный \n и использовать ту же логику с любым типом данных. - person Mundi; 14.01.2012

Для тех, кому нужно идеальное решение, вот решение о том, как получить CGRect подстроки.

person Islam Q.    schedule 08.09.2015

person    schedule
comment
Мне нужно определить четыре вещи: номер телефона, адрес электронной почты, почтовый адрес и веб-адрес. Это означает, что я должен взять пару лейблов, как вы сказали, управлять которыми будет непросто. Кроме того, поскольку строка поступает с сервера, она может содержать или не содержать вышеуказанную информацию. В этом случае управлять кадрами разных меток будет очень сложно. - person Nitish; 14.01.2012
comment
Все ваши четыре требования будут удовлетворены с помощью UITextView. Вы можете пойти с ним - person Iducool; 14.01.2012