2016-11-16 50 views
0

如何將漸變添加到UIButton標題中,而按鈕背景清晰但角落邊框也是漸變。清除帶有漸變標題和cornerBorder的UIButton

我發現如何添加漸變邊框here,但不知道如何使漸變標籤。如果標籤漸變匹配邊框漸變顏色,那將會很棒。

也許我可以用標籤形狀的面具以某種方式創建這種效果?

回答

0

雖然康斯坦丁答案沒有工作,標題標籤梯度不一定匹配邊框顏色: enter image description here

所以這是我的解決方案:

class GradientButton: UIButton { 
    override func awakeFromNib() { 

     layoutIfNeeded() 

     let gradientBorder = CAGradientLayer() 
     gradientBorder.frame =  bounds 
     //Set gradient to be horizontal 
     gradientBorder.startPoint = CGPoint(x: 0, y: 0.5) 
     gradientBorder.endPoint = CGPoint(x: 1, y: 0.5) 
     gradientBorder.colors = [UIColor.red.cgColor, UIColor.yellow.cgColor] 

     let shape = CAShapeLayer() 
     shape.lineWidth =  2 
     shape.path =   UIBezierPath(rect: bounds).cgPath 
     shape.strokeColor = UIColor.black.cgColor 
     shape.fillColor =  UIColor.clear.cgColor 
     gradientBorder.mask = shape 

     layer.addSublayer(gradientBorder) 

     let gradient =  CAGradientLayer() 
     gradient.frame =  bounds 
     //Set gradient to be horizontal 
     gradient.startPoint = CGPoint(x: 0, y: 0.5) 
     gradient.endPoint = CGPoint(x: 1, y: 0.5) 
     gradient.colors =  [UIColor.red.cgColor, UIColor.yellow.cgColor] 

     layer.insertSublayer(gradient, at: 0) 

     let overlayView = UIView(frame: bounds) 
     overlayView.isUserInteractionEnabled = false 
     overlayView.layer.insertSublayer(gradient, at: 0) 
     overlayView.mask = titleLabel 

     addSubview(overlayView) 
    } 
} 

而結果:

enter image description here

0

您可以創建漸變層並添加到相同的UIButton

CAGradientLayer *gradient = [CAGradientLayer layer]; 
    gradient.frame = btn.bounds; 
    gradient.colors = [NSArray arrayWithObjects: 
         (id)[[UIColor colorWithRed:255.0f/255.0f green:255.0f/255.0f blue:255.0f/255.0f alpha:.6f] CGColor], 
         (id)[[UIColor colorWithRed:200.0f/255.0f green:200.0f/255.0f blue:200.0f/255.0f alpha:.4f] CGColor], 
         (id)[[UIColor colorWithRed:150.0f/255.0f green:150.0f/255.0f blue:150.0f/255.0f alpha:.4f] CGColor], 
         (id)[[UIColor colorWithRed:100.0f/255.0f green:100.0f/255.0f blue:100.0f/255.0f alpha:.4f] CGColor], 
         (id)[[UIColor colorWithRed:50.0f/255.0f green:50.0f/255.0f blue:50.0f/255.0f alpha:.4f] CGColor], 
         (id)[[UIColor colorWithRed:5.0f/255.0f green:5.0f/255.0f blue:5.0f/255.0f alpha:.4f] CGColor], 
         nil]; 
    [btn.layer insertSublayer:gradient atIndex:0]; 

    CAGradientLayer *glossLayer = [CAGradientLayer layer]; 
    glossLayer.frame = btn.bounds; 
    glossLayer.colors = [NSArray arrayWithObjects: 
        (id)[UIColor colorWithWhite:1.0f alpha:0.4f].CGColor, 
        (id)[UIColor colorWithWhite:1.0f alpha:0.1f].CGColor, 
        (id)[UIColor colorWithWhite:0.75f alpha:0.0f].CGColor, 
        (id)[UIColor colorWithWhite:1.0f alpha:0.1f].CGColor, 
        nil]; 
    glossLayer.locations = [NSArray arrayWithObjects: 
         [NSNumber numberWithFloat:0.0f], 
         [NSNumber numberWithFloat:0.5f], 
         [NSNumber numberWithFloat:0.5f], 
         [NSNumber numberWithFloat:1.0f], 
         nil]; 
    [btn.layer insertSublayer:glossLayer atIndex:0]; 

希望它能幫助。

+0

呀,我知道該怎麼做,但是這不是我所期待的,因爲在你的情況下按鈕的背景顏色不.clear,標籤顏色不是漸變,按鈕沒有邊框。 我不確定你爲什麼重複幾乎相同的漸變層兩次? – Xernox

2

喜的easies方法是從patternImage創建UIColor像這樣:

let image = UIImage(named: "gradient.jpeg"); 
let color = UIColor(patternImage: image!); 

然後,只需使用在您需要的顏色:

buttonAction.layer.borderWidth = 1; 
buttonAction.layer.cornerRadius = 5; 
buttonAction.layer.borderColor = color.cgColor; 

buttonAction.setTitleColor(color, for: .normal); 

結果: enter image description here

爲創建一個漸變UIColor使用這種方法:(你可以將它添加到UIColor擴展)

func gradientColorFrom(color color1:UIColor, toColor color2:UIColor ,withSize size:CGSize) ->UIColor 
{ 
    UIGraphicsBeginImageContextWithOptions(size, false, 0); 
    let context = UIGraphicsGetCurrentContext(); 
    let colorspace = CGColorSpaceCreateDeviceRGB(); 

    let colors = [color1.cgColor, color2.cgColor] as CFArray; 

    let gradient = CGGradient(colorsSpace: colorspace, colors: colors, locations: nil); 
    context!.drawLinearGradient(gradient!, start: CGPoint(x:0, y:0), end: CGPoint(x:size.width, y:0), options: CGGradientDrawingOptions(rawValue: UInt32(0))); 

    let image = UIGraphicsGetImageFromCurrentImageContext(); 

    UIGraphicsEndImageContext(); 

    let finalCColor = UIColor(patternImage: image!); 
    return finalCColor; 

} 
  • 的水平梯度利用CGPoint(x:size.width, y:0)
  • 的垂直梯度使用CGPoint(x:0, y:size.height)
+0

這正是我正在尋找的。在這種情況下,如果按鈕寬度保持不變,標題將爲「某些」,我猜「S」會變成紅色,「e」變成淺藍色?是否有可能實現「S」是紫色和「e」暗藍色? – Xernox

+0

我剛剛更新了我的答案嘗試'gradientColorFrom(color,toColor,withSize)'方法 –

+0

雖然您的示例確實有效,但按鈕tittle顏色不對應邊框顏色 – Xernox