UIDynamic 入门基础
2016-07-11 17:20
435 查看
#import "ViewController.h"
@interface
ViewController ()<UICollisionBehaviorDelegate>
{
UIAttachmentBehavior *attachmentBehavior;
UIView *iv;
UIDynamicAnimator *animator;
UIPanGestureRecognizer *panGestureRecognizer;
}
@end
@implementation ViewController
-(void)gesture:(UIPanGestureRecognizer *)gesture{
CGPoint location = [gesture
locationInView:self.view];
CGPoint boxLocation = [gesture
locationInView:iv];
switch (gesture.state) {
case
UIGestureRecognizerStateBegan:{
NSLog(@"you touch started position %@",NSStringFromCGPoint(location));
NSLog(@"location in image started is %@",NSStringFromCGPoint(boxLocation));
[animator
removeAllBehaviors];
UIOffset centerOffset =
UIOffsetMake(boxLocation.x -
CGRectGetMidX(iv.bounds),
boxLocation.y -
CGRectGetMidY(iv.bounds));
attachmentBehavior = [[UIAttachmentBehavior
alloc] initWithItem:iv
offsetFromCenter:centerOffset
attachedToAnchor:location];//初始化吸附到锚点
attachmentBehavior.damping=0;
// 跳跃度
attachmentBehavior.frequency=0;//
幅度
[animator
addBehavior:attachmentBehavior];
break;
}
case
UIGestureRecognizerStateEnded: {
[animator
removeBehavior:attachmentBehavior];
break;
}
default:
[attachmentBehavior
setAnchorPoint:[gesture
locationInView:self.view]];
break;
}
}
- (void)viewDidLoad {
[super
viewDidLoad];
//1.吸附行为(UIAttachmentBehavior)吸附的项有两个属性damping(阻尼)和frequency震荡幅度。
//2.重力行为(UIGravityBehavior)通过对象UIGravityBehavior给动力项指定一个重力矢量,具有重力矢量的动力项,会在重力矢量的方向上一直加速,直到与别的动力项产生了冲突或者遇到了边界。
//3.碰撞行为 (UICollisionBehavior)
通过对象UICollisionBehavior指定一个边界,并且让各个动力项,在该边界内参与碰撞。
//4.推动行为(UIPushBehavior)通过对象UIPushBehavior给动力项指定一个持续的或者瞬时的力
//5.捕捉行为(UISnapBehavior)通过对象UISnapBehavior给动力项指定一个捕捉点。动力项会根据配置的效果,来抓住这一捕捉点。
//6.辅助行为(UIDynamicItemBehavior)用来在item层级设定一些参数,比如item的摩擦,阻力弹性密度和可允许的旋转等。
iv=[[UIView
alloc]init];
iv.frame=CGRectMake(100, 100, 100, 100);
iv.backgroundColor=[UIColor
redColor];
[self.view
addSubview:iv];
animator= [[UIDynamicAnimator
alloc] initWithReferenceView:self.view];
// - (void)addBehavior:(UIDynamicBehavior *)behavior;添加指定的行为动画
// - (void)removeBehavior:(UIDynamicBehavior *)behavior;移除指定的行为动画
// - (void)removeAllBehaviors;移除所有的行为
//1.吸附行为(UIAttachmentBehavior)
[self
AttachmentBehavior];
//2.重力行为(UIGravityBehavior)
// [self GravityBehavior];
//3.碰撞行为 (UICollisionBehavior)
// [self CollisionBehavior];
//4.推动行为(UIPushBehavior)
// [self PushBehavior];
//5.捕捉行为(UISnapBehavior)
// [self SnapBehavior];
}
-(void)SnapBehavior{
UISnapBehavior *snapbehavior =[[UISnapBehavior
alloc]initWithItem:iv
snapToPoint:self.view.center];
snapbehavior.damping=1;//damping
振幅大小,默认为0.5f
[animator
addBehavior:snapbehavior];
}
-(void)PushBehavior{
UIPushBehavior *push=[[UIPushBehavior
alloc]initWithItems:@[iv]
mode:UIPushBehaviorModeInstantaneous];
// UIPushBehaviorModeContinuous,一直推动
// UIPushBehaviorModeInstantaneous瞬间推动
push.pushDirection =
CGVectorMake(45, 45);//推移的方向(0,0)-》(45,45)
push.magnitude=1;//每一个magnitude将会引起100/平方秒的加速度
[animator
addBehavior:push];
UIDynamicItemBehavior *itemBehavior=[[UIDynamicItemBehavior
alloc]initWithItems:@[iv]];
itemBehavior.resistance=0.8;//添加阻力。
[animator
addBehavior:itemBehavior];
}
-(void)CollisionBehavior{
UIGravityBehavior *gravityBehavior=[[UIGravityBehavior
alloc]initWithItems:@[iv]];
[animator
addBehavior:gravityBehavior];
UICollisionBehavior *collisionBehavior=[[UICollisionBehavior
alloc]initWithItems:@[iv]];
[collisionBehavior setTranslatesReferenceBoundsIntoBoundary:YES];
[animator
addBehavior:collisionBehavior];
UIDynamicItemBehavior *itemBehavior = [[UIDynamicItemBehavior
alloc]initWithItems:@[iv]];
// @property (readwrite, nonatomic) CGFloat elasticity; // Usually between 0 (inelastic) and 1 (collide elastically)
属性设置碰撞弹性系数
范围(0.0-1.0)决定了碰撞的弹性程度,比如碰撞时物体的弹性
//
// @property (readwrite, nonatomic) CGFloat friction; // 0 being no friction between objects slide along each other设置摩擦系数
决定了沿接触面滑动时的摩擦力大小
//
// @property (readwrite, nonatomic) CGFloat density; // 1 by default
密度
跟size相关
计算物体的总质量
质量越大
物体加速或减速就越困难
//
// @property (readwrite, nonatomic) CGFloat resistance; // 0: no velocity damping
(阻力):决定线性移动的阻力大小
与摩擦系数不同
摩擦系数只作用于滑动运动
//
// @property (readwrite, nonatomic) CGFloat angularResistance; // 0: no angular velocity damping
设置角度阻力系数。(0--CGFLOAT_MAX)决定旋转运动时的阻力大小
//
// @property (readwrite, nonatomic) BOOL allowsRotation; // force an item to never rotate
设置行为中的dynamic item是否可以旋转
设置这个属性为 NO
物体就完全不会转动,而无论施加多大的转动力
[itemBehavior setElasticity:1];
// [itemBehavior setResistance:1];
[animator
addBehavior:itemBehavior];
[collisionBehavior setCollisionDelegate:self];
}
- (void)collisionBehavior:(UICollisionBehavior *)behavior
endedContactForItem:(id <UIDynamicItem>)item
withBoundaryIdentifier:(id <NSCopying>)identifier{
NSLog(@"=======");
}
-(void)GravityBehavior{
UIGravityBehavior *gravityBehaviour=[[UIGravityBehavior
alloc]initWithItems:@[iv]];
[animator
addBehavior:gravityBehaviour];
}
-(void)AttachmentBehavior{
panGestureRecognizer = [[UIPanGestureRecognizer
alloc] initWithTarget:self
action:@selector(gesture:)];
[iv
addGestureRecognizer:panGestureRecognizer];
}
- (void)didReceiveMemoryWarning {
[super
didReceiveMemoryWarning];
// Dispose of any resources that can be recreated.
}
@interface
ViewController ()<UICollisionBehaviorDelegate>
{
UIAttachmentBehavior *attachmentBehavior;
UIView *iv;
UIDynamicAnimator *animator;
UIPanGestureRecognizer *panGestureRecognizer;
}
@end
@implementation ViewController
-(void)gesture:(UIPanGestureRecognizer *)gesture{
CGPoint location = [gesture
locationInView:self.view];
CGPoint boxLocation = [gesture
locationInView:iv];
switch (gesture.state) {
case
UIGestureRecognizerStateBegan:{
NSLog(@"you touch started position %@",NSStringFromCGPoint(location));
NSLog(@"location in image started is %@",NSStringFromCGPoint(boxLocation));
[animator
removeAllBehaviors];
UIOffset centerOffset =
UIOffsetMake(boxLocation.x -
CGRectGetMidX(iv.bounds),
boxLocation.y -
CGRectGetMidY(iv.bounds));
attachmentBehavior = [[UIAttachmentBehavior
alloc] initWithItem:iv
offsetFromCenter:centerOffset
attachedToAnchor:location];//初始化吸附到锚点
attachmentBehavior.damping=0;
// 跳跃度
attachmentBehavior.frequency=0;//
幅度
[animator
addBehavior:attachmentBehavior];
break;
}
case
UIGestureRecognizerStateEnded: {
[animator
removeBehavior:attachmentBehavior];
break;
}
default:
[attachmentBehavior
setAnchorPoint:[gesture
locationInView:self.view]];
break;
}
}
- (void)viewDidLoad {
[super
viewDidLoad];
//1.吸附行为(UIAttachmentBehavior)吸附的项有两个属性damping(阻尼)和frequency震荡幅度。
//2.重力行为(UIGravityBehavior)通过对象UIGravityBehavior给动力项指定一个重力矢量,具有重力矢量的动力项,会在重力矢量的方向上一直加速,直到与别的动力项产生了冲突或者遇到了边界。
//3.碰撞行为 (UICollisionBehavior)
通过对象UICollisionBehavior指定一个边界,并且让各个动力项,在该边界内参与碰撞。
//4.推动行为(UIPushBehavior)通过对象UIPushBehavior给动力项指定一个持续的或者瞬时的力
//5.捕捉行为(UISnapBehavior)通过对象UISnapBehavior给动力项指定一个捕捉点。动力项会根据配置的效果,来抓住这一捕捉点。
//6.辅助行为(UIDynamicItemBehavior)用来在item层级设定一些参数,比如item的摩擦,阻力弹性密度和可允许的旋转等。
iv=[[UIView
alloc]init];
iv.frame=CGRectMake(100, 100, 100, 100);
iv.backgroundColor=[UIColor
redColor];
[self.view
addSubview:iv];
animator= [[UIDynamicAnimator
alloc] initWithReferenceView:self.view];
// - (void)addBehavior:(UIDynamicBehavior *)behavior;添加指定的行为动画
// - (void)removeBehavior:(UIDynamicBehavior *)behavior;移除指定的行为动画
// - (void)removeAllBehaviors;移除所有的行为
//1.吸附行为(UIAttachmentBehavior)
[self
AttachmentBehavior];
//2.重力行为(UIGravityBehavior)
// [self GravityBehavior];
//3.碰撞行为 (UICollisionBehavior)
// [self CollisionBehavior];
//4.推动行为(UIPushBehavior)
// [self PushBehavior];
//5.捕捉行为(UISnapBehavior)
// [self SnapBehavior];
}
-(void)SnapBehavior{
UISnapBehavior *snapbehavior =[[UISnapBehavior
alloc]initWithItem:iv
snapToPoint:self.view.center];
snapbehavior.damping=1;//damping
振幅大小,默认为0.5f
[animator
addBehavior:snapbehavior];
}
-(void)PushBehavior{
UIPushBehavior *push=[[UIPushBehavior
alloc]initWithItems:@[iv]
mode:UIPushBehaviorModeInstantaneous];
// UIPushBehaviorModeContinuous,一直推动
// UIPushBehaviorModeInstantaneous瞬间推动
push.pushDirection =
CGVectorMake(45, 45);//推移的方向(0,0)-》(45,45)
push.magnitude=1;//每一个magnitude将会引起100/平方秒的加速度
[animator
addBehavior:push];
UIDynamicItemBehavior *itemBehavior=[[UIDynamicItemBehavior
alloc]initWithItems:@[iv]];
itemBehavior.resistance=0.8;//添加阻力。
[animator
addBehavior:itemBehavior];
}
-(void)CollisionBehavior{
UIGravityBehavior *gravityBehavior=[[UIGravityBehavior
alloc]initWithItems:@[iv]];
[animator
addBehavior:gravityBehavior];
UICollisionBehavior *collisionBehavior=[[UICollisionBehavior
alloc]initWithItems:@[iv]];
[collisionBehavior setTranslatesReferenceBoundsIntoBoundary:YES];
[animator
addBehavior:collisionBehavior];
UIDynamicItemBehavior *itemBehavior = [[UIDynamicItemBehavior
alloc]initWithItems:@[iv]];
// @property (readwrite, nonatomic) CGFloat elasticity; // Usually between 0 (inelastic) and 1 (collide elastically)
属性设置碰撞弹性系数
范围(0.0-1.0)决定了碰撞的弹性程度,比如碰撞时物体的弹性
//
// @property (readwrite, nonatomic) CGFloat friction; // 0 being no friction between objects slide along each other设置摩擦系数
决定了沿接触面滑动时的摩擦力大小
//
// @property (readwrite, nonatomic) CGFloat density; // 1 by default
密度
跟size相关
计算物体的总质量
质量越大
物体加速或减速就越困难
//
// @property (readwrite, nonatomic) CGFloat resistance; // 0: no velocity damping
(阻力):决定线性移动的阻力大小
与摩擦系数不同
摩擦系数只作用于滑动运动
//
// @property (readwrite, nonatomic) CGFloat angularResistance; // 0: no angular velocity damping
设置角度阻力系数。(0--CGFLOAT_MAX)决定旋转运动时的阻力大小
//
// @property (readwrite, nonatomic) BOOL allowsRotation; // force an item to never rotate
设置行为中的dynamic item是否可以旋转
设置这个属性为 NO
物体就完全不会转动,而无论施加多大的转动力
[itemBehavior setElasticity:1];
// [itemBehavior setResistance:1];
[animator
addBehavior:itemBehavior];
[collisionBehavior setCollisionDelegate:self];
}
- (void)collisionBehavior:(UICollisionBehavior *)behavior
endedContactForItem:(id <UIDynamicItem>)item
withBoundaryIdentifier:(id <NSCopying>)identifier{
NSLog(@"=======");
}
-(void)GravityBehavior{
UIGravityBehavior *gravityBehaviour=[[UIGravityBehavior
alloc]initWithItems:@[iv]];
[animator
addBehavior:gravityBehaviour];
}
-(void)AttachmentBehavior{
panGestureRecognizer = [[UIPanGestureRecognizer
alloc] initWithTarget:self
action:@selector(gesture:)];
[iv
addGestureRecognizer:panGestureRecognizer];
}
- (void)didReceiveMemoryWarning {
[super
didReceiveMemoryWarning];
// Dispose of any resources that can be recreated.
}
相关文章推荐
- Android中使用Handler机制更新UI的三种解决方案
- UIKIT详解之UIButton全面解析
- iOS- 动画UIView animateWithDuration 使用
- jenkins 安装,配置 和 运行 & Build Pipeline 插件的使用
- The CPU has been disabled by the guest operating system. You will need to power off or reset the vir
- Processing Bitmaps Off the UI Thread
- 自定义View----Android UI模板设计
- Message,MessageQueue,Looper,Handler详解+实例
- requestAnimationFrame实现动画
- 关于UICollectionView一些笔记
- iOS 开发UidatePicker 改变字体颜色的方法
- 关于UITableView使用
- 关于UI的一些笔记
- 关于UILabel
- 关于UIButton
- ui笔记1
- arduino gps
- UIKIT详解之UITextView全面解析
- 队列(Queue)
- ios基础控件UILabel