UIButton с GradientLayer затемняет изображение и затемняет градиент - PullRequest
31 голосов
/ 12 ноября 2011

У меня есть кнопка UIB, где я хотел бы иметь градиент в качестве фона под изображением (символ с прозрачным фоном), но я сталкиваюсь с двумя разными проблемами.

Первый из CAGradientLayer кажетсячтобы наложить поверх изображения независимо от того, как я пытаюсь добавить его, полностью скрывая изображение.

Во-вторых, сам градиент, кажется, сильно затемнен, как кнопка была отключена, а это не так.

Вот мой код:

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];

Ответы [ 4 ]

71 голосов
/ 24 ноября 2011

Так что мне удалось обойти это, выполнив [buttonVreadSubviewToFront: button.imageView] после добавления градиента. Кажется, что независимо от того, что я делаю, новый слой будет добавлен поверх imageView, поэтому мне нужно потом перенести его на передний план.

Objective-C:

[button bringSubviewToFront:button.imageView] 

Swift 4.1:

button.bringSubview(toFront:button.imageView!)
28 голосов
/ 09 октября 2014

В качестве альтернативы, вы можете вставить слой градиента ниже слоя представления изображения

CAGradientLayer* gradient = [CAGradientLayer layer];
// ...
[button.layer insertSublayer:gradient below:button.imageView.layer];
5 голосов
/ 10 ноября 2016

SWIFT 3

Вот пример: (на основе ответа Нейла)

    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)

Удачного кодирования:)

0 голосов
/ 25 июля 2017

Swift 3

Вы можете переместить изображение над градиентом:

button.imageView?.layer.zPosition = 1

или вставить градиент под изображением:

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