2011-04-28 82 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