Подтвердить что ты не робот

Мягкая тень текста UILabel для iPhone

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

EDIT:

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

ИЗМЕНИТЬ 2:

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

4b9b3361

Ответ 1

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

Ответ 2

Начиная с 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

Ответ 3

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

UILabel* label = [[UILabel alloc] init];
label.shadowColor = [UIColor whiteColor];
label.shadowOffset = CGSizeMake(0,1);

Ответ 4

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

label.layer.shouldRasterize = YES

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

Ответ 5

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

UILabel *label = [[UIabel alloc] init];
label.layer.shadowColor = [[UIColor whiteColor] CGColor];
label.layer.shadowOpacity = 1.0;

Ответ 6

Чтобы поддерживать актуальность: создание тени в 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

Ответ 7

_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], чтобы установить альфа-значение.

Ответ 8

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

https://github.com/MuscleRumble/THLabel

Ответ 9

Это как трюк,

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;

Ответ 10

Подкласс UILabel, как указано, затем, в drawRect:, do [self drawTextInRect:rect];, чтобы получить текст, втянутый в текущий контекст. Когда он там, вы можете начать работать с ним, добавив фильтры и еще много чего. Если вы хотите сделать тень с тем, что вы только что использовали в контексте, вы должны иметь возможность использовать:

CGContextSetShadowWithColor()

Посмотрите, что функция в документах узнает, как ее использовать.

Ответ 11

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

https://github.com/nicklockwood/FXLabel

Ответ 12

Начиная с 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];

Ответ 13

В 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()

Ответ 14

Подкласс UILabel и переопределить -drawInRect: