Ответ 1
Этот ответ в этот аналогичный вопрос предоставляет код для рисования размытой тени за UILabel. Автор использует CGContextSetShadow() для генерации тени для нарисованного текста.
Я знаю, что мягкие тени не поддерживаются UILabel из коробки, на iPhone. Итак, какой был бы лучший способ реализовать мою собственную?
EDIT:
Очевидно, я подклассию UILabel
и рисую в -drawRect:
Мой вопрос в том, как получить содержимое ярлыка в виде графики и нарисовать вокруг них, размыть их и т.д....
ИЗМЕНИТЬ 2:
Я вернулся к этому вопросу примерно год спустя. Тем временем я создал класс, который позволяет легко добавлять мягкую тень к ярлыку и настраивать его радиус и т.д., А также рисовать градиенты на самом тексте. Вы можете найти его на GitHub: https://github.com/doukasd/iOS-Components/tree/master/Views
Этот ответ в этот аналогичный вопрос предоставляет код для рисования размытой тени за UILabel. Автор использует CGContextSetShadow() для генерации тени для нарисованного текста.
Начиная с 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
Я советую вам использовать свойства shadowColor и shadowOffset для UILabel:
UILabel* label = [[UILabel alloc] init];
label.shadowColor = [UIColor whiteColor];
label.shadowOffset = CGSizeMake(0,1);
Дополнительно к запросу IIDan: Для некоторых целей необходимо установить
label.layer.shouldRasterize = YES
Я думаю, что это связано с режимом наложения, который используется для рендеринга тени. Например, у меня был темный фон и белый текст, и он хотел "выделить" текст черным теневым свечением. Он не работал, пока я не установил это свойство.
Примените (мягкую) тень на уровне представления, например:
UILabel *label = [[UIabel alloc] init];
label.layer.shadowColor = [[UIColor whiteColor] CGColor];
label.layer.shadowOpacity = 1.0;
Чтобы поддерживать актуальность: создание тени в 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
_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], чтобы установить альфа-значение.
Я пробовал почти все эти методы (кроме FXLabel) и не мог заставить их работать с iOS 7. В итоге я нашел THLabel, который отлично работает для меня. Я использовал THLabel в интерфейсе Builder и настраивал пользовательские атрибуты Runtime так, чтобы не программист мог контролировать внешний вид.
Это как трюк,
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;
Подкласс UILabel, как указано, затем, в drawRect:, do [self drawTextInRect:rect];
, чтобы получить текст, втянутый в текущий контекст. Когда он там, вы можете начать работать с ним, добавив фильтры и еще много чего. Если вы хотите сделать тень с тем, что вы только что использовали в контексте, вы должны иметь возможность использовать:
CGContextSetShadowWithColor()
Посмотрите, что функция в документах узнает, как ее использовать.
Я написал библиотеку, которая предоставляет подкласс UILabel с поддержкой мягкой тени и связью других эффектов:
Начиная с iOS 5 Apple предоставляет частный метод api для создания меток с мягкими тенями. Ярлыки очень быстрые: я использую десятки одновременно в серии прозрачных представлений и не наблюдается замедления прокрутки анимации.
Это полезно только для приложений, не связанных с App Store (очевидно), и вам нужен файл заголовка.
$SBBulletinBlurredShadowLabel = NSClassFromString("SBBulletinBlurredShadowLabel");
CGRect frame = CGRectZero;
SBBulletinBlurredShadowLabel *label = [[[$SBBulletinBlurredShadowLabel alloc] initWithFrame:frame] autorelease];
label.backgroundColor = [UIColor clearColor];
label.textColor = [UIColor whiteColor];
label.font = [UIFont boldSystemFontOfSize:12];
label.text = @"I am a label with a soft shadow!";
[label sizeToFit];
В Swift 3
вы можете создать расширение:
import UIKit
extension UILabel {
func shadow() {
self.layer.shadowColor = self.textColor.cgColor
self.layer.shadowOffset = CGSize.zero
self.layer.shadowRadius = 3.0
self.layer.shadowOpacity = 0.5
self.layer.masksToBounds = false
self.layer.shouldRasterize = true
}
}
и использовать его через:
label.shadow()
Подкласс UILabel и переопределить -drawInRect: