【问题标题】:Animate UIView frame with CALayer as subview使用 CALayer 作为子视图的动画 UIView 框架
【发布时间】:2013-07-30 13:44:09
【问题描述】:

我有什么:

我有一个UIView'sCAGradientLayer 的层次结构,我用它来设置这个层次结构的“背景颜色”。所以我有这样的事情:

ViewA -> ViewB -> CAGradientLayer

我在做什么:

在某一时刻,我想为 ViewA 的 frame(仅它的高度)设置动画。所以它会是这样的:

[UIView animateWithDuration:timeInterval
                      delay:0
                    options:UIViewAnimationOptionCurveEaseIn
                 animations:^{
                              viewA.frame = newFrame;
}];

问题:

问题在于CAGradientLayer 不会为其帧设置动画,它只是更改其帧,然后 viewA 开始按预期设置动画(通过将模拟器设置为慢动作动画可以清楚地看到这一点)。

我尝试了什么:

我尝试按照 Apple 推荐的 here 进行操作,方法是在 UIView 动画块内执行此操作,但实际上并没有奏效,因为我仍在此处为帧设置动画:

viewA.frame = newFrame;

我也明白我应该为边界设置动画,而不是 CALayer 的框架,问题是,我如何为边界设置动画,并且在为 ViewA 的框架设置动画时,将 CALayer 排除在外动画?

我想要什么:

我只想为它的高度变化设置动画,所以我会同时看到viewACAGradientLayer 的动画。

【问题讨论】:

  • 你不能将 UIImageView(带有渐变 UIImage)设置为 ViewB 的子视图而不是 CAGradientLayer 吗?它应该同时调整大小。希望它有所帮助,但这只是一个想法,因为我不知道调整大小时 CAGradientLayer 的行为。

标签: iphone ios uiview core-animation calayer


【解决方案1】:

首先,阅读this

尝试将您的视图动画代码与图层动画一起显式封装。不要期望图层会自动设置动画。由于您正在处理定位,因此您需要更改graidentlayer.bounds

如果这不起作用,请在您的动画代码之前尝试此操作:

[CATransaction begin];    
[CATransaction setDisableActions: NO];    
[CATransaction commit];

【讨论】:

    【解决方案2】:

    您必须了解UIViewCALayer 层次结构是不同的。在UIView 上运行的布局更改和动画不会自动影响CALayer 层次结构。

    因此,如果您希望对视图应用的更改影响图层,您必须自己更新该图层。

    您的代码也缺少详细信息。例如,你声称你看到你的渐变层改变了它的框架,但你没有显示你在哪里改变它。您是否在某处覆盖了 layoutSubviews 以将其更新为 frame

    默认情况下,更新层 frame 将触发 positionbounds 属性的隐式动画。要更改动画的速度,您可以使用:

    [CATransaction begin];
    [CATransaction setAnimationDuration:10.0];
    _myLayer.frame = newFrame;
    [CATransaction commit]; 
    

    【讨论】:

    • 实际上没有对CALayer 做任何事情。它基本上是 ViewB 层的子层。
    • 如何设置 viewB 以调整相对于 viewA 的大小?即使 viewB 调整大小,渐变层也不应该自动调整大小。
    • 再一次,我没有对 CALayer 做任何事情,是的 viewB 作为自动调整大小。
    • 即使 viewB 具有自动调整大小,渐变层也不应该设置动画(相对于 viewB)。如果它确实已经动画,则正在发生其他事情,但您发布的代码中缺少这些内容。如果您希望渐变图层框架与 viewB 的边界相匹配,您必须手动调整其框架,例如在 viewB layoutSubviews 中。
    • 仔细阅读我的问题:The problem with this is that the CAGradientLayer won't animate 图层没有动画,它只是在没有动画的情况下自动改变它的框架。 ViewA 是正在制作动画的...
    猜你喜欢
    • 1970-01-01
    • 2011-10-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-09-15
    • 1970-01-01
    相关资源
    最近更新 更多