iOS7新特性UIDynamic

iOS-UIDynamic

初试

UIDynamic是iOS7引入的UIKit动力学,目的是将2D物理引擎引入UIKit.
最明显的就是短信界面,拖动的时候有物理效果.
通常的时候我们仅使用CA和UIView的动画即可,除非我们需要引入非常逼真的交互设计的时候才使用
来看看新的基本概念:

  • UIDynamicItem:用来描述一个力学物体的状态,其实就是实现了UIDynamicItem委托的对象,或者抽象为有面积有旋转的质点.
  • UIDynamicBehavior:动力行为的描述,用来指定UIDynamicItem应该如何运动,定义适用的物理规则.一般使用该类的子类对象来对一组UIDynamicItem对象应该遵守的行为规则进行描述.
  • UIDynamicAnimator:动画的播放者,动力行为(UIDynamicBehavior)的容器,添加到容器的行为将发挥作用
  • ReferenceView:等同于力学参考系,当添加力学的UIView是ReferenceView的子view或就是它本身的时候,动力就会发生作用.但如果是它本身,虽然能发挥作用,但这个力学仿真就不逼真了

喵神原文: http://onevcat.com/2013/06/uikit-dynamics-started/ onevcat

写段代码演示下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
@interface ViewController ()

@property (nonatomic, strong) UIDynamicAnimator *animator;

@end

@implementation ViewController

- (void)viewDidLoad {
[super viewDidLoad];

UIView *aView = [[UIView alloc] initWithFrame:CGRectMake(100, 50, 100, 100)];
aView.backgroundColor = [UIColor lightGrayColor];
[self.view addSubview:aView];

UIDynamicAnimator *animator = [[UIDynamicAnimator alloc] initWithReferenceView:self.view];
UIGravityBehavior *gravityBeahvior = [[UIGravityBehavior alloc] initWithItems:@[aView]];
[animator addBehavior:gravityBeahvior];
self.animator = animator;

}

1
2
3
UIDynamicAnimator *animator = [[UIDynamicAnimator alloc] initWithReferenceView:self.view];
===>
UIDynamicAnimator *animator = [[UIDynamicAnimator alloc] initWithReferenceView:aView];

比第一个要快,这就不逼真了,而且这样写并不对

接下来就是物理仿真了,有重力,得有碰撞啊,这样无界的就没有意义了
碰撞也有一个UIDynamicBehavior的子类UICollisionBehavior.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
- (void)viewDidLoad {
[super viewDidLoad];

UIView *aView = [[UIView alloc] initWithFrame:CGRectMake(100, 50, 100, 100)];
aView.backgroundColor = [UIColor lightGrayColor];
aView.transform = CGAffineTransformRotate(aView.transform, 45);
[self.view addSubview:aView];

UIDynamicAnimator *animator = [[UIDynamicAnimator alloc] initWithReferenceView:self.view];
UIGravityBehavior *gravityBeahvior = [[UIGravityBehavior alloc] initWithItems:@[aView]];
[animator addBehavior:gravityBeahvior];
self.animator = animator;

UICollisionBehavior *collisionBehavior = [[UICollisionBehavior alloc] initWithItems:@[aView]];
collisionBehavior.translatesReferenceBoundsIntoBoundary = YES;
[animator addBehavior:collisionBehavior];
}

在里边加一了一个旋转角,是不是很有意思

translatesReferenceBoundsIntoBoundary设置以self.view为边界.setTranslatesReferenceBoundsIntoBoundaryWithInsets:方法也可以,更复杂的addBoundaryWithIdentifier:forPath:来添加UIBezierPath,或者addBoundaryWithIdentifier:fromPoint:toPoint:来添加一条线段为边界
可以设置collisionBehavior的代理,监听事件.具体的自己看看代码

  • UIAttachmentBehavior描述一个view和一个锚相连接的情况
  • UISnapBehavior描述view吸附的情况
  • UIPushBehavior描述对view施加力的情况
  • UIDynamicItemBehavior相当于自定义描述了,摩擦、阻力等一大堆我不知道的.
Your browser is out-of-date!

Update your browser to view this website correctly. Update my browser now

×