UIDynamic物理引擎

(前言)
UIDynamicAnimator(Dynamic)动态(Animator)动画师
它是基于CoreAnimation封装出来的,下一篇博客详细介绍CoreAnimation,今天先只谈使用不谈原理
一、(UIDynamicAnimato介绍)
UIDynamicAnimator继承于NSObject 隶属于UIKit框架,它能够模拟一些生活中的物理现象(Gravity重力)(Collision碰撞)(Snap捕捉)(Push推)(AttachmentBehavior吸附)(DynamicItem物理行为集合)

二、使用UIDynamic
只有遵守了UIDynamicItem协议的对象才可以做物理仿真,UIView遵守了,所以只要继承了UIView便可以使用UIDynamic

在想构建物理引擎的时候(*****重点*****)
1、构建(UIDynamicAnimator)动画师
2、构建(UIDynamicBehavior或其子类)以何种行为进行构建物理引擎
3、把要构建的行为交给动画师 
 

(物理引擎的重点**********UIDynamicAnimator(动画师)**********)

(物理引擎的重点**********UIDynamicBehavior(行为)**********)

有这么几种行为

(1)UIGravityBehavior     重力行为

(2)UICollisionBehavior   碰撞行为

(3)UISnapBehavior        捕捉行为

(4)UIPushBehavior        推动行为

(5)UIAttachmentBehavior  附着行为

(6)UIDynamicItemBehavior 动力元素行为

 

1、重力行为(UIGravityBehavior)
 
 
 

既然API不是很多~那我们逐一介绍一下

UIGravityBehavior的属性
(1)gravityDirection(重力方向,矢量)

    gravityDirection的类型是CGVector(struct结构体类似于CGRrct)所以使用CGVectorMake进行构建(默认值是(0.0 , 1.0),两个值(纵向矢量,横向适量)),纵向矢量(正为向下,负为向上)横向适量(正为向右,负为向左),矢量合起来的值越大,加速度越快(1,1)与(10,10)方向相同,速度不同

(2)angle(重力方向,弧度)
    anglel类型是CGFloat(默认值M_PI/2),0向左,M_PI/2向下,M_PI向右,M_PI*3/2向上

(3)magnitude(加速度)
    magnitude类型CGFloat(1.0相当于1000points/second^2)(m/s²)
 

UIGravityBehavior的方法

(1)- (instancetype)initWithItems:(NSArray<id <UIDynamicItem>> *)items;
构造方法Items(是NSArray,向数组中添加UIView或者UIView的子类)表示那些控件需要进行调用物理引擎 

(2)- (void)addItem:(id <UIDynamicItem>)item;
动态添加控件对象 

(3)- (void)removeItem:(id <UIDynamicItem>)item;

动态移除控件对象

#import "GravityBehaviorVC.h"
@interface GravityBehaviorVC ()
//1、构建(Dynamic)动态(Animator)动画师
@property (strong, nonatomic) UIDynamicAnimator *animator;
@property (strong, nonatomic) UIView *view1;
@property (strong, nonatomic) UIView *view2;
@end

@implementation GravityBehaviorVC
- (UIDynamicAnimator *)animator
{
    if (!_animator) {
        _animator = [[UIDynamicAnimator alloc]initWithReferenceView:self.view];
    }
    return _animator;
}
- (UIView *)view1
{
    if (!_view1) {
        _view1 = [[UIView alloc]initWithFrame:CGRectMake(20, 80, 80, 80)];
        _view1.backgroundColor = [UIColor purpleColor];
    }
    return _view1;
}
- (UIView *)view2
{
    if (!_view2) {
        _view2 = [[UIView alloc]initWithFrame:CGRectMake(40, 180, 80, 80)];
        _view2.backgroundColor = [UIColor greenColor];
    }
    return _view2;
}
- (void)viewDidLoad {
    [super viewDidLoad];
    self.view.backgroundColor = [UIColor whiteColor];
    [self.view addSubview:self.view1];
    [self.view addSubview:self.view2];
}
- (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event
{
    //2、创建物理仿真行为
    //创建物理仿真行为(Items)
    UIGravityBehavior *gravity = [[UIGravityBehavior alloc]initWithItems:@[self.view1]];
    gravity.magnitude = 3;
    gravity.gravityDirection = CGVectorMake(3, 3);
    [self.animator addBehavior:gravity];
    
    //创建碰撞仿真型为
    UICollisionBehavior *collision = [[UICollisionBehavior alloc]initWithItems:@[self.view1]];
    collision.translatesReferenceBoundsIntoBoundary = YES;
    [self.animator addBehavior:collision];
}

 

 

 

转载于:https://www.cnblogs.com/hongfuqing/p/5208086.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值