pod ‘pop’,’~>1.0’ 安装pop动画框架
Pop是一个动画引擎,支持弹簧动画效果与衰减动画效果,可以用Pop构建出真实的物理交互效果。可以满足大多数的动画效果
动画类型
kPOPLayerPositionY Y 坐标改变,,点击去可知它是calayer 使用的,需要calayer 对象添加这个动画
fromValue 和 toValue 规定了 view 的Y坐标的移动位置,,
[self.view addSubview:view];
view.backgroundColor = [UIColor redColor];
// 设置对Y进行平移操作
POPBasicAnimation* spring = [POPBasicAnimation animationWithPropertyNamed:kPOPLayerPositionY];
/// 延时2秒执行 防止控制器push动画的影响
spring.beginTime = CACurrentMediaTime()+2;
/// 动画时长为1s
spring.duration = 1.0f;
/// Y位置的起始位置
spring.fromValue = @(0.f);
/// Y位置的结束位置,,view的添加的位置
spring.toValue = @(CGRectGetMinY(view.frame));
/// 动画结束的时候
[spring setCompletionBlock:^(POPAnimation * ani, BOOL fin) {
/// 可以再接一个动画
}];
POPBasicAnimation *basic = [POPBasicAnimation animationWithPropertyNamed:kPOPViewBackgroundColor];
// 2.设置初始值
basic.fromValue = [UIColor blackColor];
basic.toValue = [UIColor redColor];
// 动画的时长
basic.duration = 4.0;
// 动画类型 系统预设的类型有以下5种:
// kCAMediaTimingFunctionLinear 线性,即匀速
// kCAMediaTimingFunctionEaseIn 先慢后快
// kCAMediaTimingFunctionEaseOut 先快后慢
// kCAMediaTimingFunctionEaseInEaseOut 先慢后快再慢
// kCAMediaTimingFunctionDefault 实际效果是动画中间比较快
basic.timingFunction = [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseInEaseOut];
basic.beginTime = CACurrentMediaTime() + 1.f;
// 3.添加到view上
[view pop_addAnimation:basic forKey:@"colorAnimation"];
[self.view addSubview:view];
view.backgroundColor = [UIColor redColor];
POPBasicAnimation* basic = [POPBasicAnimation animationWithPropertyNamed:kPOPLayerRotation];
basic.beginTime = CACurrentMediaTime()+2;
basic.timingFunction = [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseInEaseOut];
basic.toValue = [NSNumber numberWithFloat:-M_PI_4];
basic.duration = 1.4f;
[self.view addSubview:view];
view.backgroundColor = [UIColor redColor];
// 设置弹簧动画的路径为Y变化
POPSpringAnimation* spring = [POPSpringAnimation animationWithPropertyNamed:kPOPLayerPositionY];
// 设置开始时间
spring.beginTime = CACurrentMediaTime()+2;
// Y的起始值
spring.fromValue = @(10.f);
spring.toValue = @(CGRectGetMinY(view.frame));
spring.dynamicsMass = 10;
spring.springBounciness = 20.f;
spring.springSpeed = 2.f;
[spring setCompletionBlock:^(POPAnimation * ani, BOOL fin) {
}];
[self.view addSubview:view];
view.backgroundColor = [UIColor redColor];
POPSpringAnimation *anim = [POPSpringAnimation animationWithPropertyNamed:kPOPViewScaleXY];
// 2.设置变化后的值 放大二倍
anim.toValue = [NSValue valueWithCGSize:CGSizeMake(2, 2)];
// 速度 可以设置的范围是0-20,默认为12.值越大速度越快,结束的越快
anim.springSpeed = 2.f;
// 振幅 可以设置的范围是0-20,默认为4。值越大振动的幅度越大
anim.springBounciness = 10.f;
anim.dynamicsMass = 10;
anim.beginTime = CACurrentMediaTime() + 1.f;
// 动画结束后进行相关操作 可以再写个动画
};
self.showView = [[UIView alloc]initWithFrame:CGRectMake(20, 100, 100, 100)];
self.showView.backgroundColor = [UIColor redColor];
[self.view addSubview:self.showView];
//添加手势
UIPanGestureRecognizer *pan = [[UIPanGestureRecognizer alloc]initWithTarget:self action:@selector(handGesture:)];
[self.showView addGestureRecognizer:pan];
- (void)handGesture:(UIPanGestureRecognizer*)recognizer{
/// translationInView:获取到的是手指移动后,在相对坐标中的偏移量
/// locationInView:获取到的是手指点击屏幕实时的坐标点;
CGPoint translation = [recognizer translationInView:recognizer.view];
recognizer.view.center = CGPointMake(translation.x + recognizer.view.center.x,
translation.y + recognizer.view.center.y);
[recognizer setTranslation:CGPointMake(0, 0) inView:self.view];
if (recognizer.state == UIGestureRecognizerStateEnded) {//松手的时候执行
//获得加速度
CGPoint velocity = [recognizer velocityInView:self.view];
//添加pop动画
POPDecayAnimation *decayAnimation = [POPDecayAnimation animationWithPropertyNamed:kPOPLayerPosition];
decayAnimation.delegate = self; // <POPAnimationDelegate>
decayAnimation.velocity = [NSValue valueWithCGPoint:velocity];
[recognizer.view.layer pop_addAnimation:decayAnimation forKey:nil];
}
}
#pragma mark 动画结束的协议方法
- (void)pop_animationDidStop:(POPAnimation *)anim finished:(BOOL)finished {
if (!CGRectContainsPoint(self.view.frame, self.showView.center)) {
self.showView.frame = CGRectMake(20, 100, 100, 100);
}
}
这篇博客介绍了如何通过安装POP动画框架实现Spring和Decay动画效果,以创建真实的物理交互体验。文中展示了如何使用POPLayerPositionY进行视图动画,并提供了手势识别来控制视图移动,当手势结束时应用衰减动画,确保视图平滑停止。同时,还包含了动画结束时的处理逻辑,确保视图返回到初始位置。
1420

被折叠的 条评论
为什么被折叠?



