如何使用 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()