iPhone UILabel文字软阴影

时间:2009-11-10 16:13:28

标签: iphone objective-c iphone-sdk-3.0 uilabel shadow

我知道iPhone上开箱即用的UILabel不支持柔和阴影。那么实现我自己的最佳方式是什么?

修改

显然我会继承UILabel并在-drawRect中绘制: 我的问题是,我如何将标签的内容作为图形并在它们周围绘制,模糊它们等等......

编辑2:

一年后我回到了这个问题。与此同时,我构建了一个类,允许您轻松地向标签添加柔和阴影并调整其半径等,并在文本本身上绘制渐变。你可以在GitHub上找到它:https://github.com/doukasd/iOS-Components/tree/master/Views

15 个答案:

答案 0 :(得分:188)

从3.2开始,SDK中直接支持阴影。

label.layer.shadowColor = [label.textColor CGColor];
label.layer.shadowOffset = CGSizeMake(0.0, 0.0);

导入<QuartzCore/QuartzCore.h>并使用一些参数:

label.layer.shadowRadius = 3.0;
label.layer.shadowOpacity = 0.5;

并且,如果您发现您的阴影被标签边界剪切:

label.layer.masksToBounds = NO;

终于设置了

label.layer.shouldRasterize = YES

答案 1 :(得分:38)

我建议你使用UILabel的shadowColor和shadowOffset属性:

UILabel* label = [[UILabel alloc] init];
label.shadowColor = [UIColor whiteColor];
label.shadowOffset = CGSizeMake(0,1);

答案 2 :(得分:19)

This answerthis similar question提供了在UILabel后面绘制模糊阴影的代码。作者使用CGContextSetShadow()为绘制的文本生成阴影。

答案 3 :(得分:16)

除了IIDan的回答: 出于某些目的,有必要设置

label.layer.shouldRasterize = YES

我认为这是由于用于渲染阴影的混合模式。例如,我有一个深色背景和白色文本,并希望使用黑色阴影发光“突出显示”文本。在我设置这个属性之前它没有工作。

答案 4 :(得分:7)

在视图的图层上应用(软)阴影,如下所示:

UILabel *label = [[UIabel alloc] init];
label.layer.shadowColor = [[UIColor whiteColor] CGColor];
label.layer.shadowOpacity = 1.0;

答案 5 :(得分:6)

让事情保持最新:在Swift中创建阴影就像这样简单:

导入QuartzCore Framework

import QuartzCore

并将阴影属性设置为标签

titleLabel.shadowColor = UIColor.blackColor()
titleLabel.shadowOffset = CGSizeMake(0.0, 0.0)
titleLabel.layer.shadowRadius = 5.0
titleLabel.layer.shadowOpacity = 0.8
titleLabel.layer.masksToBounds = false
titleLabel.layer.shouldRasterize = true

答案 6 :(得分:5)

_nameLabel = [[UILabel alloc] initWithFrame:CGRectZero];
_nameLabel.font = [UIFont boldSystemFontOfSize:19.0f];
_nameLabel.textColor = [UIColor whiteColor];
_nameLabel.backgroundColor = [UIColor clearColor];
_nameLabel.shadowColor = [UIColor colorWithWhite:0 alpha:0.2];
_nameLabel.shadowOffset = CGSizeMake(0, 1);

我认为您应该使用[UIColor colorWithWhite:0 alpha:0.2]来设置alpha值。

答案 7 :(得分:4)

我尝试了几乎所有这些技术(FXLabel除外)并且无法使用其中任何一种技术与iOS 7一起使用。我最终找到了THLabel,它对我来说非常合适。我在Interface Builder中使用了THLabel并设置了用户定义的运行时属性,这样非程序员就可以轻松控制外观。

https://github.com/MuscleRumble/THLabel

答案 8 :(得分:4)

这就像一招,

UILabel *customLabel = [[UILabel alloc] init];

UIColor *color = [UIColor blueColor];
customLabel.layer.shadowColor = [color CGColor];
customLabel.layer.shadowRadius = 5.0f;
customLabel.layer.shadowOpacity = 1;
customLabel.layer.shadowOffset = CGSizeZero;
customLabel.layer.masksToBounds = NO;

答案 9 :(得分:3)

如上所述,子类UILabel在drawRect:中执行[self drawTextInRect:rect];以获取绘制到当前上下文中的文本。一旦它在那里,你可以通过添加过滤器和诸如此类的东西开始使用它。如果你想使用你刚刚进入上下文的内容制作投影,你应该可以使用:

CGContextSetShadowWithColor()

在文档中查看该功能以了解如何使用它。

答案 10 :(得分:3)

我写了一个库,它为UILabel子类提供了软阴影支持和一系列其他效果:

https://github.com/nicklockwood/FXLabel

答案 11 :(得分:1)

从iOS 5开始,Apple提供了一种私有api方法来创建具有柔和阴影的标签。 标签非常快:我在一系列透明视图中同时使用了几十个标签,滚动动画没有减速。

这仅适用于非App Store应用程序(显然),您需要头文件。

$SBBulletinBlurredShadowLabel = NSClassFromString("SBBulletinBlurredShadowLabel");

CGRect frame = CGRectZero;

SBBulletinBlurredShadowLabel *label = [[[$SBBulletinBlurredShadowLabel alloc] initWithFrame:frame] autorelease];
label.backgroundColor = [UIColor clearColor];
label.textColor = [UIColor whiteColor];
label.font = [UIFont boldSystemFontOfSize:12];
label.text = @"I am a label with a soft shadow!";
[label sizeToFit];

答案 12 :(得分:1)

Swift 3中,您可以创建扩展程序:

import UIKit

extension UILabel {
    func shadow() {
        self.layer.shadowColor = self.textColor.cgColor
        self.layer.shadowOffset = CGSize.zero
        self.layer.shadowRadius = 3.0
        self.layer.shadowOpacity = 0.5
        self.layer.masksToBounds = false
        self.layer.shouldRasterize = true
    }
}

并通过以下方式使用:

label.shadow()

答案 13 :(得分:0)

虽然不可能直接在UILabel上设置模糊半径,但是您绝对可以通过操作CALayer来更改它。

只需设置:

//Required properties
customLabel.layer.shadowRadius = 5.0 //set shadow radius to your desired value.
customLabel.layer.shadowOpacity = 1.0 //Choose an opacity. Make sure it's visible (default is 0.0)

//Other options
customLabel.layer.shadowOffset = CGSize(width: 10, height: 10)
customLabel.layer.shadowColor = UIColor.black.cgColor
customLabel.layer.masksToBounds = false

如果您在尝试设置{{1 }}。

因此,如果设置Shadow Color不起作用,请在Interface Builder上为此.layer.shadowRadius验证label.layer.shadowRadius。应将其设置为Shadow Color。然后,如果您想要黑色以外的阴影颜色,请同时通过UILabel属性设置该颜色。

enter image description here

答案 14 :(得分:-3)

子类UILabel,并覆盖-drawInRect: