- UIDynamic 是物理引擎, 模仿物理效果
- 知名2D物理引擎 Box2d Chipmunk
- 只有遵守了UIDynamicItem协议的对象
UIVIew默认遵守了协议
UICollectionViewLayouetAttributes已经遵循了
- 重力行为
UIGravityBehavior 重力行为
UICollisionBehavior 碰撞行为
- UIDynamicAnimator *animator = [[UIDynamicAnimator alloc] initWithReferenceView:self.view];
UIGravityBehavior *grivity = [[UIGravityBehavior alloc] initWithItems:@[self.myView];
grivity.gravityDirection = CGVectorMake( ,);
grivity.angle = 0; 弧度方向 跟上面的设置有矛盾, 哪个在下面哪个起作用M_PI_2
grivity.magnitude = 1; 设置重力加速度 和 gravityDiretion 有矛盾
[animator addBehavior:grivity];
- 弹性行为UICollisionBehavior *collision = [[UICollisionBehavior alloc] initWithItems:--];
collision.translatesRefrernceBoundsIntoBoundary = YES;
[self.animator addBehavior:collision];
UIDynamicItemBehavior *item = UIDynamicItemBehavior alloc] initWithItems:@[self.myView]];辅助行为
item.resistance = 1; 阻力
item.elasticity = 0.5; 弹性系数
- 通常用辅助行为来设置弹性系数
只要是行为就要添加
- [collision addBoundaryWithIdentifier:@"c1" fromePoint:CGPointMake toPoint;自定义一条线为边界
- UIBezierPath *path = [UIBezierPath bezierPathWithOvalInRect:CGRectMake(20, 300, 400, 150)];
[collision addBoundaryWithIdentifier:@"c2" forPath:path];
- 检测碰到的是哪一根线 设置代理<UICollisionDelegate>
collision.collisionDelegate = self;
- (void)collisionBehavior -------withBoundaryIdentifier 当碰撞的时候就会调用
beganContactForItem:标示碰撞的物体
identifier:标示边界的标示符
atPoint:标示碰撞的点
UIView *view = (UIView*) item; 要强转
- 碰撞模式
collision.collisionMode = UICollisionBehaviiorModeItems; 只和物体碰撞
Boundaries只和边界碰撞
everything 都碰撞
- item.allowsrotation = YES 是否旋转
- 捕捉行为 UISnapBehavior *snap = [[UISnapBehavior alloc]initWithItem:self.myView snapToPoint:CGPoint]; 比如移动到手指所触摸的点
阻力系数 snap.damping = 0.5; 取值范围是0.5~1; 默认应该是0.5
- 附着行为 需要重力行为 initWIthitem:标示产生附着行为的物体 attachedToAnchor:附着的点 没有重力行为附着行为没效果
UIAttachmentBehavior *attachment = [[UIAttachmentBehavior alloc] initWithItem:self.myView attachedToAnchor:point];
- 只要重力行为有效果,就会调用 [ --- setAction:^{ 可以在这个方法中划线 }];
- 自定义了view为CZView 在控制器要获取相应的定义的变量 要强转CZView = (CZView *)self.view;
- attachiment.damping = 0.5 阻尼系数
attachiment.frequency = 0.5 频率
attachiment.length 是附着点和中心点得距离
- 中心点偏移的改变
UIAttachmentBehavior *attachment = [[UIAttachmentbehavior alloc] initWithItem:@[self.myView] offsetFromCenter:UIOffset attachedToAnchor:CGPoint];
- 推力行为[self.view converPoint:(CGPoint) fromView:(UIView*)]; 把fromView中的点坐标转换成self.view的点坐标。
- UIPushBehavior *push = [[UIPushBehavior alloc] initWithItems:@[] mode:UIPushBehaviorMode Continuous]; Insantaneous 一次性会回去
触摸点 和 物体的中心点进行计算 加速度 方向
方向 push.pushDirection = CGVectorMake(pushX, pushY);
加速度 push.magnitude = sqrt();
- [NSURL fileURLWithPath:] 本地资源
[NSURL urlWith:http://] 网络资源
- 改变原来附着点得锚点就可以移动原来的画面了
self.attachment.anchorPoint = point;
- 移除附着点
[self.animator remove ----];
- 自定义layer 中要创建layer 用的方法是-(void)drawInContext:(CGContextRef)ctx{};
记住 在自定义中的地方 要重绘。[layer setNeedsDisplay] view也有这个方法
代理或者继承都要重绘
- 通过代理方法也可以在控制器中进行绘制图形 创建layer
- keyAnimation.timingFunction = [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseInEaseOut];中间快 两边慢
15.UIDynamic 物理引擎
最新推荐文章于 2024-06-29 02:28:39 发布