iPhone UILabel текст мягкая тень - PullRequest
58 голосов
/ 10 ноября 2009

Я знаю, что мягкие тени не поддерживаются UILabel из коробки на iPhone. Итак, что было бы лучшим способом реализовать мой собственный?

EDIT:

Очевидно, я сделаю подкласс UILabel и нарисую в -drawRect: У меня вопрос, как мне получить содержимое ярлыка в виде графики и нарисовать вокруг него, размыть их и т. Д ...

РЕДАКТИРОВАТЬ 2:

Я вернулся к этому вопросу примерно через год. Тем временем я создал класс, который позволяет вам легко добавлять мягкую тень к метке, изменять ее радиус и т. Д., А также рисовать градиенты на самом тексте. Вы можете найти его на GitHub: https://github.com/doukasd/iOS-Components/tree/master/Views

Ответы [ 14 ]

188 голосов
/ 20 января 2011

Начиная с версии 3.2 в SDK есть прямая поддержка теней.

label.layer.shadowColor = [label.textColor CGColor];
label.layer.shadowOffset = CGSizeMake(0.0, 0.0);

Импорт <QuartzCore/QuartzCore.h> и игра с некоторыми параметрами:

label.layer.shadowRadius = 3.0;
label.layer.shadowOpacity = 0.5;

И, если вы обнаружите, что ваша тень обрезана по границам метки:

label.layer.masksToBounds = NO;

наконец установить

label.layer.shouldRasterize = YES
38 голосов
/ 02 марта 2010

Советую вам использовать свойства shadowColor и shadowOffset UILabel:

UILabel* label = [[UILabel alloc] init];
label.shadowColor = [UIColor whiteColor];
label.shadowOffset = CGSizeMake(0,1);
19 голосов
/ 10 ноября 2009

Этот ответ на этот похожий вопрос предоставляет код для рисования размытой тени за UILabel. Автор использует CGContextSetShadow () для генерации тени для нарисованного текста.

16 голосов
/ 20 марта 2013

В дополнение к ответу IIDan: Для некоторых целей необходимо установить

label.layer.shouldRasterize = YES

Я думаю, это связано с режимом наложения, который используется для рендеринга тени. Например, у меня был темный фон и белый текст на нем, и я хотел «выделить» текст с помощью черного теневого свечения. Он не работал, пока я не установил это свойство.

7 голосов
/ 19 мая 2010

Нанесите (мягкую) тень на слой вида , например:

UILabel *label = [[UIabel alloc] init];
label.layer.shadowColor = [[UIColor whiteColor] CGColor];
label.layer.shadowOpacity = 1.0;
6 голосов
/ 19 августа 2015

Чтобы быть в курсе событий: создать тень в Swift очень просто:

Импорт структуры QuartzCore

import QuartzCore

И установите атрибуты тени для вашего ярлыка

titleLabel.shadowColor = UIColor.blackColor()
titleLabel.shadowOffset = CGSizeMake(0.0, 0.0)
titleLabel.layer.shadowRadius = 5.0
titleLabel.layer.shadowOpacity = 0.8
titleLabel.layer.masksToBounds = false
titleLabel.layer.shouldRasterize = true
5 голосов
/ 22 июля 2013
_nameLabel = [[UILabel alloc] initWithFrame:CGRectZero];
_nameLabel.font = [UIFont boldSystemFontOfSize:19.0f];
_nameLabel.textColor = [UIColor whiteColor];
_nameLabel.backgroundColor = [UIColor clearColor];
_nameLabel.shadowColor = [UIColor colorWithWhite:0 alpha:0.2];
_nameLabel.shadowOffset = CGSizeMake(0, 1);

Я думаю, вы должны использовать [UIColor colorWithWhite: 0 alpha: 0.2], чтобы установить значение альфа.

4 голосов
/ 09 января 2015

Это как трюк,

UILabel *customLabel = [[UILabel alloc] init];

UIColor *color = [UIColor blueColor];
customLabel.layer.shadowColor = [color CGColor];
customLabel.layer.shadowRadius = 5.0f;
customLabel.layer.shadowOpacity = 1;
customLabel.layer.shadowOffset = CGSizeZero;
customLabel.layer.masksToBounds = NO;
4 голосов
/ 22 ноября 2013

Я испробовал почти все эти методы (кроме FXLabel) и не смог заставить ни один из них работать с iOS 7. В конце концов я нашел THLabel, который отлично работает для меня. Я использовал THLabel в Интерфейсном Разработчике и настраивал Определяемые пользователем Атрибуты времени выполнения, чтобы не программисту было легко контролировать внешний вид.

https://github.com/MuscleRumble/THLabel

3 голосов
/ 07 июня 2012

Я написал библиотеку, которая предоставляет подкласс UILabel с поддержкой мягкой тени и кучу других эффектов:

https://github.com/nicklockwood/FXLabel

...