带有 CAShapeLayer 的 UIView 不显示 CAGradientLayer

Posted

技术标签:

【中文标题】带有 CAShapeLayer 的 UIView 不显示 CAGradientLayer【英文标题】:UIView with CAShapeLayer does not display CAGradientLayer 【发布时间】:2015-01-16 09:40:10 【问题描述】:

我尝试将辐射应用于自定义形状的UIView

如果经过良好测试并在我的代码的其他部分中使用,我使用的渐变类别。 但是,我无法让它在使用 CAShapeLayer 创建的自定义形状视图中正常运行

在我的 UIView 类别中:

@implementation UIView (Grandiant)

- (void)addGradientBackgroundFromTopColor:(UIColor *)topColor toBottomColor:(UIColor *)bottomColor 
    CAGradientLayer *gradient = [CAGradientLayer layer];
    gradient.frame = self.frame;
    gradient.colors = [NSArray arrayWithObjects:(id)[topColor CGColor], (id)[bottomColor CGColor], nil];
    [self.layer insertSublayer:gradient atIndex:0];


@end

在我的 UIView 子类中:

   override func awakeFromNib() 
        super.awakeFromNib()
          self.addGradientBackgroundFromTopColor(UIColor(red: 221.0/256.0, green: 0.5, blue: 32.0/256.0, alpha: 1), toBottomColor: UIColor(red: 220.0/256.0, green: 94.0/256.0, blue: 17.0/256.0, alpha: 1))
    

    override var frame: CGRect 
    didSet 
        let bezierpath = UIBezierPath()
        bezierpath.moveToPoint(CGPoint(x: 0, y: 0)) // 1
        bezierpath.addLineToPoint(CGPoint(x: 0, y:  frame.height - triangleHeight)) // 2
        bezierpath.addLineToPoint(CGPoint(x: frame.width / 2, y: frame.height))// 3
        bezierpath.addLineToPoint(CGPoint(x: frame.width, y: frame.height - triangleHeight))// 4
        bezierpath.addLineToPoint(CGPoint(x: frame.width, y: 0))// 5
        let mask = CAShapeLayer()
        mask.frame = bounds
        mask.path = bezierpath.CGPath
        layer.mask = mask

视图以分配给它的任何背景颜色出现。 我尝试在应用蒙版后设置渐变,但效果不佳。

【问题讨论】:

【参考方案1】:

在代码中

- (void)addGradientBackgroundFromTopColor:(UIColor *)topColor toBottomColor:(UIColor *)bottomColor 
    CAGradientLayer *gradient = [CAGradientLayer layer];
    gradient.frame = self.frame;
    gradient.colors = [NSArray arrayWithObjects:(id)[topColor CGColor], (id)[bottomColor CGColor], nil];
    [self.layer insertSublayer:gradient atIndex:0];

改变

gradient.frame = self.frame;

gradient.frame = self.bounds;

【讨论】:

以上是关于带有 CAShapeLayer 的 UIView 不显示 CAGradientLayer的主要内容,如果未能解决你的问题,请参考以下文章

CAShapeLayer 偏离中心

UIView 子层中 CAShapelayer 的位置错误

如何为带有阴影的 UIView 赋予椭圆形状

为啥我的 CAShapeLayer 无法使用 UIView(带 gif)正确设置动画?

如何在旋转时处理 UIView 圆角(使用 CAShapeLayer)

将 CAShapeLayer 应用于除 UIButton 之外的主 UIView