簡(jiǎn)介
什么是UIDynamic
UIDynamic是從iOS 7開(kāi)始引入的一種新技術(shù),隸屬于UIKit框架
可以認(rèn)為是一種物理引擎,能模擬和仿真現(xiàn)實(shí)生活中的物理現(xiàn)象
重力、彈性碰撞等現(xiàn)象
物理引擎的價(jià)值
廣泛用于游戲開(kāi)發(fā),經(jīng)典成功案例是“憤怒的小鳥(niǎo)”
讓開(kāi)發(fā)人員可以在遠(yuǎn)離物理學(xué)公式的情況下,實(shí)現(xiàn)炫酷的物理仿真效果
提高了游戲開(kāi)發(fā)效率,產(chǎn)生更多優(yōu)秀好玩的物理仿真游戲
知名的2D物理引擎
Box2d
Chipmunk
使用步驟
要想使用UIDynamic來(lái)實(shí)現(xiàn)物理仿真效果,大致的步驟如下
創(chuàng)建一個(gè)物理仿真器(順便設(shè)置仿真范圍)
創(chuàng)建相應(yīng)的物理仿真行為(順便添加物理仿真元素)
將物理仿真行為添加到物理仿真器中 à 開(kāi)始仿真
三大概念
物理仿真元素(Dynamic Item)
誰(shuí)要進(jìn)行物理仿真?
物理仿真行為(Dynamic Behavior)
執(zhí)行怎樣的物理仿真效果?怎樣的動(dòng)畫(huà)效果?
物理仿真器(Dynamic Animator)
讓物理仿真元素執(zhí)行具體的物理仿真行為
物理仿真元素
注意
不是任何對(duì)象都能做物理仿真元素
不是任何對(duì)象都能進(jìn)行物理仿真
哪些對(duì)象才能做物理仿真元素
任何遵守了UIDynamicItem協(xié)議的對(duì)象
UIView默認(rèn)已經(jīng)遵守了UIDynamicItem協(xié)議,因此任何UI控件都能做物理仿真
UICollectionViewLayoutAttributes類默認(rèn)也遵守UIDynamicItem協(xié)議
物理仿真行為
UIDynamic提供了以下幾種物理仿真行為
UIGravityBehavior:重力行為
UICollisionBehavior:碰撞行為
UISnapBehavior:捕捉行為
UIPushBehavior:推動(dòng)行為
UIAttachmentBehavior:附著行為
UIDynamicItemBehavior:動(dòng)力元素行為
物理仿真行為須知
上述所有物理仿真行為都繼承自UIDynamicBehavior
所有的UIDynamicBehavior都可以獨(dú)立進(jìn)行
組合使用多種行為時(shí),可以實(shí)現(xiàn)一些比較復(fù)雜的效果
物理仿真器
物理仿真器須知
它可以讓物理仿真元素執(zhí)行物理仿真行為
它是UIDynamicAnimator類型的對(duì)象
UIDynamicAnimator的初始化
- (instancetype)initWithReferenceView:(UIView *)view;
view參數(shù):是一個(gè)參照視圖,表示物理仿真的范圍
UIDynamicAnimator的常見(jiàn)方法
- (void)addBehavior:(UIDynamicBehavior*)behavior;
添加1個(gè)物理仿真行為
- (void)removeBehavior:(UIDynamicBehavior*)behavior;
移除1個(gè)物理仿真行為
- (void)removeAllBehaviors;
移除之前添加過(guò)的所有物理仿真行為
UIDynamicAnimator的常見(jiàn)屬性
@property (nonatomic, readonly) UIView* referenceView;
參照視圖
@property (nonatomic, readonly, copy) NSArray* behaviors;
添加到物理仿真器中的所有物理仿真行為
@property (nonatomic, readonly, getter= isRunning) BOOLrunning;
是否正在進(jìn)行物理仿真
@property (nonatomic, assign) id<UIDynamicAnimatorDelegate> delegate;
代理對(duì)象(能監(jiān)聽(tīng)物理仿真器的仿真過(guò)程,比如開(kāi)始和結(jié)束)
重力行為(UIGravityAnimator)
簡(jiǎn)介
給定重力方向、加速度,讓物體朝著重力方向掉落
UIGravityBehavior的初始化
- (instancetype)initWithItems:(NSArray*)items;
item參數(shù) :里面存放著物理仿真元素
UIGravityBehavior常見(jiàn)方法
- (void)addItem:(id<UIDynamicItem>)item;
添加1個(gè)物理仿真元素
- (void)removeItem:(id<UIDynamicItem>)item;
移除1個(gè)物理仿真元素
重力行為(UIGravityAnimator)
UIGravityBehavior常見(jiàn)屬性
@property (nonatomic, readonly, copy) NSArray* items;
添加到重力行為中的所有物理仿真元素
@property (readwrite, nonatomic) CGVectorgravityDirection;
重力方向(是一個(gè)二維向量)
@property (readwrite, nonatomic) CGFloatangle;
重力方向(是一個(gè)角度,以x軸正方向?yàn)?°,順時(shí)針正數(shù),逆時(shí)針負(fù)數(shù))
@property (readwrite, nonatomic) CGFloatmagnitude;
量級(jí)(用來(lái)控制加速度,1.0代表加速度是1000 points /second2)
碰撞行為(UICollisionBehavior)
簡(jiǎn)介
可以讓物體之間實(shí)現(xiàn)碰撞效果
可以通過(guò)添加邊界(boundary),讓物理碰撞局限在某個(gè)空間中
UICollisionBehavior邊界相關(guān)的方法
(void)addBoundaryWithIdentifier:(id<NSCopying>)identifier forPath:(UIBezierPath*)bezierPath;
(void)addBoundaryWithIdentifier:(id<NSCopying>)identifier fromPoint:(CGPoint)p1 toPoint:(CGPoint)p2;
(UIBezierPath*)boundaryWithIdentifier:(id<NSCopying>)identifier;
(void)removeBoundaryWithIdentifier:(id<NSCopying>)identifier;
@property (nonatomic, readonly, copy) NSArray*
boundaryIdentifiers;
- (void)removeAllBoundaries;
碰撞行為(UICollisionBehavior)
UICollisionBehavior常見(jiàn)用法
@property (nonatomic, readwrite) BOOL
translatesReferenceBoundsIntoBoundary;
是否以參照視圖的bounds為邊界
- (void)setTranslatesReferenceBoundsIntoBoundaryWithInsets:(UIEdgeInsets)insets;
設(shè)置參照視圖的bounds為邊界,并且設(shè)置內(nèi)邊距
@property (nonatomic, readwrite) UICollisionBehaviorModecollisionMode;
碰撞模式(分為3種,元素碰撞、邊界碰撞、全體碰撞)
@property (nonatomic, assign, readwrite) id<UICollisionBehaviorDelegate>
collisionDelegate;
代理對(duì)象(可以監(jiān)聽(tīng)元素的碰撞過(guò)程)
捕捉行為(UISnapBehavior)
簡(jiǎn)介
可以讓物體迅速?zèng)_到某個(gè)位置(捕捉位置),捕捉到位置之后會(huì)帶有一定的震動(dòng)
UISnapBehavior的初始化
- (instancetype)initWithItem:(id<UIDynamicItem>)item snapToPoint:(CGPoint)point;
UISnapBehavior常見(jiàn)屬性
@property (nonatomic, assign) CGFloatdamping;
用于減幅、減震(取值范圍是0.0 ~ 1.0,值越大,震動(dòng)幅度越?。?/p>
UISnapBehavior使用注意
如果要進(jìn)行連續(xù)的捕捉行為,需要先把前面的捕捉行為從物理仿真器中移除