iOS动画clipToBounds,masksToBounds或类似物

问题描述 投票:0回答:2

我有一个图像视图,开始裁剪它的图像与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动画块中没有这个核心动画,根据文档,它应该是。我已将上面的代码移动到动画块中,但它仍然没有动画(立即发生更改)。我开始认为“动画”只是意味着它可以放在动画中,而不是随着时间的推移它会主动动画。

ios objective-c uiimageview calayer caanimation
2个回答
2
投票

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

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

这是你做的:

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

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

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

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

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


0
投票

截至2019年3月21日,似乎masksToBounds documentation是错误的。 masksToBounds似乎不具有动画效果。我尝试使用CABasicAnimation和CAKeyframeAnimations动画maskToBounds,它似乎不起作用。

© www.soinside.com 2019 - 2024. All rights reserved.