Можно ли добавить тень к тексту в UITextField
?
Drop Shadow в тексте UITextField
Ответ 1
Начиная с 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);
Ответ 2
У меня немного другая проблема - я хочу размытую тень на 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% и видимо размыта.
Я думаю, что решение Tyler номер 2 немного лучше для производительности, чем Tyler number 1 - вы имеете дело только с одним UILabel в представлении и, предполагая, что вы не перерисовываете каждый кадр, это не хит в рендеринге производительность над обычным UILabel.
PS Этот код сильно заимствован из Quartz 2D documentation
Ответ 3
Я не думаю, что вы получаете встроенную поддержку текстовых теней здесь, как вы это делаете с UILabel
.
Две идеи:
(1) [Умеренно сложный код.] Добавьте второй UITextField
позади оригинала с очень небольшим смещением (может быть, (0,2,0,8)?). Вы можете прослушивать каждое текстовое изменение по ключу, внедряя метод textField:shouldChangeCharactersInRange:replacementString:
в UITextFieldDelegate
. Используя это, вы можете обновлять нижний текст одновременно. Вы также можете сделать нижний текст (теневой текст) серым и даже слегка расплывчатым, используя тот факт, что прямоугольные текстовые прямоугольники выглядят размытыми. Добавлено: О да, не забудьте установить цвет фона верхнего текста в [UIColor clearColor]
, если вы идете с этой идеей.
(2) [Еще интереснее код.] Подкласс UITextField
и переопределить метод drawRect:
. Я не делал этого раньше, поэтому я упомянул заранее, что это зависит от того, является ли это назначенным методом рисования, и может оказаться, что вам нужно переопределить другую функцию рисования, такую как drawTextInRect:
, что характерно для UITextField
. Теперь настройте контекст рисования, чтобы нарисовать тени с помощью функций CGContextSetShadow
и вызвать [super drawRect:rect];
. Надеюсь, это сработает - если исходный код UITextField
очистит параметры теневого контекста чертежа, эта идея будет закрыта, и вам придется писать весь код чертежа самостоятельно, что я рекомендую порекомендовать из-за всех дополнений, которые приходят с UITextFields
как копирование и вставка и ввод кандзи на японском языке.
Ответ 4
Хотя метод применения тени непосредственно к 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;