Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/113.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动画剪辑边界、masksToBounds或类似_Ios_Objective C_Uiimageview_Calayer_Caanimation - Fatal编程技术网

iOS动画剪辑边界、masksToBounds或类似

iOS动画剪辑边界、masksToBounds或类似,ios,objective-c,uiimageview,calayer,caanimation,Ios,Objective C,Uiimageview,Calayer,Caanimation,我有一个图像视图,开始裁剪它的图像,剪贴簿和内容模式设置为“缩放纵横比填充”,我希望它“放大”图像到整个图像。如果clipsToBounds=NO是一个可设置动画的属性,那么这正是我想要的,但它似乎不是。有没有一种方法可以使其动画化 如果不是,另一种方法是调整视图的大小,使其与图像的大小具有相同的宽高比,同时使其不小于图像视图开始时的大小(即高度或宽度的最小增量,两者都不减小)。考虑到图像可能比图像视图大或小,并且图像的宽高比可以是任何东西(但通常是iOS设备的相机照片),我不确定这样做的最佳方

我有一个图像视图,开始裁剪它的图像,剪贴簿和内容模式设置为“缩放纵横比填充”,我希望它“放大”图像到整个图像。如果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动画块中没有这个核心动画,根据文档,它应该是。我已经将上面的代码移动到动画块中,但它仍然没有设置动画(更改会立即发生)。我开始认为“可设置动画”仅仅意味着它可以被放置在动画中,而不是说它会随着时间的推移而动态地设置动画。

所以你不想让你的图像增长,但你想让它先被剪裁,然后再暴露外部像素

可以使用核心动画和层遮罩来实现这一点

以下是您要做的:

将图像视图的clipsToBounds设置为FALSE,这样,如果允许,图像将完全显示

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

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

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


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

从2019年3月21日起,
masksToBounds
似乎是错误的<代码>masksToBounds似乎不可设置动画。我尝试过用CABasicAnimation和CAKEYFREANIMATION设置masksToBounds的动画,但似乎不起作用

这种方法最棘手的部分是创建一个与整个图像大小相同的图层。我已经缩小了图像的比例,所以我没有了如果不裁剪图像的尺寸。如果我这样做了,我就可以用clipstobunds=YES设置帧大小更改的动画。UIImage有一个size属性,它将告诉您图像的“本机”大小。除非已创建图像的缩放版本,否则您应该能够检查图像的“大小”属性。