是否可以在UITextField
?
答案 0 :(得分:175)
从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 :(得分: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%不透明度的灰色,并且模糊不清。
我认为Tyler的2号解决方案在性能上要比Tyler的1号好一点 - 你只是在视图中处理一个UILabel而且假设你没有重绘每一帧,它在渲染中不是一个打击比正常的UILabel表现更好。
PS此代码大量借鉴Quartz 2D documentation
答案 2 :(得分:19)
我认为您不会像UILabel
那样获得文本阴影的内置支持。
两个想法:
(1) [中等难以编码。] 在原始位置后面添加第二个UITextField
,偏移量非常小(可能是(0.2,0.8)?)。通过在UITextFieldDelegate
协议中实施textField:shouldChangeCharactersInRange:replacementString:
方法,您可以逐个键地监听每个文本更改。使用它,您可以同时更新下部文本。您还可以将较低的文本(阴影文本)设置为灰色,甚至使用分数偏移文本显示模糊的事实稍微模糊。 已添加:哦,是的,如果您采用这个想法,请不要忘记将顶部文本字段的背景颜色设置为[UIColor clearColor]
。
(2) [代码更有趣。] 子类UITextField
并覆盖drawRect:
方法。我之前没有这样做过,所以我前面会提到这取决于这是指定的绘图方法,结果可能是你必须覆盖另一个绘图函数,例如drawTextInRect:
,这是特定于UITextField
。现在设置绘图上下文以通过the CGContextSetShadow
functions绘制阴影,并调用[super drawRect:rect];
。希望这有效 - 如果原始的UITextField
代码清除了绘图上下文的阴影参数,那么这个想法就会消失,你必须自己编写整个绘图代码,我反对推荐,因为所有的附加内容带有UITextFields
的复制粘贴和日文汉字输入。
答案 3 :(得分:16)
虽然将影子直接应用于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;