【问题标题】:Drop Shadow on UITextField text在 UITextField 文本上投影
【发布时间】:2010-11-19 10:31:05
【问题描述】:

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

【问题讨论】:

    标签: iphone objective-c uikit uitextfield shadow


    【解决方案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);
    

    【讨论】:

    • 效果很好。在 iPad 上,您应该将偏移量更改为 CGSizeMake(0.0, 1.0) 并将颜色更改为白色。
    • 确实,最简单的解决方案。您需要 #import <QuartzCore/QuartzCore.h> 才能使用。
    • 我使用这段代码在 UILabel 的文本上应用阴影。工作完美!通过使用 label.layer.shadowOpacity 等,文本得到了阴影
    • 奇怪我只能在我的 UILabel 上使用 shadowColor 和 shadowOffset 属性。图层属性没有影响。我已将 QuartzCore 添加到我的项目中。
    • @wprater ....你必须导入 <QuartzCore/QuartzCore.h> 正如 Guillaume Boudreau 之前所说的那样。导入它是不够的。然后您就可以使用这些属性了。
    【解决方案2】:

    我有一个稍微不同的问题 - 我希望 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 documentation

    【讨论】:

    • 感谢代码!您可以删除 CGContextSetShadow 行,因为您正在调用 CGContextSetShadowWithColor。根据 CGContext.h CGContextSetShadow 是“相当于调用 CGContextSetShadowWithColor(context, offset, blur, color) 其中颜色为黑色,1/3 alpha”
    • 谢谢 - 我已经删除了那行 - 典型的剪切和粘贴示例错误:)
    • “Quartz 2D 文档”链接失效,新链接为:developer.apple.com/library/mac/#documentation/GraphicsImaging/…
    • 感谢整洁的 sn-p。我在我的项目中使用了它,经过一些尝试,我发现将 'shadowOffset' 设置为 (0, 0) 和 'blur' 设置为 2,文本标签正是我需要的阴影。
    【解决方案3】:

    我认为您不会像使用 UILabel 那样获得对文本阴影的内置支持。

    两个想法:

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

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

    【讨论】:

    • 您绝对应该使用以下来自 egarc 的答案,这是解决此问题的更好方法!
    • 没错,@Mac_Cain13。这些 CALayer 属性是在 iOS 3.2 中添加的,我写答案时没有发布。
    【解决方案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;
    

    【讨论】:

    • 粗略回答中的钻石。这比设置 CALayer 阴影属性要快得多。
    • 如果您添加shadow.shadowBlurRadius = 6.f;,这也适用于将模糊添加到阴影中
    猜你喜欢
    • 2017-01-30
    • 1970-01-01
    • 1970-01-01
    • 2014-08-01
    • 2010-10-26
    • 1970-01-01
    • 2023-03-26
    • 2014-10-07
    • 2018-08-06
    相关资源
    最近更新 更多