如何使用 pop 或 CoreAnimation 更改动画的起点或锚点

Posted

技术标签:

【中文标题】如何使用 pop 或 CoreAnimation 更改动画的起点或锚点【英文标题】:How to change the starting point or anchor point of animations using pop or CoreAnimation 【发布时间】:2015-04-21 13:23:49 【问题描述】:

以下代码启动缩放动画,并从UIButton 的中心沿 XY 扩展。如何让它从左边开始或者frame.origin.x = 0

    POPSpringAnimation *anim = [POPSpringAnimation animationWithPropertyNamed:kPOPLayerBounds];
    anim.fromValue = [NSValue valueWithCGRect:CGRectMake(signupButton.frame.origin.x,
                                                         signupButton.frame.origin.y,
                                                         0,
                                                         signupButton.frame.size.height)];
    anim.toValue = [NSValue valueWithCGRect:signupButton.frame];
    [anim setValue:@"progressBar" forKey:@"animName"];
    anim.delegate = self;

//    I tried to set anchor point but without any luck
//    signupButton.layer.anchorPoint = CGPointMake(150, signupButton.frame.origin.y);

    [signupButton.layer pop_addAnimation:anim forKey:@"signupButton"];

【问题讨论】:

仅供参考:锚点在 0 到 1 的范围内指定,这意味着 (0.5, 0.5) 是中心。 你能举个例子吗 layer.anchorPoint = CGPointMake(0, 0); // upper left corner 这应该有助于您将其可视化:i.imgur.com/rtPaXVZ.png 知道了,谢谢。但这是动画起点的解决方案吗?我根据 Photoshop 的经验查看了锚点,所以我不确定。 【参考方案1】:

您正在为边界设置动画,但在框架中传递。您想要为边界设置动画是正确的。

所以,我认为这将是正确的代码。

POPSpringAnimation *anim = [POPSpringAnimation animationWithPropertyNamed:kPOPLayerBounds];
CGRect startRect = signupButton.layer.bounds;
startRect.size.width = 0.0;
anim.fromValue = [NSValue valueWithCGRect:startRect];
anim.toValue = [NSValue valueWithCGRect:signupButton.layer.bounds];
[anim setValue:@"progressBar" forKey:@"animName"];
anim.delegate = self;

//anchor on the center left
CGPoint center = signupButton.layer.position;
signupButton.layer.anchorPoint = CGPointMake(0, 0.5);
signupButton.layer.position = CGPointMake(center.x - signupButton.layer.bounds.size.width * 0.5, center.y);

[signupButton.layer pop_addAnimation:anim forKey:@"signupButton"];

【讨论】:

只是将整个视图水平移动到中心,从提到的锚点猜测。动画仍然从中心开始。 @combinatorial 首先非常感谢您的时间和回答。它正是我想要的。您能否简要解释一下您是如何使用layer.position 实现这一目标的。 同时。我通过添加另一个动画属性kPOPLayerTranslationX 并设置anim.fromValue = @(-signupButton.frame.size.width/2)anim.toValue = @(0); 来解决这个问题,但我更喜欢你的解决方案。 layer.position 是超级视图坐标系中锚点的位置。所以我在改变anchorPoint之前抓取位置,然后设置相对于新anchorPoint的位置。 看看这张图...developer.apple.com/library/ios/documentation/Cocoa/Conceptual/…

以上是关于如何使用 pop 或 CoreAnimation 更改动画的起点或锚点的主要内容,如果未能解决你的问题,请参考以下文章

[BS-26] UIViewpop和Core Animation区别

使用 CoreAnimation 一次为多个 UIView 设置动画

python pop() ,如何在Python的列表或数组中移除元素

如何在使用 pop 时重新加载或调用一些函数 initState()

在 Swift 中使用 CoreAnimation 为 UILabel 元素设置动画

如何使用 Core Animation 为脉动的蓝点设置动画?