我知道iPhone上开箱即用的UILabel不支持柔和阴影。那么实现我自己的最佳方式是什么?
修改
显然我会继承UILabel
并在-drawRect中绘制:
我的问题是,我如何将标签的内容作为图形并在它们周围绘制,模糊它们等等......
编辑2:
一年后我回到了这个问题。与此同时,我构建了一个类,允许您轻松地向标签添加柔和阴影并调整其半径等,并在文本本身上绘制渐变。你可以在GitHub上找到它:https://github.com/doukasd/iOS-Components/tree/master/Views
答案 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 answer到this 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并设置了用户定义的运行时属性,这样非程序员就可以轻松控制外观。
答案 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子类提供了软阴影支持和一系列其他效果:
答案 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
属性设置该颜色。
答案 14 :(得分:-3)
子类UILabel,并覆盖-drawInRect: