Создайте UIButton на подстроке с помощью NSRange - PullRequest
0 голосов
/ 14 января 2012

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

Nitish  
435-234-6543  
India  

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

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

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

Ответы [ 3 ]

0 голосов
/ 14 января 2012

-> Я пытался вычислить позицию, но не добился успеха. Кажется, много работы для расчета позиции. Мне сразу приходит в голову одно решение: почему вы не берете одну или две метки и одну кнопку?

Пусть. Вы получили динамическую строку от веб-службы: «Nitesh-56789-Test».

  1. Найти диапазон строки, предположим, что "56789".
  2. Строка перед начальным местоположением этого диапазона назначается одной метке, т. Е. Присваивает "Nitesh" метке.
  3. Теперь добавьте одну пользовательскую кнопку с искомой строкой в ​​виде текста (56789).
  4. Теперь убедитесь, что в основной строке есть что-то после нашей подстроки или нет. Здесь я имею в виду, что после нашей строки поиска "56789" все еще остается слово "Test", поэтому присвойте его третьему ярлыку.

Здесь вы должны вычислить рамку всех меток и кнопки, используя динамическое вычисление ширины высоты с помощью метода sizeWithFont.

0 голосов
/ 08 сентября 2015

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

0 голосов
/ 14 января 2012

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