2011-11-12 9 views
31

Mam UIButton tutaj, gdzie chciałbym mieć gradient jako tło pod obrazem (symbol z przezroczystym tłem), ale mam do czynienia z dwoma różnymi problemami.UIButton z GradientLayer zaciemnia obraz i przyciemnia gradient

Pierwszy z CAGradientLayer wydaje się nakładać na obraz bez względu na to, jak próbuję go dodać, całkowicie zasłaniając obraz.

Po drugie, sam gradient wydaje się być mocno zaciemniony, podobnie jak przycisk został wyłączony, a nim nie jest.

Oto mój kod:

self.backButton = [[UIButton alloc] initWithFrame:CGRectMake(15, 35, 28, 28)]; 
[backButton addTarget:self 
       action:@selector(goBack) 
    forControlEvents:UIControlEventTouchUpInside]; 
[backButton setBackgroundColor:[UIColor clearColor]]; 
CAGradientLayer *buttonGradient = [CAGradientLayer layer]; 
buttonGradient.frame = backButton.bounds; 
buttonGradient.colors = [NSArray arrayWithObjects: 
         (id)[[UIColor colorWithRed:.0 
               green:.166 
               blue:.255 
               alpha:1] CGColor], 
         (id)[[UIColor colorWithRed:.0 
               green:.113 
               blue:.255 
               alpha:1] CGColor], 
         nil]; 
[buttonGradient setCornerRadius:backButton.frame.size.width/2]; 
[backButton.layer insertSublayer:buttonGradient 
         atIndex:0]; 
[backButton setImage:[UIImage imageNamed:@"backarrow.png"] 
      forState:UIControlStateNormal]; 
[backButton setEnabled:NO]; 
[topbarView addSubview:backButton]; 

Odpowiedz

61

Więc udało mi się obejść ten problem, wykonując przycisk [bringSubviewToFront: button.imageView] po dodaniu gradient. Wygląda na to, że bez względu na to, co zrobię, nowa warstwa doda na wierzch obrazu, więc muszę to potem przesunąć na przód.

+0

Nicea rozwiązania, dzięki –

+0

doskonały, dzięki – avdyushin

21

Alternatywnie, można wstawić warstwę gradientu poniżej warstwy widoku obrazka

CAGradientLayer* gradient = [CAGradientLayer layer]; 
// ... 
[button.layer insertSublayer:gradient below:button.imageView.layer]; 
+0

dosłownie właśnie uratowałem moje życie! ;) Obraz nie był wyświetlany po dodaniu warstwy z gradientem, ponieważ warstwa była oczywiście - nad warstwą obrazu. Dzięki – virusss8

1

SWIFT 3

Tu idzie przykład: (Na podstawie Neil odpowiedź)

let layer = CAGradientLayer() 
    layer.frame = CGRect(x: 0, y: 0, width: myButtonOutlet.layer.frame.size.width, height: myButtonOutlet..layer.frame.size.height) 
    layer.colors = [UIColor.white.cgColor, pixelColorReceta.cgColor] 
    layer.masksToBounds = true 
    layer.cornerRadius = myButtonOutlet.layer.cornerRadius 
    myButtonOutlet.layer.insertSublayer(layer, below: myButtonOutlet..imageView?.layer) 

Szczęśliwe kodowanie :)

0

Swift 3

można przesunąć obraz powyżej gradientu:

contactButton.imageView?.layer.zPosition = 1 

lub wstawić gradient pod obrazem:

button.layer.insertSublayer(gradientLayer, below: button.imageView?.layer)