swift - 为什么我无法使用 CAGradientLayer 的蒙版

标签 swift cashapelayer quartz-core cagradientlayer

我想画一个像这样的按钮enter image description here

所以我使用 CAGradientLayerCAShapeLayerUIBezierPath 。代码如下:

    let gradientLayer: CAGradientLayer = CAGradientLayer.init()
    gradientLayer.startPoint = CGPoint.init(x: 0, y: 0.7)
    gradientLayer.endPoint  = CGPoint.init(x: 1, y: 0.1)
    gradientLayer.locations = [NSNumber.init(value: 0.25), NSNumber.init(value: 0.5), NSNumber.init(value: 0.75), NSNumber.init(value: 1)]
    gradientLayer.colors = [UIColor.blue.cgColor, UIColor.green.cgColor, UIColor.yellow.cgColor, UIColor.orange.cgColor]
    gradientLayer.frame = CGRect.init(origin: self.bounds.origin, size: self.frame.size)
    gradientLayer.borderColor = UIColor.clear.cgColor
    gradientLayer.borderWidth = 1

    //make mask layer
    let hGap: CGFloat = 1
    let vGap: CGFloat = 1
    let maskLayer: CAShapeLayer = CAShapeLayer.init()
    let maskPath: UIBezierPath = UIBezierPath.init()
    let viewWidth = self.frame.size.width - hGap * 2
    let viewHeight = self.frame.size.height - vGap * 2
    maskPath.move(to: CGPoint.init(x: viewHeight / 2, y: 0))
    maskPath.addLine(to: CGPoint.init(x: viewWidth - viewHeight / 2, y: 0))
    maskPath.addArc(withCenter: CGPoint.init(x: viewWidth - viewHeight / 2, y: viewHeight / 2), radius: viewHeight / 2, startAngle: (CGFloat(1.5) * CGFloat.pi), endAngle: CGFloat.pi / 2, clockwise: true)
    maskPath.addLine(to: CGPoint.init(x: viewHeight / 2, y: viewHeight))
    maskPath.addArc(withCenter: CGPoint.init(x: viewHeight / 2, y: viewHeight / 2), radius: viewHeight / 2, startAngle: CGFloat.pi / 2, endAngle: CGFloat(1.5) * CGFloat.pi, clockwise: true)
    maskPath.close()
    maskLayer.path = maskPath.cgPath
    maskLayer.borderColor = UIColor.clear.cgColor
    maskLayer.fillColor = UIColor.white.cgColor
    maskLayer.frame = CGRect.init(x: vGap, y: hGap, width: viewWidth, height: viewHeight)
   //maskLayer.frame = CGRect.init(x: 0, y: 0, width: viewWidth, height: viewHeight)

    //TODO: Why mask not work
   //gradientLayer.mask = maskLayer


    self.layer.cornerRadius = Constant.kViewSize.height / 2
    self.layer.masksToBounds = true
    self.layer.borderColor = UIColor.clear.cgColor
    self.layer.addSublayer(gradientLayer)
    self.layer.addSublayer(maskLayer)//i use sublayer instead


    self.addSubview(self.titleLabel)
    self.titleLabel.snp.makeConstraints { maker in
        maker.center.equalTo(self.snp.center)
    }

当我使用gradientLayer.mask = maskLayer而不是self.layer.addSublayer(maskLayer)时,我得到了这样的结果:

enter image description here

谁能告诉我为什么?

最佳答案

您正在设置 fillColor 而不是 strokeColor,请更改此行

maskLayer.fillColor = UIColor.white.cgColor

有了这个

maskLayer.fillColor = UIColor.clear.cgColor maskLayer.linesColor = UIColor.white.cgColor

关于swift - 为什么我无法使用 CAGradientLayer 的蒙版,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44680169/

相关文章:

ios - 执行整个测试套件时单元测试用例失败

ios - UIGestureRecognizer 只为 subView 添加,但它也适用于 parentView?

ios - 如何将 UIView 的显示复制到另一个窗口中?

ios - 自定义 UISearchbar 的 UITextfield - iOS

swift - 当填充设置为透明颜色时,CGPath 曲线闪烁黑色填充

ios - 在 iOS 应用程序中使用 CoreAnimation/QuartzCore 为 UILabel 设置动画

ios - 从不同的 View Controller 打开相同的 View

Xcode 6.1 GM Seed 的自动完成总是终止

macos - Swift:无法在 NSSpeechRecognizer 中设置命令

ios - CAShapeLayer 的框架和边界