使用渐变标题和cornerBorder清除UIButton

Xer*_*nox 0 uibutton ios cagradientlayer

如何给UIButton标题添加渐变,虽然按钮背景清晰,但边角也是渐变的。

我在这里找到了如何添加渐变边框但不知道如何制作渐变标签。如果标签渐变与边框渐变颜色相匹配,那就太好了。

也许我可以用形状像标签的面具以某种方式创造这种效果?

Con*_*nco 5

喜的easies的方法是创建一个UIColorpatternImage像这样:

let image = UIImage(named: "gradient.jpeg");
let color = UIColor(patternImage: image!);
Run Code Online (Sandbox Code Playgroud)

然后只需在您需要的地方使用颜色:

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

buttonAction.setTitleColor(color, for: .normal);
Run Code Online (Sandbox Code Playgroud)

结果: 在此处输入图片说明

用于创建渐变 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;

}
Run Code Online (Sandbox Code Playgroud)
  • 用于水平渐变 CGPoint(x:size.width, y:0)
  • 垂直渐变使用 CGPoint(x:0, y:size.height)


Xer*_*nox 5

虽然康斯坦丁的回答确实有效,但标题标签渐变不一定与边框颜色匹配: 在此处输入图片说明

所以这是我的解决方案:

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)
    }
}
Run Code Online (Sandbox Code Playgroud)

结果:

在此处输入图片说明