在UITextField文本上拖放阴影

是否可以添加一个阴影的文字在UITextField

从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); 

我有一个稍微不同的问题 – 我想要一个UILabel模糊的阴影。 幸运的是,这个解决scheme竟然是Tyler的数字(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的解决scheme2的性能要比Tyler的1号好一些 – 你只能在视图中处理一个UILabel,假设你没有重画每一帧,在渲染性能方面不是一个打击正常的UILabel。

PS这个代码大量地从Quartz 2D文档中借用

我不认为你在这里得到了对文本阴影的内置支持,就像你用UILabel做的那样。

两个想法:

(1) [对代码有点棘手]在原始文件后面添加第二个UITextField ,位置非常小(可能是(0.2,0.8)?)。 您可以通过实现UITextFieldDelegate协议中的textField:shouldChangeCharactersInRange:replacementString:方法来逐键监听每个文本更改。 使用它,您可以同时更新较低的文本。 你也可以使下面的文本(阴影文本)灰色,甚至使用分数偏移的文本矩形看起来模糊的事实,甚至有点模糊。 补充:哦,不要忘记设置顶部文本字段的背景颜色为[UIColor clearColor]如果你去这个想法。

(2) [更有趣的代码。]子类UITextField并重写drawRect:方法。 我之前没有这样做,所以我会提前说,这取决于这是指定的绘图方法,它可能会certificate您必须重写另一个绘图函数,如drawTextInRect:它是特定于UITextField 。 现在设置绘图上下文,通过CGContextSetShadow函数绘制阴影,并调用[super drawRect:rect]; 。 希望这样做 – 如果原始的UITextField代码清除了绘图上下文的阴影参数,那么这个想法就会被彻底清除,而且你必须自己编写整个绘图代码,这是我推荐的,因为所有的UITextFields像日文中的复制粘贴和汉字input。

虽然将阴影直接应用到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;