您的位置:首页 > 产品设计 > UI/UE

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.

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: