2009-08-13 3 views

ответ

172

По состоянию на 3.2, вы можете использовать теневые свойства CALayer.

_textField.layer.shadowOpacity = 1.0; 
_textField.layer.shadowRadius = 0.0; 
_textField.layer.shadowColor = [UIColor blackColor].CGColor; 
_textField.layer.shadowOffset = CGSizeMake(0.0, -1.0); 
+1

Отлично работает. На iPad вы должны изменить смещение на CGSizeMake (0.0, 1.0) и цвет на белый. – Thomas

+0

Работал отлично для меня тоже! – Taum

+1

Это прекрасное решение. – Dimitris

19

Я не думаю, что вы получаете встроенную поддержку текстовых теней здесь, как вы делаете с UILabel.

Две идеи:

(1) [Умеренно сложно кода.] Добавить второй UITextField позади оригинала, на очень небольшое смещение (возможно, с помощью (0.2,0.8)?). Вы можете прослушивать каждое текстовое изменение по ключу, реализуя метод textField:shouldChangeCharactersInRange:replacementString: в протоколе UITextFieldDelegate. Используя это, вы можете обновлять нижний текст одновременно. Вы также можете сделать нижний текст (теневой текст) серым и даже слегка расплывчатым, используя тот факт, что прямоугольные текстовые прямоугольники выглядят размытыми. Добавлено: О да, не забудьте установить цвет фона верхнего текстового поля в [UIColor clearColor], если вы идете с этой идеей.

(2) [Еще более интересно кода.] Подкласс UITextField и переопределить метод drawRect:. Я не делал этого раньше, поэтому я расскажу заранее, что это зависит от того, является ли это назначенным методом рисования, и может оказаться, что вам нужно переопределить другую функцию рисования, такую ​​как drawTextInRect:, которая специфична для UITextField. Теперь настройте контекст рисования, чтобы нарисовать тени через the CGContextSetShadow functions, и позвоните по номеру [super drawRect:rect];. Надеюсь, что это работает - в случае, если исходный код UITextField очищает параметры теней для контекста чертежа, эта идея закрыта, и вам придется писать весь код чертежа самостоятельно, что я рекомендую порекомендовать из-за всех дополнительных функций, которые поставляются с UITextFields как копирование и вставка и ввод кандзи на японском языке.

+0

сладкие спасибо, я буду попробовать первый один – DotSlashSlash

+2

Вы определенно должны использовать нижеприведенный ответ от egarc, гораздо лучший способ решить эту проблему! –

+1

Это правда, @ Mac_Cain13. Эти свойства CALayer были добавлены в iOS 3.2, который не был выпущен, когда я написал свой ответ. – Tyler

72

У меня есть немного другая проблема - я хочу размытую тень на UILabel. К счастью, решение это оказалось число (2) от Тайлера

Вот мой код:

- (void) drawTextInRect:(CGRect)rect { 
    CGSize myShadowOffset = CGSizeMake(4, -4); 
    CGFloat myColorValues[] = {0, 0, 0, .8}; 

    CGContextRef myContext = UIGraphicsGetCurrentContext(); 
    CGContextSaveGState(myContext); 

    CGColorSpaceRef myColorSpace = CGColorSpaceCreateDeviceRGB(); 
    CGColorRef myColor = CGColorCreate(myColorSpace, myColorValues); 
    CGContextSetShadowWithColor (myContext, myShadowOffset, 5, myColor); 

    [super drawTextInRect:rect]; 

    CGColorRelease(myColor); 
    CGColorSpaceRelease(myColorSpace); 

    CGContextRestoreGState(myContext); 
} 

Это в классе, который простирается от UILabel и тащит текст с тенью вниз и правая 4px, тень серая с непрозрачностью 80% и наглядно размыта.

Я думаю, что решение № 2 Тайлера немного лучше для производительности, чем номер 1 Тайлера - вы имеете дело только с одним UILabel в представлении и, предполагая, что вы не перерисовываете каждый фрейм, это не хит в рендеринг по нормальному UILabel.

PS Этот код почерпнул из Quartz 2D documentation

+0

Спасибо за код! Вы можете удалить строку CGContextSetShadow, так как вы вызываете CGContextSetShadowWithColor. Согласно CGContext.h CGContextSetShadow является «эквивалентным вызову CGContextSetShadowWithColor (контекст, смещение, размытие, цвет), где цвет черный с 1/3 альфы» – johnboiles

+0

Спасибо - я удалил эту строку - типичную вырезать-вставить-из- пример ошибки :) – deanWombourne

+0

Ссылка на «Quartz 2D documentation» сломана, новая ссылка: http://developer.apple.com/library/mac/#documentation/GraphicsImaging/Conceptual/drawingwithquartz2d/dq_shadows/dq_shadows.html – Vamos

15

Хотя метод нанесения теней непосредственно на UITextView будет работать, это неправильный способ сделать это. Добавив тень напрямую с четким цветом фона, все подпункты получат тень, даже курсор.

Подход, который следует использовать, - NSAttributedString.

NSMutableAttributedString* attString = [[NSMutableAttributedString alloc] initWithString:textView.text]; 
NSRange range = NSMakeRange(0, [attString length]); 

[attString addAttribute:NSFontAttributeName value:textView.font range:range]; 
[attString addAttribute:NSForegroundColorAttributeName value:textView.textColor range:range]; 

NSShadow* shadow = [[NSShadow alloc] init]; 
shadow.shadowColor = [UIColor whiteColor]; 
shadow.shadowOffset = CGSizeMake(0.0f, 1.0f); 
[attString addAttribute:NSShadowAttributeName value:shadow range:range]; 

textView.attributedText = attString; 

Однако textView.attributedText предназначен для iOS6.Если вы должны поддерживать более низкие версии, вы можете использовать следующий подход. (Не забудьте добавить #import <QuartzCore/QuartzCore.h>)

CALayer *textLayer = (CALayer *)[textView.layer.sublayers objectAtIndex:0]; 
textLayer.shadowColor = [UIColor whiteColor].CGColor; 
textLayer.shadowOffset = CGSizeMake(0.0f, 1.0f); 
textLayer.shadowOpacity = 1.0f; 
textLayer.shadowRadius = 0.0f; 
+3

Алмаз в грубый ответ. Это намного быстрее, чем настройка свойств тени CALayer. – user

+1

Это также работает для добавления размытия в тень, если вы добавляете 'shadow.shadowBlurRadius = 6.f;' – gavdotnet