2011-04-28 88 views
5

我想将内部阴影应用于UILabel。我有一个解决方案,但它不够好。任何人有更好的解决方案?将内部阴影应用于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给了我们一个外的影子,而不是内部阴影(除非我失去了一些东西)。

+0

您是否在myShadowOffset中尝试过负值? – adam 2011-04-28 11:28:02

回答

4

我试图做到这一点,但最终选择使用默认shadowOffset并与shadowColor一起玩给内部投影效果的文字。在小文本中,它给你一个很好的内在阴影效果。例如,如果您有灰色背景并将白色应用于阴影,则您具有可接受的内部阴影效果。

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

21

借款上面,如果你做反向即。设置您的文本颜色等于您的背景颜色(低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来改变光线的方向。

+0

非常简单,一个很好的解决方案。 – Nik 2013-05-22 02:03:42