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

2017-08-24  本文已影响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];

}

上一篇下一篇

猜你喜欢

热点阅读