Сделайте UILabel похожим на CSS-дисплей: встроенный - PullRequest
3 голосов
/ 21 августа 2011

Хорошо, вот моя проблема.У меня довольно большой набор UIButton-ов, для которых UIImage установлен в качестве фона.Теперь я хочу добавить метки внутри этих кнопок.Но дизайн, который я сейчас реализую, использует «причудливые» надписи, где цвет фона надписи полупрозрачен и сворачивается вокруг текста.

Моей первой идеей было использование UIWebview, чтобы это произошло, и это работает, но добавление большого количества UIWebview занимает очень много времени для появления меток.

Следующим решением будет использование UILabel, и производительность будет в разы лучше.Но я не могу понять, как заставить визуальный стиль соответствовать дизайну.

Так что в основном я пытаюсь заставить UILabel вести себя как элемент HTML, который имеет отображение правила CSS: в соответствии;определен стиль.

Возможно ли это даже со встроенными параметрами UILabel?Если нет, то я, вероятно, собираюсь использовать решение UIWebView, но было бы, конечно, намного лучше использовать UILabel.

Вот скриншот, который должен объяснить это несколько лучше

Сверху - то, как действует UILabel по умолчанию, а снизу - как я хочу, чтобы оно действовало.

Ответы [ 3 ]

1 голос
/ 21 августа 2011

Вы не полностью описали стиль вашего текста, но мне кажется, что вы хотите что-то вроде эффекта "свечения".Это можно сделать с помощью QuartzCore для эффекта тени на этикетках.Обратите внимание, что одна тень обычно этого не делает, поэтому вот пример с четырьмя метками и четырьмя тенями:

for (int i = 0; i < 4; i++) {
    UILabel * label = [[UILabel alloc] initWithFrame:CGRectMake(20, 20, 280, 30)];
    [label setBackgroundColor:[UIColor clearColor]];
    [label setTextColor:[UIColor colorWithRed:1 green:1 blue:1 alpha:1]];
    [label setText:@"This is some glowing text"];
    [[label layer] setShadowColor:[[UIColor colorWithRed:1 green:1 blue:1 alpha:1] CGColor]];
    CGSize shadowOff = CGSizeMake(0, 0);
    if (i == 0) shadowOff = CGSizeMake(3, 3);
    else if (i == 1) shadowOff = CGSizeMake(3, -3);
    else if (i == 2) shadowOff = CGSizeMake(-3, -3);
    else if (i == 3) shadowOff = CGSizeMake(-3, 3);
    [[label layer] setShadowOffset:shadowOff];
    [[label layer] setShadowOpacity:0.5];
    [[label layer] setShadowRadius:3];
    [[label layer] setMasksToBounds:NO];
    [self.view addSubview:[label autorelease]];
}

Очевидно, что непрозрачность тени, радиус и т. Д. Могут быть изменены для другого уровня "свечение. "

0 голосов
/ 24 августа 2011

Мне удалось найти решение, которое почти работает как задумано. Он не сворачивается вокруг всех отдельных строк, но он сворачивает рамку вокруг текста, и на данный момент для меня этого достаточно.

Вот последний код, который помогает мне:

UILabel *buttonTitle = [[UILabel alloc] initWithFrame:CGRectMake(4, 4, 176, 120)];
buttonTitle.text = @"Button text";
buttonTitle.backgroundColor = [UIColor colorWithRed:0 green:0 blue:0 alpha:0.65];
buttonTitle.textColor = [UIColor whiteColor];
buttonTitle.textAlignment = UITextAlignmentLeft;
buttonTitle.numberOfLines = 0;
buttonTitle.lineBreakMode = UILineBreakModeWordWrap;
buttonTitle.adjustsFontSizeToFitWidth = NO;
[buttonTitle sizeToFit];
0 голосов
/ 21 августа 2011

Из того, что я могу понять, есть две вещи, которые вам нужно выяснить здесь:

  1. Размер отрисовки текста, который вы хотите использовать в вашей UILabel.Это может быть вычислено с -[NSString sizeWithFont:].Есть куча других связанных методов.См. Справочник дополнений NSString UIKit.

  2. Второе, что вам нужно, это то, что цвет фона вашей UILabel должен идеально сжиматься вокруг текста.Для этого вам нужно установить растягиваемое изображение в качестве фона для UILabel.Смотри -[UIImage stretchableImageWithLeftCapWidth:topCapHeight:].См. http://idevrecipes.com/2010/12/08/stretchable-images-and-buttons/ для примера того, как работают растягиваемые изображения.

...