簡介
什么是UIDynamic
UIDynamic是從iOS 7開始引入的一種新技術(shù)葬毫,隸屬于UIKit框架
可以認為是一種物理引擎,能模擬和仿真現(xiàn)實生活中的物理現(xiàn)象
重力饺谬、彈性碰撞等現(xiàn)象
物理引擎的價值
廣泛用于游戲開發(fā)漾根,經(jīng)典成功案例是“憤怒的小鳥”
讓開發(fā)人員可以在遠離物理學公式的情況下到踏,實現(xiàn)炫酷的物理仿真效果
提高了游戲開發(fā)效率,產(chǎn)生更多優(yōu)秀好玩的物理仿真游戲
知名的2D物理引擎
Box2d
Chipmunk
使用步驟
要想使用UIDynamic來實現(xiàn)物理仿真效果昵济,大致的步驟如下
創(chuàng)建一個物理仿真器(順便設(shè)置仿真范圍)
創(chuàng)建相應(yīng)的物理仿真行為(順便添加物理仿真元素)
將物理仿真行為添加到物理仿真器中 à 開始仿真
三大概念
物理仿真元素(Dynamic Item)
誰要進行物理仿真智绸?
物理仿真行為(Dynamic Behavior)
執(zhí)行怎樣的物理仿真效果?怎樣的動畫效果访忿?
物理仿真器(Dynamic Animator)
讓物理仿真元素執(zhí)行具體的物理仿真行為
物理仿真元素
注意
不是任何對象都能做物理仿真元素
不是任何對象都能進行物理仿真
哪些對象才能做物理仿真元素
任何遵守了UIDynamicItem協(xié)議的對象
UIView默認已經(jīng)遵守了UIDynamicItem協(xié)議瞧栗,因此任何UI控件都能做物理仿真
UICollectionViewLayoutAttributes類默認也遵守UIDynamicItem協(xié)議
物理仿真行為
UIDynamic提供了以下幾種物理仿真行為
UIGravityBehavior:重力行為
UICollisionBehavior:碰撞行為
UISnapBehavior:捕捉行為
UIPushBehavior:推動行為
UIAttachmentBehavior:附著行為
UIDynamicItemBehavior:動力元素行為
物理仿真行為須知
上述所有物理仿真行為都繼承自UIDynamicBehavior
所有的UIDynamicBehavior都可以獨立進行
組合使用多種行為時,可以實現(xiàn)一些比較復(fù)雜的效果
物理仿真器
物理仿真器須知
它可以讓物理仿真元素執(zhí)行物理仿真行為
它是UIDynamicAnimator類型的對象
UIDynamicAnimator的初始化
- (instancetype)initWithReferenceView:(UIView *)view;
view參數(shù):是一個參照視圖海铆,表示物理仿真的范圍
UIDynamicAnimator的常見方法
- (void)addBehavior:(UIDynamicBehavior*)behavior;
添加1個物理仿真行為
- (void)removeBehavior:(UIDynamicBehavior*)behavior;
移除1個物理仿真行為
- (void)removeAllBehaviors;
移除之前添加過的所有物理仿真行為
UIDynamicAnimator的常見屬性
@property (nonatomic, readonly) UIView* referenceView;
參照視圖
@property (nonatomic, readonly, copy) NSArray* behaviors;
添加到物理仿真器中的所有物理仿真行為
@property (nonatomic, readonly, getter= isRunning) BOOLrunning;
是否正在進行物理仿真
@property (nonatomic, assign) id<UIDynamicAnimatorDelegate> delegate;
代理對象(能監(jiān)聽物理仿真器的仿真過程迹恐,比如開始和結(jié)束)
重力行為(UIGravityAnimator)
簡介
給定重力方向、加速度卧斟,讓物體朝著重力方向掉落
UIGravityBehavior的初始化
- (instancetype)initWithItems:(NSArray*)items;
item參數(shù) :里面存放著物理仿真元素
UIGravityBehavior常見方法
- (void)addItem:(id<UIDynamicItem>)item;
添加1個物理仿真元素
- (void)removeItem:(id<UIDynamicItem>)item;
移除1個物理仿真元素
重力行為(UIGravityAnimator)
UIGravityBehavior常見屬性
@property (nonatomic, readonly, copy) NSArray* items;
添加到重力行為中的所有物理仿真元素
@property (readwrite, nonatomic) CGVectorgravityDirection;
重力方向(是一個二維向量)
@property (readwrite, nonatomic) CGFloatangle;
重力方向(是一個角度殴边,以x軸正方向為0°,順時針正數(shù)珍语,逆時針負數(shù))
@property (readwrite, nonatomic) CGFloatmagnitude;
量級(用來控制加速度锤岸,1.0代表加速度是1000 points /second2)
碰撞行為(UICollisionBehavior)
簡介
可以讓物體之間實現(xiàn)碰撞效果
可以通過添加邊界(boundary),讓物理碰撞局限在某個空間中
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常見用法
@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;
代理對象(可以監(jiān)聽元素的碰撞過程)
捕捉行為(UISnapBehavior)
簡介
可以讓物體迅速沖到某個位置(捕捉位置)蛋铆,捕捉到位置之后會帶有一定的震動
UISnapBehavior的初始化
- (instancetype)initWithItem:(id<UIDynamicItem>)item snapToPoint:(CGPoint)point;
UISnapBehavior常見屬性
@property (nonatomic, assign) CGFloatdamping;
用于減幅、減震(取值范圍是0.0 ~ 1.0放接,值越大刺啦,震動幅度越小)
UISnapBehavior使用注意
如果要進行連續(xù)的捕捉行為透乾,需要先把前面的捕捉行為從物理仿真器中移除