使用渐变边框和渐变文本创建清除按钮

11

我正试图为我的UIButton标题和按钮的边框添加渐变。我已经尝试了这里大部分的解决方案,但无论如何都不能让它们正常工作,可能已经过时了,我不确定。因此,目前我扩展UIView以设置任何东西的渐变。那么,我该如何添加另一个函数来实现此功能呢?

func setGradientBackground(colorOne: UIColor, colorTwo: UIColor)  {
    let gradientlayer = CAGradientLayer()
    gradientlayer.frame = bounds
    gradientlayer.colors = [colorOne.cgColor, colorTwo.cgColor]
    gradientlayer.locations = [0, 1]
    gradientlayer.startPoint = CGPoint(x: 1.0, y: 0.0)
    gradientlayer.endPoint = CGPoint(x: 0.0, y: 0.0)

    layer.insertSublayer(gradientlayer, at: 0)

}

我想要实现的一个例子


1
@MFDOOM,你设置赏金的问题是什么?原始问题完全不清楚。“我该如何为此功能添加另一个函数?”制作一个看起来像图片的视图很容易,这就是你想要的全部吗? - matt
2个回答

16

我为您创建了一个演示,您可以借助CAGradientLayer来实现此操作,请查看以下输出和代码。

enter image description here

故事板:

enter image description here

要为渐变按钮文本颜色和边框设置,请将UIButton放入UIView中,然后将CAGradientLayer分配给UIview

注意:不要忘记将按钮设置为视图的蒙版,请参见以下代码。

import UIKit

class ViewController: UIViewController {

    @IBOutlet var viewForButton: UIView!
    @IBOutlet var myButton: UIButton!

    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view, typically from a nib.

        // Create a gradient layer
        let gradient = CAGradientLayer()

        // gradient colors in order which they will visually appear
        gradient.colors = [UIColor.red.cgColor, UIColor.blue.cgColor]

        // Gradient from left to right
        gradient.startPoint = CGPoint(x: 0.0, y: 0.5)
        gradient.endPoint = CGPoint(x: 1.0, y: 0.5)

        // set the gradient layer to the same size as the view
        gradient.frame = viewForButton.bounds

        // add the gradient layer to the views layer for rendering
        viewForButton.layer.insertSublayer(gradient, at: 0)

        // Tha magic! Set the button as the views mask
        viewForButton.mask = myButton

        //Set corner Radius and border Width of button
        myButton.layer.cornerRadius =  myButton.frame.size.height / 2
        myButton.layer.borderWidth = 5.0
    }

}

扩展: 您也可以考虑此扩展程序。

extension UIView{

    func gradientButton(_ buttonText:String, startColor:UIColor, endColor:UIColor) {

        let button:UIButton = UIButton(frame: self.bounds)
        button.setTitle(buttonText, for: .normal)

        let gradient = CAGradientLayer()
        gradient.colors = [startColor.cgColor, endColor.cgColor]
        gradient.startPoint = CGPoint(x: 0.0, y: 0.5)
        gradient.endPoint = CGPoint(x: 1.0, y: 0.5)
        gradient.frame = self.bounds
        self.layer.insertSublayer(gradient, at: 0)
        self.mask = button

        button.layer.cornerRadius =  button.frame.size.height / 2
        button.layer.borderWidth = 5.0
    }
}

如何使用:

testView.gradientButton("Hello", startColor: .red, endColor: .blue)

我可以在上面使用的函数中如何实现这一点呢?@AtulParmar - OCTAVIAN
1
我按照您的方式实现了,但按钮只是消失了?@AtulParmar - MF DOOM
@EmreÖnder请参考更新后的答案。虽然扩展可以使用viewDidLoad方法中使用的相同代码创建。这是一件容易的事情。 - AtulParmar
这个扩展程序不起作用...想一想,你没有将按钮添加到视图中。 - Vina
1
按钮无法工作:它无法接收触摸。 - Alexander Yakovlev
显示剩余3条评论

0
你只需要添加下面的UIView扩展并调用函数即可获得所需的渐变按钮,
func covertToGradientButtonWith(title: String, radius: CGFloat, borderWidth: CGFloat, gradientStartColor: UIColor, gradientEndColor: UIColor) {

    let button:UIButton = UIButton(frame: self.bounds)
    button.setTitle(title, for: .normal)

    let gradient = CAGradientLayer()
    gradient.colors = [gradientStartColor.cgColor, gradientEndColor.cgColor]
    gradient.startPoint = CGPoint(x: 0.0, y: 0.5)
    gradient.endPoint = CGPoint(x: 1.0, y: 0.5)
    gradient.frame = self.bounds
    self.layer.insertSublayer(gradient, at: 0)
    self.mask = button

    button.layer.cornerRadius =  radius
    button.layer.borderWidth = borderWidth
}

希望这个解决方案能对你有所帮助。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接