2013-07-04 5 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;

и это @synthesized в .m файл, и это связано в интерфейсе строителя

я в состоянии сделать другие настройки для кнопки, как меняется его цвет фона (сплошной цвет) и изменение цвета текста. Но когда я пытаюсь использовать градиентный цвет, фон просто прозрачен.

Я ценю вашу помощь!

ответ

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

Смежные вопросы