【问题标题】:iOS animate clipToBounds, masksToBounds, or similariOS 动画 clipToBounds、masksToBounds 或类似
【发布时间】:2014-02-13 00:19:36
【问题描述】:

我有一个图像视图,它开始使用 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


    【解决方案1】:

    所以你不希望你的图像变大,但你希望它首先被剪裁,然后外部像素被曝光?

    您可以使用 Core Animation 和图层蒙版来做到这一点。

    这就是你要做的:

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

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

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

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

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

    【讨论】:

    • 这种方法的棘手部分是创建整个图像大小的 CAShapeLayer。我把图像按比例缩小了,所以我没有不被裁剪时的尺寸。如果我这样做了,我可以使用 clipsToBounds=YES 为帧大小的变化设置动画。
    • UIImage 有一个 size 属性,它会告诉你图像的“原生”大小。除非您创建了图像的缩放版本,否则您应该能够检查图像的 size 属性。
    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-02-21
      • 1970-01-01
      相关资源
      最近更新 更多