ios如何页面来回跳转,保持动画播放并连贯

本文探讨了在iOS应用中,如何在页面(A)与(B)来回跳转时保持A页面上自定义bubbleView动画的连贯性。当从A控制器切换到B控制器时,由于A控制器的视图被移除,导致bubbleView的动画停止。通过尝试暂停和恢复动画的方法无效后,作者采取记录暂停时的时间,然后在A控制器重新显示时计算时间偏移量,并据此重新添加动画,从而实现了动画在页面跳转后能够继续播放的效果。
摘要由CSDN通过智能技术生成
   这两天一直在做一个气泡动画,跟QQ里面拉圈圈那个气泡效果差不多。其实很简单,就是一个关键帧动画。
   但是我这个动画的页面是在自定义的tabBarViewController上,所以当tabBar页面切换到别的页面上,再回到这个页面动画就不见了。

   我在详细说一下我的情况吧。

@我的A控制器的view上添加了很多控件,其中包括我自定义的bubbleView,我给bubbleView.layer添加了一个关键帧动画,让它有那种气泡浮动效果。

@当我点击tabBar另一个按钮显示B控制器的时候,先在底下的view上将A控制器的view移除,然后再在底下的view上添加B控制器的view.

@当点击再次显示A控制器的view时,我bubbleView上的动画就不会显示了。(虽然说A 的view是重新绘制上去的,可是动画的渲染是在一个单独的线程运行的啊,我想应该是当动画的view没在显示的时候,动画会停止并移除。也没找到合适的方法检验,等后续再深入学习吧)

@bubbleView的动画不显示,这可不是我要的结果,通过查资料,又有了一种思路,就是可以让动画暂停,和恢复。给bubbleView添加了公开的暂停和恢复动画方法后,在A控制器的willAppear和willDisappear中调用暂停和恢复。可是想象总是太美好(结果跟上面一样,想一下原因,更认定view不显示的时候它上面的动画也被停止核移除了,因为我不跳页面B,页面A的view上的动画确实会暂停和恢复,所以我写的方法是没问题的)

@既然跳转页面必然A控制器的view不会显示,也就是上面的bubbleView的动画肯定会被移除,那就没啥办法了,只能再次显示页面A的时候,给bubbleView重新添加动画了。所以最后我通过纪录暂停时的时间,计算和当前时间偏移量timeoffset,重新添加动画的方法。曲线救国完成了页面跳转回来,动画依然继续的效果。


附上结果图
这里写图片描述


附上我的代码吧,方便以后遇到这样的问题查看

@interface MyBubbleView ()
{
    CAKeyframeAnimation* animation;

    CGMutablePathRef bubblepath;      //动画路径
    CFTimeInterval duration; //动画时间
}
@end


@implementation MyBubbleView

/*
// Only override drawRect: if you perform custom drawing.
// An empty implementation adversely affects performance during animation.
- (void)drawRect:(CGRect)rect {
    // Drawing code
}
*/


- (instanc
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
func transitionDuration(transitionContext: UIViewControllerContextTransitioning) -> NSTimeInterval { return 1.0 } func animateTransition(transitionContext: UIViewControllerContextTransitioning) { let containerView = transitionContext.containerView() let fromVC = transitionContext.viewControllerForKey(UITransitionContextFromViewControllerKey) let toVC = transitionContext.viewControllerForKey(UITransitionContextToViewControllerKey) let fromView = transitionContext.viewForKey(UITransitionContextFromViewKey) let toView = transitionContext.viewForKey(UITransitionContextToViewKey) //toView?.frame = containerView.frame containerView.addSubview(toView!) toView?.layer.transform = CATransform3DIdentity toView?.alpha = 0 fromView?.layer.transform = CATransform3DMakeTranslation(-188, 0, 0) if self.presenting { UIView.animateWithDuration(1.0, animations: { () -> Void in // fromView?.layer.transform = CATransform3DMakeTranslation(-160, 0, 0) // fromView?.layer.transform = CATransform3DMakeRotation(CGFloat(M_PI_2), 10, 0, 10) fromView?.layer.transform = CATransform3DRotate(CATransform3DMakeTranslation(-188, 0, 0), CGFloat(M_PI_2), 0, 10, 0) toView?.alpha = 1.0 }, completion: { (finished) -> Void in fromView?.layer.transform = CATransform3DIdentity transitionContext.completeTransition(true) }) // if self.presenting { // fromView?.addAnimation(presenting) // UIView.animateWithDuration(1.0, animations: { () -> Void in // toView?.alpha = 1.0 // }, completion: { (finished) -> Void in // transitionContext.completeTransition(true) // }) // UIView.animateWithDuration(transitionDuration(transitionContext), animations: { () -> Void in // var trans = CGAffineTransformMake(0.1, CGFloat(M_PI_2), CGFloat(M_PI_2), 0.1, -width/2, height/2) // var trans1 = CGAffineTransformMakeScale(0.1, 0.1) // var trans2 = CGAffineTransformMakeRotation(CGFloat(M_PI_2)) // var trans3 = CGAffineTransformMakeTranslation(-width/2, height/2) // fromView?.transform = trans2 // fromView?.alpha = 0 // toView?.alpha = 1 // }) { (finished) -> Void in // if finished { // fromView?.transform = CGAffineTransformIdentity // transitionContext.completeTransition(true) // } // } // } }

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值