iOS动画clipToBounds,masksToBounds或类似物

时间:2014-02-13 00:19:36

标签: ios objective-c uiimageview calayer caanimation

我有一个图像视图,它开始使用clipsToBounds和内容模式设置为“缩放纵横填充”来裁剪图像,我希望它将图像“放大”到整个图像。如果clipsToBounds = NO是一个可动画的属性,那正是我想要的,它似乎不是。有没有办法制作动画?

如果没有,另一种方法是调整视图的大小,使其与图像的大小具有相同的宽高比,同时保持它不小于图像视图的开始(即最小增加到高度或宽度,否减少到任何一个)。考虑到图像可能比图像视图更大或更小,我不确定这样做的最佳方法,图像的宽高比几乎可以是任何东西(但它通常是iOS设备相机照片)

更新1:看起来像layer.masksToBounds可以工作,文档说它是可动画的,但我的代码似乎不起作用:

CABasicAnimation *layerAnim = [CABasicAnimation animationWithKeyPath:@"masksToBounds"];
layerAnim.fromValue = @(YES);
layerAnim.toValue = @(NO);
layerAnim.removedOnCompletion = YES;
layerAnim.duration = 1.0;
[_imageView.layer addAnimation:layerAnim forKey:@"masksToBounds"];

我正在运行这个图层动画,同时正在改变图像视图的框架和变换的UIView块动画,如果这很重要的话。

更新2:我在UIView动画块中没有这个核心动画,根据文档,它应该是。我已将上面的代码移动到动画块中,但它仍然没有动画(立即发生更改)。我开始认为“动画”只是意味着它可以被放置在动画中,而不是随着时间的推移它会主动动画。

2 个答案:

答案 0 :(得分:2)

所以你不希望你的图像增长,但你希望它首先被剪裁,然后暴露出外部像素?

您可以使用Core Animation和图层蒙版来实现。

这是你做的:

将图像视图的clipsToBounds设置为FALSE,因此如果您允许,图像将完全显示。

创建一个与整个图像大小相同的CAShapeLayer。创建一个矩形贝塞尔曲线路径,其大小与初始图像相同。将bezier路径的CGPath安装为形状图层的路径。

将形状图层的填充颜色设置为不透明颜色

然后将形状图层安装为图像视图图层的蒙版。这将导致图像被剪裁为形状图层的形状。

现在,如果您将形状图层中安装的路径更改为图像的完整大小的矩形,系统将为您设置更改动画。

答案 1 :(得分:0)

截至2019年3月21日,似乎masksToBounds documentation是错误的。 masksToBounds似乎不能动画。我已经尝试使用CABasicAnimation和CAKeyframeAnimations对masksToBounds进行动画处理,但它似乎不起作用。