重點(diǎn) (三十二) : UIDynamic

簡(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ù)的捕捉行為,需要先把前面的捕捉行為從物理仿真器中移除

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容