Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/109.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 使用应用于渐变层的遮罩调整渐变层的大小_Ios_Objective C_Core Animation - Fatal编程技术网

Ios 使用应用于渐变层的遮罩调整渐变层的大小

Ios 使用应用于渐变层的遮罩调整渐变层的大小,ios,objective-c,core-animation,Ios,Objective C,Core Animation,我需要一些帮助调整渐变层的大小,上面有一个遮罩。所以我有一个辐射层。在这层的上面我有一个圆形的面具。遮罩位于渐变层的中心。渐变层不断旋转,由于圆形遮罩位于渐变层的中心,因此您会产生一个不断旋转的圆的错觉。在我需要调整渐变层(以及遮罩)的大小之前,一切都正常。当我试图同时调整遮罩和渐变层的大小时,会出现很多问题: -圆不再围绕其中心旋转 -调整大小完全错误(圆圈不完整(遮罩不适合图层大小)) 显然,我尝试过调整图层大小,使其比遮罩更大,但没有效果。我个人认为问题在于轮换。遮罩不会停留在层的中心,因

我需要一些帮助调整渐变层的大小,上面有一个遮罩。所以我有一个辐射层。在这层的上面我有一个圆形的面具。遮罩位于渐变层的中心。渐变层不断旋转,由于圆形遮罩位于渐变层的中心,因此您会产生一个不断旋转的圆的错觉。在我需要调整渐变层(以及遮罩)的大小之前,一切都正常。当我试图同时调整遮罩和渐变层的大小时,会出现很多问题:

-圆不再围绕其中心旋转

-调整大小完全错误(圆圈不完整(遮罩不适合图层大小))

显然,我尝试过调整图层大小,使其比遮罩更大,但没有效果。我个人认为问题在于轮换。遮罩不会停留在层的中心,因此它会错误地旋转圆。我希望你们中的一些人能帮助我。我需要将遮罩保持在层的中心。谢谢你的帮助。 啊,是的,调整尺寸是“活的”,因为我在捏的时候做的

更新:我会发布我用来绘制和动画的代码。但首先让我解释一些背景信息。在视图启动时,我使用CALayers在视图上绘制了一些圆。每个圆有3层:

-我已经正确设置动画的背景圆

-带有遮罩和旋转动画的渐变层

-文本层

“收缩-->调整大小”动画还存在其他问题,例如,如果收缩第一个圆,它将保持在其他圆的下方(因为其他圆在层层次中较高)。但这些都是我很容易解决的小问题。o使用遮罩和背景圆设置圆的动画我使用此代码,当UIPinchGestureRecognitzer的状态为UIGestureRecognitzerStateChanged时调用此代码:

//Getting the aleready existing data
CAGradientLayer *gradientLayer = [sender.layer.sublayers objectAtIndex:3]; //takes the   already existing layer with the gradient
CAShapeLayer *outCircle = [sender.layer.sublayers objectAtIndex:2]; //the out circle is the background circle
//creating new mask...
CAShapeLayer *newMask = [CAShapeLayer layer]; //I need to create a new mask for the  gradient layer, since I can't acess the old mask in the sublayers array and I need to scale the size of the mask too.
newMask.path = [UIBezierPath bezierPathWithOvalInRect:CGRectMake(10, 10, 200,  200)].CGPath;
newMask.lineWidth = 10;
newMask.fillColor = [UIColor clearColor].CGColor;
newMask.strokeColor = [UIColor blackColor].CGColor;
//setting new mask...
gradientLayer.mask = newMask;
//the resize animation aleready exists and is created when the state of the    UIPinchGestureRecognizer is UIGestureRecognizerStateBegan
[_resizeAnimation setToValue:[NSNumber numberWithFloat:1+(0.5*scale)]]; //scale is a   property of UIPinchGestureRecognizer that indicates the distance between the two fingers
//adding the animation to the layers
[outCircle addAnimation:_resizeAnimation forKey:nil];
[gradientLayer addAnimation:_resizeAnimation forKey:nil];
[newMask addAnimation:_resizeAnimation forKey:nil];
该代码位于一个方法中,该方法还将sender UIView作为参数来访问层(和比例值)。 下面是初始化动画的代码:

 _resizeAnimation = [CABasicAnimation animationWithKeyPath:@"transform.scale"];
[_resizeAnimation setDuration:1/scale];
_resizeAnimation.fillMode = kCAFillModeForwards;
[_resizeAnimation setRemovedOnCompletion:NO];
我在收缩开始时启动动画。我之所以这样做,是因为我不想在每次收缩值改变时都重新锁定并创建一个与上一个动画相同的新动画。 这就是代码。谢谢大家帮助我

更新:我解决了我的问题。这很容易,但动画仍然不完美。我解决了编辑两件事的问题:

-已删除应用于遮罩的动画 -添加了gradientLayer.masksToBounds=YES

仍然存在一些不正常的情况:
外圆(背景)根据其帧矩形原点调整大小。另一方面,渐变层根据其中心调整大小。我想根据中心和背景层调整大小。问题似乎是关键。但是默认情况下,层的锚点是中心(0.5,0.5),就像渐变层中一样。我从未在代码中更改outCircle的定位点。那么,为什么外围的锚定点是错误的呢?我尝试手动将其设置为0.5,0.5,但没有任何变化。请帮忙

为了完全理解您的问题,如果您发布代码或一些屏幕截图,这将有所帮助。我的第一个猜测是操作或autoresizingMaskOk有问题。我今天将添加代码。啊,是的!不要问我为什么将动画持续时间设置为1/比例。这纯粹是巧合,但重要的是,动画比另一个具有固定持续时间的动画更平滑。可能不相关,但使用子层objectAtIndex:是一个糟糕的想法。保留对层的引用。