IOS-UI-UIDynamic(二)

 UIPushBehavior :推动效果

UIAttachmentBehavior:附着效果

UISnapBehavior:迅速移动效果

 

一.重要的属性

UIPushBehavior :推动效果

 typedef NS_ENUM(NSInteger, UIPushBehaviorMode) {

 UIPushBehaviorModeContinuous, 持续的力

 UIPushBehaviorModeInstantaneous 瞬间的力

 } NS_ENUM_AVAILABLE_IOS(7_0);

 @property (nonatomic, readonly) UIPushBehaviorMode mode; 推动效果的样式

 @property (nonatomic, readwrite) BOOL active; 是否激活

 @property (readwrite, nonatomic) CGFloat angle; 推动角度

 @property (readwrite, nonatomic) CGFloat magnitude; 推动力量

 @property (readwrite, nonatomic) CGVector pushDirection; 推动的方向

 UISnapBehavior:迅速移动效果

 // The point argument is expressed in the reference coordinate system

 - (instancetype)initWithItem:(id <UIDynamicItem>)item snapToPoint:(CGPoint)point;

 迅速移动效果 只能一次 添加到一个元素上  snapToPoint 让他移动到哪一个点

 

 @property (nonatomic, assign) CGFloat damping; // damping value from 0.0 to 1.0. 0.0 is the least oscillation. damping 的范围是(0.0-1.0)

 

UIAttachmentBehavior:附着效果

 吸附着一个视图 或者一个点  (也可以多个连接)

 

 附着效果 一个视图与一个锚点或者另一个视图相连接的情况

 附着行为描述的是两点之间的连接情况,可以模拟刚性或者弹性连接

 在多个物体间设定多个UIAttachmentBehavior,可以模拟多物体连接

 

 typedef NS_ENUM(NSInteger, UIAttachmentBehaviorType) {

 UIAttachmentBehaviorTypeItems, 吸附一个元素

 UIAttachmentBehaviorTypeAnchor 吸附一个点

 } NS_ENUM_AVAILABLE_IOS(7_0);

 设置吸附效果的样式

 @property (readonly, nonatomic) UIAttachmentBehaviorType attachedBehaviorType;

 

 @property (readwrite, nonatomic) CGPoint anchorPoint;锚点

 

 @property (readwrite, nonatomic) CGFloat length;距离 与锚点的距离

 @property (readwrite, nonatomic) CGFloat damping; // 1: critical damping  跳跃度

 @property (readwrite, nonatomic) CGFloat frequency; // in Hertz   幅度

二.代码

1.推动效果

 1 #import "ViewController.h"
 2 
 3 @interface ViewController ()
 4 {
 5     UIDynamicAnimator * dynamicAnimator;
 6     UIView *view1;
 7     
 8 }
 9 @end
10 
11 @implementation ViewController
12 
13 - (void)viewDidLoad {
14     [super viewDidLoad];
15     dynamicAnimator = [[UIDynamicAnimator alloc]initWithReferenceView:self.view];
16     view1 = [[UIView alloc]initWithFrame:CGRectMake(0, 0, 90, 90)];
17     view1.backgroundColor = [UIColor redColor];
18     [self.view addSubview:view1];
19     UITapGestureRecognizer *tap = [[UITapGestureRecognizer alloc]initWithTarget:self action:@selector(pushView)];
20     
21     [view1 addGestureRecognizer:tap];
- (void)pushView{
    [dynamicAnimator removeAllBehaviors];//移除所有的效果
    UIPushBehavior * push = [[UIPushBehavior alloc]initWithItems:@[view1] mode:UIPushBehaviorModeContinuous];
//    mode的两个属性
    //    UIPushBehaviorModeContinuous,一直推动
//    UIPushBehaviorModeInstantaneous 瞬间推动
    push.pushDirection = CGVectorMake(1, 0);
//    x是正右,负左。y是正下负上。
    push.magnitude = 5;//量级:既是推动力大小
//设置成NO时就不再响应效果
    //    push.active = NO;
    [dynamicAnimator addBehavior:push];//把推动效果添加到效果器上
}

2.瞬间移动效果(viewDidLoad里面添加另一个点击手势)

 UITapGestureRecognizer *tap1 = [[UITapGestureRecognizer alloc]initWithTarget:self action:@selector(snap:)];
    
    [self.view addGestureRecognizer:tap1];

之后

-(void)snap:(UITapGestureRecognizer *)send{
    [dynamicAnimator removeAllBehaviors];
//    迅速移动效果 只能一次 添加到一个元素上  snapToPoint 让他移动到哪一个点
    UISnapBehavior * snap = [[UISnapBehavior alloc]initWithItem:view1 snapToPoint:[send locationInView:self.view]];
//跳动幅度:0~1,值越小,跳动幅度越大
    snap.damping = 0;
    [dynamicAnimator addBehavior:snap];
    
    
}

吸附效果

@interface ViewController ()
{
    UIDynamicAnimator * dynamicAnimator;
    UIView *view1;
     UIView *view2;
}
@end

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    dynamicAnimator = [[UIDynamicAnimator alloc]initWithReferenceView:self.view];
    view1 = [[UIView alloc]initWithFrame:CGRectMake(0, 0, 90, 90)];
    view1.backgroundColor = [UIColor redColor];
    
    [self.view addSubview:view1];
    
    view2 = [[UIView alloc]initWithFrame:CGRectMake(100, 100, 90, 90)];
    view2.backgroundColor = [UIColor blueColor];
    [self.view addSubview:view2];

    UITapGestureRecognizer *tap2 = [[UITapGestureRecognizer alloc]initWithTarget:self action:@selector(attachment:)];
    
    [self.view addGestureRecognizer:tap2];

}
-(void)attachment:(UITapGestureRecognizer *)send{
    [dynamicAnimator removeAllBehaviors];
//    吸附到视图的某个点
    UIAttachmentBehavior * attachment = [[UIAttachmentBehavior alloc]initWithItem:view1 offsetFromCenter:UIOffsetMake(20, 20) attachedToAnchor:[send locationInView:self.view]];
    attachment.length = 50;//吸附范围
    attachment.damping = 0.5;
    attachment.frequency = 5;
    [dynamicAnimator addBehavior:attachment];
//    两个元素吸附
//    UIAttachmentBehavior *attachment1 = [[UIAttachmentBehavior alloc]initWithItem:view1 offsetFromCenter:UIOffsetMake(50, 50) attachedToItem:view2 offsetFromCenter:UIOffsetMake(50, 50)];
//    attachment1.length = 50;//吸附范围
//    attachment1.damping = 0.5;
//    attachment1.frequency = 50;
//    [dynamicAnimator addBehavior:attachment1];
    
   }

另外,在iOS9之前这些效果只支持矩形。IOS9之后增加了新的属性UIDynamicItemCollisionBoundsType;因为本人的Xcode没升级,没法使用。

posted on 2015-10-02 15:27  popper小P  阅读(717)  评论(0编辑  收藏  举报