1.8推行為UIPushBehavior
(一)碰撞行為UIPushBehavior作用
(二)常用屬性和方法
// 根據指定的模型初始化一個推行為
- (instancetype)initWithItems:(NSArray<id <UIDynamicItem>> *)items mode:(UIPushBehaviorMode)mode;
// 添加一個動力學元素給推行為
- (void)addItem:(id <UIDynamicItem>)item;
// 移除一個動力學元素從推行為
- (void)removeItem:(id <UIDynamicItem>)item;
// 推行為包含的所有的動力學元素
@property (nonatomic, readonly, copy) NSArray<id <UIDynamicItem>> *items;
// 推行為的模型 持續(xù)推力還是瞬時推力
@property (nonatomic, readonly) UIPushBehaviorMode mode;
// 設置推行為的活躍狀態(tài) YES:活躍 NO:不活躍
@property (nonatomic, readwrite) BOOL active;
// 推力方向(弧度)
@property (readwrite, nonatomic) CGFloat angle;
// 推力大小
@property (readwrite, nonatomic) CGFloat magnitude;
// 推力方向(向量)
@property (readwrite, nonatomic) CGVector pushDirection;
// 同時設置方向和推力大小
- (void)setAngle:(CGFloat)angle magnitude:(CGFloat)magnitude;
示例代碼:
@interface ViewController ()
@property (nonatomic, weak) UIView *redView;
@property (nonatomic, strong) UIDynamicAnimator *animator;
@end
@implementation ViewController
- (void)viewDidLoad {
[super viewDidLoad];
UIView *redView = [[UIView alloc] initWithFrame:CGRectMake(100, 100, 100, 100)];
redView.backgroundColor = [UIColor redColor];
[self.view addSubview:redView];
self.redView = redView;
}
- (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event{
// 獲取觸摸對象
UITouch *t = touches.anyObject;
// 獲取手指的坐標點
CGPoint p = [t locationInView:t.view];
// 1.創(chuàng)建動畫者對象
self.animator = [[UIDynamicAnimator alloc] initWithReferenceView:self.view];
// 2.創(chuàng)建行為
// UIPushBehaviorModeContinuous 持續(xù)推理(越來越快)
// UIPushBehaviorModeInstantaneous (瞬時推理)(越來越慢)
UIPushBehavior *push = [[UIPushBehavior alloc] initWithItems:@[self.redView] mode:UIPushBehaviorModeContinuous];
push.magnitude = 1;
// 計算手指到redView中心點的偏移量
CGFloat offsetX = p.x - self.redView.center.x;
CGFloat offsetY = p.y - self.redView.center.y;
// 設置手指到redView中心偏移量為推行為的向量方向
push.pushDirection = CGVectorMake(-offsetX, -offsetY);
// 設置推行為的活躍狀態(tài) YES:活躍 NO:不活躍
push.active = NO;
// 3.添加行為到動畫者對象
[self.animator addBehavior:push];
// 添加一個碰撞
UICollisionBehavior *collision = [[UICollisionBehavior alloc] initWithItems:@[self.redView]];
collision.translatesReferenceBoundsIntoBoundary = YES;
[self.animator addBehavior:collision];
}
@end