将内阴影应用于UILabel

时间:2011-04-28 10:42:00

标签: iphone ios ipad uilabel shadow

我想将内阴影应用于UILabel。我有一个解决方案,但它还不够好。谁有更好的解决方案?

// UILabel subclass

- (void) drawTextInRect:(CGRect)rect {
    CGSize myShadowOffset = CGSizeMake(0, 2);
    float myColorValues[] = {255, 0, 0, 1};

    CGContextRef myContext = UIGraphicsGetCurrentContext();
    CGContextSaveGState(myContext);

    CGColorSpaceRef myColorSpace = CGColorSpaceCreateDeviceRGB();
    CGColorRef myColor = CGColorCreate(myColorSpace, myColorValues);

    CGContextSetShadowWithColor (myContext, myShadowOffset, 5, myColor);
    CGContextSetBlendMode(myContext, kCGBlendModeLighten);

    [super drawTextInRect:rect];

    CGColorRelease(myColor);
    CGColorSpaceRelease(myColorSpace); 

    CGContextRestoreGState(myContext);
}

我熟悉UILabel的图层属性,但是shadow offset给了我们一个外阴影,而不是内阴影(除非我遗漏了什么)。

3 个答案:

答案 0 :(得分:22)

借用Ruben上面的答案,如果你做反向即。设置您的文本颜色等于您的背景颜色(低alpha),然后将阴影设置为更强的颜色,它创建一个体面的插入效果。这就是我的意思(注意:我的视图背景为白色):

cell.textLabel.textColor     = [UIColor colorWithRed:1.0 green:1.0 blue:1.0 alpha:0.5];
cell.textLabel.shadowColor   = [UIColor darkGrayColor];
cell.textLabel.shadowOffset  = CGSizeMake(-1.0,-1.0);
[cell.textLabel setText:@"Welcome to MyApp!"];

这是输出

inset UILabel text

这可能只适用于非常浅的背景,因为我怀疑它会在较暗的背景上产生不需要的叠加。

你可以改变shadowOffset来改变光的方向。

答案 1 :(得分:4)

我尝试这样做,但最后选择使用默认的shadowOffset并使用shadowColor来为文本提供内部阴影效果。在小文本中,它为您提供了良好的内部阴影效果。例如,如果你有一个grayColor背景并将whiteColor应用于阴影,那么你有一个可接受的内部阴影效果。

有时,最好使用图形工具设计这些文本,并在需要时制作本地化副本。

答案 2 :(得分:3)

在这里回答:Inner Shadow in UILabel代码很长但似乎有效