it-swarm.com.ru

Тень в тексте UITextField

Можно ли добавить тень к тексту в UITextField?

54
DotSlashSlash

Начиная с версии 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);
176
egarc

У меня немного другая проблема - я хочу размытую тень на 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 и рисует текст с тенью вниз и вправо на 4 пикселя, тень серая с непрозрачностью 80% и слегка размытая.

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

PS Этот код сильно заимствован из Кварцевая 2D документация

72
deanWombourne

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

Две идеи:

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

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

19
Tyler

Хотя метод применения тени непосредственно к 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;
16
cnotethegr8