UIKit Dynamics (五) 施力
UIKit Dynamics (一) 概述
UIKit Dynamics (二) 重力
UIKit Dynamics (三) 碰撞
UIKit Dynamics (四) 急停
UIKit Dynamics (五) 施力
UIPushBehavior
UIPushBehavior 模拟了对物体施加力量,施力方式分两种,一种是 instantaneous 给物体一个初动力,另一种是 continuous 给物体一个持续力即产生加速度。然后物体就会按照受力进行运动。
使用
UIPushBehavior 像其他效果一样,通过一个 NSArray 进行初始化然后加入到 UIDynamicAnimator 中即可使用,但由于 UIPushBehavior 的施力大小默认值是 0,因此物体不会运动,需要修改 magnitude 属性才可以。
_pushBehavior = [[UIPushBehavior alloc] initWithItems:@[_box] mode:UIPushBehaviorModeInstantaneous];
_pushBehavior.magnitude = 1.0f;
_pushBehavior.angle = M_PI_2;
[_animator addBehavior:_pushBehavior];
配置
UIPushBehavior 在初始化的时候可选施力的属性 UIPushBehaviorModeInstantaneous 或 UIPushBehaviorModeContinuous。
UIPushBehavior 实例化后主要有如下属性:
// 施力的属性,同初始化
@property (nonatomic, readonly) UIPushBehaviorMode mode;
// 施力的状态
@property (nonatomic, readwrite) BOOL active;
// 施力的角度,取值 0~2*PI
@property (readwrite, nonatomic) CGFloat angle;
// 施力的大小,默认为 nil,即没有力
// 当取值为单位 1 的时候会对物体施加一个 100 points / second² 的加速度
@property (readwrite, nonatomic) CGFloat magnitude;
// 施力的方向向量,即将 angle 转换为二维向量
@property (readwrite, nonatomic) CGVector pushDirection;
Push
并且有如下方法:
// 复合函数,直接对 angle 和 magnitude 赋值
- (void)setAngle:(CGFloat)angle magnitude:(CGFloat)magnitude;
// 获得和修改施力偏移点
- (UIOffset)targetOffsetFromCenterForItem:(id <UIDynamicItem>)item;
- (void)setTargetOffsetFromCenter:(UIOffset)o forItem:(id <UIDynamicItem>)item;
接下来要讨论一下 - (UIOffset)targetOffsetFromCenterForItem:(id <UIDynamicItem>)item;
和 - (void)setTargetOffsetFromCenter:(UIOffset)o forItem:(id <UIDynamicItem>)item;
这两个函数。
UIPushBehavior 默认是对物体的中心即 center 的位置进行施力,但是可以通过 setTargetOffsetFromCenter
这个函数设置施力位置相对于中心的偏移量,当物体的受力部位不在中心并且持续受力(mode 为 continuour)时就会开始旋转。
本文 demo 是 Push 页面,可以通过拖动 slider 调节 angle(0~2*PI) 和 magnitude(0~1) 大小,并且点击方块中可以改变施力点的位置(点击 replay 会重置施力点,请在物体运动过程中修改)。项目地址