gpt4 book ai didi

iphone - 动画 CALayer 的蒙版大小变化

转载 作者:太空狗 更新时间:2023-10-30 03:10:04 25 4
gpt4 key购买 nike

我有一个 UIView 子类,它在其 CALayer 上使用了一个 CAShapeLayer 掩码。面具采用独特的形状,具有三个圆角和剩余角处的切出矩形。

当我使用标准动画 block 调整我的 UIView 大小时,UIView 本身及其 CALayer 调整大小就很好了。然而,蒙版是立即应用的,这会导致一些绘图问题。

我已经尝试使用 CABasicAnimation 为 mask 的大小调整设置动画,但没有任何运气让调整大小设置为动画。

我能否以某种方式在蒙版上实现动画大小调整效果?我是否需要摆脱面具,或者我是否必须改变我目前绘制面具的方式(使用 - (void)drawInContext:(CGContextRef)ctx)。

干杯,亚历克斯

最佳答案

我找到了这个问题的解决方案。其他答案部分正确并且有帮助。

以下几点对于理解解决方案很重要:

  • mask 属性本身不可设置动画。
  • 由于 mask 是一个 CALayer,因此它可以自行设置动画。
  • 框架不可设置动画,请使用边界和位置。这可能不适用于您(如果您不尝试为框架设置动画),但对我来说是个问题。 (参见 Apple QA 1620)
  • View 层的掩码未绑定(bind)到 UIView,因此它不会接收应用于 View 层的核心动画事务。
  • 我们直接修改 CALayer,所以我们不能指望 UIView 知道我们要做什么,所以 UIView 动画不会创建核心动画事务来包含对我们属性的更改。

为了解决这个问题,我们将不得不自己利用 Core Animation,而不能依赖 UIView 动画 block 来为我们完成工作。

只需创建一个 CATransaction,其持续时间与您使用 [UIView animateWithDuration:...] 时的持续时间相同。这将创建一个单独的动画,但如果您的持续时间和缓动函数相同,它应该与动画 block 中的其他动画完全相同。

NSTimeInterval duration = 0.5;// match this to the value of the UIView animateWithDuration: call

[CATransaction begin];
[CATransaction setValue:[NSNumber numberWithFloat:duration] forKey:kCATransactionAnimationDuration];

self.myView.layer.mask.position = CGPointMake(newX, 0);
self.myView.layer.mask.bounds = CGRectMake(0, 0, newWidth, newHeight);

[CATransaction commit];

关于iphone - 动画 CALayer 的蒙版大小变化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2910770/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com