2013-07-04 112 views
0

我發現從教程此代碼,並試圖使用它:的UIButton梯度不工作

CAGradientLayer *btnGradient = [CAGradientLayer layer]; 
btnGradient.frame = button.bounds; 
btnGradient.colors = [NSArray arrayWithObjects: 
         (id)[[UIColor colorWithRed:102.0f/255.0f green:102.0f/255.0f blue:102.0f/255.0f alpha:1.0f] CGColor], 
         (id)[[UIColor colorWithRed:51.0f/255.0f green:51.0f/255.0f blue:51.0f/255.0f alpha:1.0f] CGColor], 
         nil]; 
[button.layer insertSublayer:btnGradient atIndex:0]; 

的代碼在viewDidLoad方法。

按鈕這樣定義在.h文件中:@property (nonatomic, strong) IBOutlet UIButton *button;

而且它在.m文件@synthesized和它的連接界面生成器

我能夠做其他的定製按鈕像改變其背景顏色(純色)和改變文本的顏色。但是當我嘗試使用漸變色時,背景只是透明的。

我感謝您的幫助!

回答

0

可能首先需要設置框架按鈕。嘗試這個。

+ (UIButton*) buttonWithGradient:(CGSize)size beginColor:(UIColor*)beginColor endColor:(UIColor*)endColor 
{ 
    CGRect frame = { CGPointZero, size }; 

    UIButton* button = [[UIButton alloc] initWithFrame:frame]; 

    CAGradientLayer* gradient = [CAGradientLayer layer]; 
    gradient.frame = frame; 
    gradient.colors = @[(id)beginColor.CGColor, (id)endColor.CGColor]; 
    [button.layer insertSublayer:gradient atIndex:0]; 

    return [button autorelease]; 
} 
+0

我該如何使用它? (我不是很熟悉obj-c/cocoa) –

+0

rewrite +(UIButton *)buttonWith ... - > - (UIButton *)buttonWith ...在你的類中:UIButton * button = [self buttonWithGradient: 「你的尺寸」beginColor:「你的開始顏色」endColor:「你的最終顏色」]; – Sauvage

+0

方法以+靜態方法開始。 – Sauvage

1

您需要設置漸變圖層的框架來覆蓋整個按鈕。機會在於viewDidLoad按鈕的大小爲零,這會使漸變圖層的框架變爲零......並且稍後當按鈕的大小發生變化時,漸變圖層的框架也不會相應更改。

子類UIButton和重寫layoutSubviews是一個好主意

@interface MyButton : UIButton { 

} 

@implementation MyButton { 
    CAGradientLayer* _gradient; 
} 

-(id)init { 
    self = [super init]; 

    _gradient = [CAGradientLayer layer]; 
    _gradient.colors = [NSArray arrayWithObjects: 
         (id)[[UIColor colorWithRed:102.0f/255.0f green:102.0f/255.0f blue:102.0f/255.0f alpha:1.0f] CGColor], 
         (id)[[UIColor colorWithRed:51.0f/255.0f green:51.0f/255.0f blue:51.0f/255.0f alpha:1.0f] CGColor], 
         nil]; 
    [self.layer insertSublayer:_gradient atIndex:0]; 
} 

-(void)layoutSubviews { 
    [super layoutSubviews]; 

    _gradient.frame = self.bounds; 
} 

@end 

另一種選擇是使用observeValueForKeyPath...來檢測按鈕的幀的變化,並相應地調整層。不是一個非常可重用的解決方案。

+0

[self.layer insertSublayer:_gradient atIndex:0];是我尋找的解決方案。非常感謝! – coolcool1994