首页 > 解决方案 > 目标c:用另一层遮罩层并改变框架时的奇怪行为

问题描述

UIBezierPath * path                 = [UIBezierPath bezierPathWithArcCenter:CGPointZero radius:80 startAngle:0 endAngle:(2 * M_PI) clockwise:YES];

CAShapeLayer * layer                = [CAShapeLayer new];
layer.strokeColor                   = [UIColor redColor].CGColor;
layer.fillColor                     = [UIColor clearColor].CGColor;
layer.lineWidth                     = 10;
layer.strokeEnd                     = 1;
layer.position                      = self.view.center;
layer.lineCap                       = kCALineCapRound;
[layer setPath                      : path.CGPath];
[self.view.layer addSublayer        : layer];

CAGradientLayer * gradientLayer     = [CAGradientLayer layer];
gradientLayer.startPoint            = CGPointMake(0.0,0.5);
gradientLayer.endPoint              = CGPointMake(1.0,0.5);
gradientLayer.frame                 = self.view.frame;
NSArray *colors                     = @[(id)[UIColor greenColor].CGColor,(id)[UIColor blueColor].CGColor,(id)[UIColor yellowColor].CGColor];
gradientLayer.colors                = colors;
[gradientLayer setMask              : layer];
[self.view.layer addSublayer        : gradientLayer];

我在做什么:

将 CAShapeLayer 添加到 view.layer 并带有绘制圆的路径。

将 CAGradientLayer(3 种颜色)添加到 view.layer 并将 setingMask 添加到 CAShapeLayer。

结果:有和没有面具

在此处输入图像描述

在此处输入图像描述

问题 :

如果我将渐变的框架更改为在圆的顶部(因为我想查看圆上的所有颜色),它也会移动圆。特别是梯度的 x 和 y 的变化

所以而不是

    gradientLayer.frame = self.view.frame;

我只更改 x 和 y (据我检查,宽度和高度不会导致此问题)

    gradientLayer.frame = CGRectMake(100,100, self.view.frame.size.width, self.view.frame.size.height);

这就是结果

在此处输入图像描述

谁能解释为什么会发生这种情况以及可能的解决方案是什么?

我想要实现的是这个

在此处输入图像描述

然后用 CAShapeLayer 掩盖它,但随后发生了这个问题

提前致谢

标签: iosobjective-cswiftxcodecalayer

解决方案


改变 shapelayer 的位置,因为渐变层是全屏的,并且 shapelayer 设置了中心位置,并且在你改变渐变层的框架之后 shapelayer 也会随着相同的位置发生变化。
layer.position = CGPointMake(30, 250);


推荐阅读