带有GradientLayer的UIButton模糊图像并使渐变变暗

我有一个UIButton在这里,我想有一个渐变作为背景下的背景(具有透明背景的符号),但我面临着两个不同的问题。

第一个CAGradientLayer似乎叠加在图像的顶部,不pipe我怎么尝试添加它,完全模糊了图像。

其次梯度本身似乎变得很暗,就像button被禁用,事实并非如此。

这是我的代码:

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

所以我设法通过在添加渐变后执行[button bringSubviewToFront:button.imageView]来解决这个问题。 看来不pipe我做什么,新图层都会添加到imageView的顶部,所以我需要把它推到前面。

或者,您可以在图像视图的图层下方插入渐变图层

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

SWIFT 3

这里举一个例子:(根据Neil的答案)

  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) 

快乐编码:)

Swift 3

您可以将图像移动到渐变上方:

 contactButton.imageView?.layer.zPosition = 1 

或者在图像下插入渐变:

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