для iPhone UILabel ни текста, мягкой тенью



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



EDIT:



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



EDIT 2:



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

577   14  

14 ответов:

ответ до этот же вопрос предоставляет код для рисования размытой тени за 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

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

https://github.com/MuscleRumble/THLabel

Это как трюк,

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

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

https://github.com/nicklockwood/FXLabel

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

CGContextSetShadowWithColor()

посмотрите эту функцию в документах, чтобы узнать, как ее использовать.

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

Comments

    Ничего не найдено.