2009-11-10 4 views
55

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

EDIT:

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

EDIT 2:

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

+0

как реализовать это Base SDK4.0? –

ответ

18

This answer к this similar question предоставляет код для рисования размытой тени позади UILabel. Автор использует CGContextSetShadow() для генерации тени для нарисованного текста.

+0

Это здорово, и он работает как рекламируемый! Благодарю. Но у вас есть идея, как я могу сделать эту тень более интенсивной? Поскольку это часть контекста, я не могу рисовать его более одного раза, что бы сделать трюк. – Dimitris

+1

Вы можете изменить цвет на черный с 100% непрозрачностью (в его примере это всего лишь 80%), а также изменить радиус тени в вызове CGContextSetShadow(). Вы также можете попробовать смещать смещение из позиции 4, -4, которую он установил. –

+0

Да, я пробовал 100% непрозрачность и т. Д. И в отношении размера, чем больше вы его устанавливали, тем менее заметна тень ... Я ищу что-то похожее на эффект тени в Flash, которое вы можете установить на более 100%. – Dimitris

-3

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

+19

Хорошо, это очевидная часть. И что? – Dimitris

3

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

CGContextSetShadowWithColor() 

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

37

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

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

Спасибо, но да. Я действительно искал * мягкую тень. – Dimitris

+0

Для «мягкой» тени - может быть, вы можете правильно изменить цвет? например, мне нужна «мягкая» тёмная тень. - как blackColor был слишком резким, я закончил с grayColor :) Счастливое кодирование! :) –

+3

Он означает размытую тень, без острых краев. –

6

Нанести (мягкая) тень на слой отображения вида, как это:

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

С 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 
+12

Обратите внимание, что для использования shadowRadius вы должны включить заголовки QuartzCore: '#import ' – blackjack75

+4

По какой-то причине это не влияет на мой UILabel – Pascalius

+4

+ 1 для дополнительной информации maskToBounds. – eladleb

1

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

Вы не хотите использовать это, если ваше приложение отправляется в магазин приложений. –

+4

Ну, чтобы быть справедливым, он заявил, что в ответе. – pablasso

+0

Почему бы вам не использовать это с потенциальным приложением App Store ион? –

15

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

label.layer.shouldRasterize = YES 

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

+0

Это требуется, чтобы сделать его быстрее даже с десятками UILabels. Без него тени будут медленными, если использовать их с непрозрачностью. – Jeet

+0

Если вы планируете использовать 'shouldRasterize', то убедитесь, что вы также установили' rasterizationScale': 'label.layer.rasterizationScale = [UIScreen mainScreen] .scale;' Или это может выглядеть странно на сетчатых экранах. – Eeshwar

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

4

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

https://github.com/MuscleRumble/THLabel

4

Это как трюк,

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; 
5

Чтобы держать вещи в актуальном состоянии: Создание тени в Swift так же легко, как:

Импорт в QuartzCore Framework

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 
1

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