带有尖锐阴影的文字

时间:2013-08-24 12:12:21

标签: ios uilabel uifont quartz-core

我希望实现文字外观,如下图所示: enter image description here enter image description here

现在我正在研究字母周围的阴影,我无法弄清楚如何做到这一点。

到目前为止我尝试了什么:
  - 解决方案:

label.shadowColor = [UIColor blackColor];
label.shadowOffset = CGSizeMake(1, 2);

给出了一个漂亮的阴影,但它不符合我的需要有两个原因:

  1. 它仅从一侧产生阴影,由 shadowOffset 设置,而我需要一个“包裹”阴影;
  2. 此解决方案不会像图片中那样给出阴影(渐变)的柔和部分;
  3. - 解决方案:

    label.layer.shadowOffset = CGSizeMake(0, 0);
    label.layer.shadowRadius = 5.0;
    label.layer.shouldRasterize = YES;
    label.layer.shadowOpacity = 1;
    label.layer.shadowColor = [UIColor blackColor].CGColor;
    label.layer.masksToBounds = NO;
    

    效果很好,但即使 shadowOpacity 设置为1且 shadowColor 设置为黑色,它也会产生过于柔和的阴影:
    enter image description here
    显然这还不够,我已经考虑过在标签的背景下绘画了。但是,即使通过上下文绘制,我也不清楚如何实现目标。

    任何想法都会非常感激。

3 个答案:

答案 0 :(得分:1)

尝试使用以下代码: -

  [_testLable setText:@"TION ERRO"];
    [_testLable setTextColor:[UIColor whiteColor]];

    [_testLable setFont:[UIFont boldSystemFontOfSize:22] ];
    _testLable.layer.shadowOffset = CGSizeMake(0, 0);
    _testLable.layer.shadowRadius = 10.0;
    _testLable.layer.shouldRasterize = YES;
    _testLable.layer.shadowOpacity = 1;
    _testLable.layer.shadowColor = [UIColor blackColor].CGColor;
    _testLable.layer.masksToBounds = NO;

    CGPathRef shadowPath = CGPathCreateWithRect(_testLable.bounds, NULL);
    _testLable.layer.shadowPath = shadowPath;
    CGPathRelease(shadowPath);

它的输出是这样的: -

enter image description here

答案 1 :(得分:1)

使用您想要的形状的显式阴影路径。听起来你想要一个与你的文字形状相同的阴影,但是更大,每个阴影字母都以相应的字母为中心。完成后,使用阴影半径将阴影边缘软化到您想要的任何程度。

您所拥有的代码仅依靠阴影半径来使阴影大于文本,从而无法控制柔和度。

答案 2 :(得分:1)

试试这个 创建自定义UILabel子类和 Override 以下方法

- (void)drawTextInRect:(CGRect)rect {
    CGContextRef context = UIGraphicsGetCurrentContext();
    CGContextSaveGState(context);

    CGContextSetShadow(context, CGSizeMake(0.0, 0.0), 10);
    CGContextSetShadowWithColor(context, CGSizeMake(0.0, 0.0), 10, [UIColor blackColor].CGColor);

    [super drawTextInRect:rect];

    CGContextRestoreGState(context);
}

bottomColorLayer到标签

CALayer *bottomColorLayer = [CALayer layer];
bottomColorLayer.frame = CGRectMake(0, labelRect.size.height/2, labelRect.size.width, labelRect.size.height/2);
bottomColorLayer.backgroundColor = [[UIColor colorWithWhite:0 alpha:.5] CGColor];
[label.layer insertSublayer:bottomColorLayer above:(CALayer *)label.layer];

enter image description here

或如果您想要渐变

CAGradientLayer *bottomGradient = [CAGradientLayer layer];
bottomGradient.frame = CGRectMake(0, labelRect.size.height/2, labelRect.size.width, labelRect.size.height/2);
bottomGradient.cornerRadius = 0.0f;
bottomGradient.colors = @[(id)[[UIColor colorWithWhite:1 alpha:.5] CGColor], (id)[[UIColor colorWithWhite:0 alpha:.5] CGColor]];
[label.layer insertSublayer:bottomGradient above:(CALayer *)label.layer];