2012-06-25 63 views
1

我想讓我的iOS應用程序中的按鈕具有紅色漸變。起初我使用圖像來做到這一點,但後來意識到我可以用QuartzCore框架來完成。我有以下執行文件:iOS - 分類UIButton - 在何處添加高亮顯示狀態的代碼?

#import "RedButton.h" 

@implementation RedButton 

@synthesize gradientLayer = _gradientLAyer; 

- (void)awakeFromNib; 
{ 
    // Initialize the gradient layer 
    self.gradientLayer = [[CAGradientLayer alloc] init]; 
    // Set its bounds to be the same of its parent 
    [self.gradientLayer setBounds:[self bounds]]; 
    // Center the layer inside the parent layer 
    [self.gradientLayer setPosition: 
    CGPointMake([self bounds].size.width/2, 
       [self bounds].size.height/2)]; 

    // Insert the layer at position zero to make sure the 
    // text of the button is not obscured 
    [[self layer] insertSublayer:self.gradientLayer atIndex:0]; 

    // Set the layer's corner radius 
    [[self layer] setCornerRadius:5.0f]; 
    // Turn on masking 
    [[self layer] setMasksToBounds:YES]; 
    // Display a border around the button 
    // with a 1.0 pixel width 
    [[self layer] setBorderColor:[UIColor colorWithRed:(158.0f/255.0f) green:0.0f blue:0.0f alpha:1.0f].CGColor]; 
    [[self layer] setBorderWidth:1.0f]; 

    [self.gradientLayer setColors:[NSArray arrayWithObjects: 
           (id)[[UIColor colorWithRed:(214.0f/255.0f) green:0.0f blue:0.0f alpha:1.0f] CGColor], 
           (id)[[UIColor colorWithRed:(141.0f/255.0f) green:0.0f blue:0.0f alpha:1.0f] CGColor], nil]]; 

    [[self layer] setNeedsDisplay]; 

} 

- (void)drawRect:(CGRect)rect; 
{ 
    [super drawRect:rect]; 
} 

- (void)dealloc { 
    // Release our gradient layer 
    self.gradientLayer = nil; 
    [super dealloc]; 
} 
@end 

第一個問題 - 我有權在這裏使用awakeFromNib嗎?或者我應該使用initWithFrame?

第二個問題 - 最初我使用圖像和使用界面生成器來設置按鈕的默認和突出顯示的狀態。現在我沒有使用圖像,如何設置突出顯示的按鈕外觀?我只想扭轉漸變。

第三個問題 - 我看過它寫在一些地方,你不應該繼承UIButton。如果沒有,我將如何改變我的所有按鈕來使這個漸變沒有重複很多代碼?

在此先感謝。

回答

3

edit1:誤讀有關圖像的部分。 你應該能夠做這樣的事情來使用漸變

// your code for setting up the gradient layer comes first 
UIGraphicsBeginImageContext(CGSizeMake(1, [self bounds].size.height)); 
[gradientLayer renderInContext: UIGraphicsGetCurrentContext()]; 
UIImage *bgImage = UIGraphicsGetImageFromCurrentImageContext(); 
UIGraphicsEndImageContext(); 
[self setBackGroundImage:bgImage forState:UIControlStateWhatever] // replace with correct states 

本身設定按鈕的狀態作爲圖像====================== ======

我建議把你的初始化代碼放在awakeFromNib以外的函數中(對於按鈕實際上不用在筆尖中但可能在代碼中創建的情況)。您應該創建一個自定義初始化函數,並在initWithCoderinitWithFrame中調用它This answer顯示了一個很好的模式。

你可以通過調用

[self setBackGroundImage: forState]; 

凡在這種情況下,你的狀態會UIControlStateHighlighted設置在初始化不同狀態的背景。

除此之外,在這種情況下針對子類化的一個參數是您實際上沒有定義任何自定義行爲,您只是試圖重用一些樣式代碼。一個子類在這裏不是必須的,你可以做一些簡單的事情,比如在一個地方創建一個格式化函數(在你的viewcontroller中,或者在另一個類中的某個函數),它將UIButton作爲一個場景並執行所有初始化代碼。這樣,你就不會把你的按鈕鎖定在一個子類中(如果你實際上最終使用了另一個UIButton子類,那麼它很有用。例如,我喜歡使用一個定義自定義觸摸行爲的按鈕,使按鈕成爲非矩形形狀(並且其觸摸區域受限於此)

我見過的另一個參數是UIButton包含一些工廠函數,它們可能會返回與您的子類不同類型的按鈕,但您可能永遠不會遇到此問題如果你不使用這些功能。

相關問題