55

是否可以为 a 中的文本添加阴影UITextField

4

4 回答 4

178

从 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);
于 2010-10-29T05:27:39.777 回答
74

我有一个稍微不同的问题 - 我想要 UILabel 上的阴影模糊。幸运的是,这个问题的解决方案是来自 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 的 2 号解决方案在性能方面比 Tyler 的 1 号要好一些——你只在视图中处理一个 UILabel ,并且假设你没有重绘每一帧,它在渲染性能上并不是一个打击正常的UILabel。

PS 此代码大量借鉴Quartz 2D 文档

于 2009-10-08T10:59:01.520 回答
18

我不认为您在这里获得对文本阴影的内置支持,就像您使用UILabel.

两个想法:

(1) [编码难度适中。]UITextField在原始代码后面添加一秒,偏移量非常小(可能是 (0.2,0.8)?)。textField:shouldChangeCharactersInRange:replacementString:您可以通过实现协议中的方法来逐键监听每个文本更改UITextFieldDelegate。使用它,您可以同时更新下部文本。您还可以使用部分偏移文本矩形看起来模糊的事实使下部文本(阴影文本)变灰,甚至稍微模糊。补充:[UIColor clearColor]哦,是的,如果您同意这个想法,请不要忘记将顶部文本字段的背景颜色设置为。

(2) [编码更有趣。]子类UITextField化并覆盖该drawRect:方法。drawTextInRect:我以前没有这样做过,所以我先提一下,这取决于 this 是指定的绘图方法,并且可能需要重写另一个绘图函数,例如UITextField. 现在设置绘图上下文以通过函数绘制阴影CGContextSetShadow然后调用[super drawRect:rect];. 希望这行得通——如果原始UITextField代码清除了绘图上下文的阴影参数,那么这个想法就会被打破,你必须自己编写整个绘图代码,我不建议这样做,因为UITextFields像副本一样附带所有额外内容- 并粘贴和日文汉字输入。

于 2009-08-13T20:20:16.263 回答
17

尽管将阴影直接应用于UITextView遗嘱的方法有效,但这样做是错误的方法。通过直接添加带有清晰背景颜色的阴影,所有子视图都会获得阴影,甚至光标。

应该使用的方法是 with 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;
于 2013-05-16T06:51:35.670 回答