美文网首页
玩动画时候碰到的一个小坑! 前台切换到后台在进入前台

玩动画时候碰到的一个小坑! 前台切换到后台在进入前台

作者: 三三哥 | 来源:发表于2017-08-24 15:46 被阅读0次

    Demo地址 https://github.com/lshdfp726/GestureControlAnimation

    demo 是一个利用滑动手势控制门开关的动画!

    这里贴出代码,看起来乱的话去git clone,代码不多

    @interfaceViewController()

    @property(weak,nonatomic)IBOutlet UIImageView*doorImageView;

    @property(nonatomic,strong) CALayer *doorLayer;

    @property(weak,nonatomic)IBOutlet UIView *containerView;

    @end

    - (void)viewDidLoad {

        [superviewDidLoad];

    // Do any additional setup after loading the view, typically from a nib.

        self.doorLayer= [CALayerlayer];

        self.doorLayer.frame=self.containerView.bounds;

        self.doorLayer.position=CGPointMake(self.doorLayer.position.x-256/4,self.doorLayer.position.y);

        self.doorLayer.anchorPoint=CGPointMake(0,0.5);

        self.doorLayer.contents= (__bridgeid)[UIImageimageNamed:@"door.jpeg"].CGImage;

        [self.containerView.layeraddSublayer:self.doorLayer];

        CATransform3Dperspective =CATransform3DIdentity;

        perspective.m34= -1.0/500.0;

        self.containerView.layer.sublayerTransform= perspective;

        UIPanGestureRecognizer*pan = [[UIPanGestureRecognizeralloc]init];

        [panaddTarget:selfaction:@selector(panGestureRecognizer:)];

        [self.viewaddGestureRecognizer:pan];

        self.doorLayer.speed=0.0;//设置为零表示禁止动画自动播放

        [selfcreateDoorAnimation:nil];

    //后台进入前台的关键点重新加载一边动画

        [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(createDoorAnimation:) name:UIApplicationWillEnterForegroundNotification object:nil];

    }

    - (void)createDoorAnimation:(NSNotification*)noti {

        CABasicAnimation*animation = [CABasicAnimationanimation];

        animation.keyPath=@"transform.rotation.y";

        animation.toValue=@(-M_PI_2);

        animation.duration=1.0;

        [self.doorLayeraddAnimation:animationforKey:nil];

        if(noti) {

    /**程序从前台切换到后台之后,视图控制器上的所有视图的layer层动画都被系统自动remove掉了,所以监听系统从后台进入前台时在加一遍动画,但是此时layer层其实还是上次的,有关动画参数的值其实没变

    就需要进行相应的reset重新设置   ,,,程序运行时候先开关几次门之后,观众可以去掉下面这一行代码 就可以感受结果了!

    */

        self.doorLayer.timeOffset=0.0;

        }

    }

    - (void)panGestureRecognizer:(UIPanGestureRecognizer*)reg {

    CGFloatx = [reg translationInView:self.view].x;//理解为获取手指平移的程度(拖拽的力度)

    x /=200.0f;

    NSLog(@"translationInView==%f",x);

    CFTimeInterval timeOffset =self.doorLayer.timeOffset;//利用前后平移程度值差值来调整动画偏移时间!

    NSLog(@"视图的动画时间偏移量%f",timeOffset);

    timeOffset =MIN(0.999,MAX(0.0, timeOffset - x));

    self.doorLayer.timeOffset= timeOffset;

    [reg setTranslation:CGPointZero inView:self.view];

    }

    相关文章

      网友评论

          本文标题:玩动画时候碰到的一个小坑! 前台切换到后台在进入前台

          本文链接:https://www.haomeiwen.com/subject/brjedxtx.html