CAKeyframeAnimation 失效的疑问

rollrock1987 2014-07-30 10:34:07

UIButton * btn = [[UIButton alloc]initWithFrame:CGRectMake(100, 100, 50, 50)];
btn.backgroundColor = [UIColor blackColor];

[self.view addSubview:btn];

CGRect boundingRect = CGRectMake(-100, -100, 300, 300);

CAKeyframeAnimation *orbit = [CAKeyframeAnimation animation];
orbit.keyPath = @"position";
orbit.path = CFAutorelease(CGPathCreateWithEllipseInRect(boundingRect, NULL));
orbit.duration = 4;
orbit.additive = YES;
orbit.repeatCount = HUGE_VALF;
orbit.calculationMode = kCAAnimationPaced;
orbit.rotationMode = kCAAnimationRotateAuto;

[btn.layer addAnimation:orbit forKey:@"orbit"];

这个是动画的代码。

我在MainViewController 里面 直接贴上上面的代码 是可以正常运行的。
我在MainViewController里面
FirstViewController * vc = [[FirstViewController alloc]initWithNibName:nil bundle:nil];

[self presentViewController:vc animated:YES completion:^(void){

}];

present了一个 FirstViewContoller 在这个FirstViewContollr里面 为什么动画就没有效果了呢?
求教~~~
...全文
250 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
Bannings 2014-07-31
  • 打赏
  • 举报
回复
我写一个Demo,貌似是可以的: http://download.csdn.net/detail/zhangao0086/7698779 你先看看,还有问题的话贴你的代码
rollrock1987 2014-07-31
  • 打赏
  • 举报
回复
引用 5 楼 zhangao0086 的回复:
viewDidLoad这个方法的调用是在把你的self.view添加到window之前,你不能(而且通常也不会)对还没有加入到屏幕中的元素进行动画,而且正在播放的动画在按下Home键的时候(window属性被去除)也会停止运行(所有的layer被调用了removeAllAnimations)。
OK 收到 非常感谢
Bannings 2014-07-31
  • 打赏
  • 举报
回复
viewDidLoad这个方法的调用是在把你的self.view添加到window之前,你不能(而且通常也不会)对还没有加入到屏幕中的元素进行动画,而且正在播放的动画在按下Home键的时候(window属性被去除)也会停止运行(所有的layer被调用了removeAllAnimations)。
Bannings 2014-07-31
  • 打赏
  • 举报
回复
动画代码你不要直接放在viewDidLoad上面,你可以子类化一个UIButton,然后把动画代码放在drawRect里面去,就像这样:

- (void)drawRect:(CGRect)rect
{
    CGRect boundingRect = CGRectMake(-100, -100, 300, 300);
    
    CAKeyframeAnimation *orbit = [CAKeyframeAnimation animation];
    orbit.keyPath = @"position";
    orbit.path = CFAutorelease(CGPathCreateWithEllipseInRect(boundingRect, NULL));
    orbit.duration = 4;
    orbit.additive = YES;
    orbit.repeatCount = INFINITY;
    orbit.calculationMode = kCAAnimationPaced;
    orbit.rotationMode = kCAAnimationRotateAuto;
    
    [self.layer addAnimation:orbit forKey:@"orbit"];
}
这样做是肯定没问题的
rollrock1987 2014-07-31
  • 打赏
  • 举报
回复
引用 2 楼 xiaofei125145 的回复:
我刚才把 这代码 贴到 viewdidload 里面,确实 如楼主说的那样 没 效果 但是 我又把 代码 移动到 viewdidappear 方法里面 ,动画就 正常了 我想 可能是 因为 presentViewController:vc animated:YES ,这里presentModel 的 动画的缘故 因为 viewdidload 的执行 是 在 presentModel 动画 之前的 , 这个 presentModel API 内部 具体怎么实现的 就 没法 再研究了
先顶你一个 谢谢你提供的解决方法, 看看有没有人能够提供解释或者更好的方法~~~~~~
滴水成川 2014-07-31
  • 打赏
  • 举报
回复
我刚才把 这代码 贴到 viewdidload 里面,确实 如楼主说的那样 没 效果 但是 我又把 代码 移动到 viewdidappear 方法里面 ,动画就 正常了 我想 可能是 因为 presentViewController:vc animated:YES ,这里presentModel 的 动画的缘故 因为 viewdidload 的执行 是 在 presentModel 动画 之前的 , 这个 presentModel API 内部 具体怎么实现的 就 没法 再研究了

29,028

社区成员

发帖
与我相关
我的任务
社区描述
主要讨论与iOS相关的软件和技术
社区管理员
  • iOS
  • 大熊猫侯佩
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧