UIDynamicAnimator 學習總結

什麼是UIKit動力?—— 一句話:UIKit動力提供了一個模擬真實世界中力學相關的動畫和交互系統。比如重力、碰撞和吸附等。UIKit動力具有可組合、可重用和聲明式的特點。

1.吸附行爲(UIAttachmentBehavior):有一個對象UIAttachmentBehavior,該對象用來指定兩個動力項(項或點)之間的連接,當一個項或者點移動時,吸附的項也隨之移動。當然,這個連接並不是完全是靜態的(static),吸附的項有兩個屬性damping(阻尼)和oscillation(震盪),這兩個屬性決定了吸附項的行爲是如何隨時間而變化的。

 

2.碰撞行爲(UICollisionBehavior):通過對象UICollisionBehavior指定一個邊界,並且讓各個動力項,在該邊界內參與碰撞。UICollisionBehavior對象還可以指定這些動力項適當的迴應碰撞。

 

3.重力行爲(UIGravityBehavior):通過對象UIGravityBehavior給動力項指定一個重力矢量,具有重力矢量的動力項,會在重力矢量的方向上一直加速,直到與別的動力項產生了衝突或者,遇到了邊界。

 

4.推動行爲(UIPushBehavior):通過對象UIPushBehavior給動力項指定一個持續的或者瞬時的力(force vector)。

 

5.捕捉行爲(UISnapBehavior):通過對象UISnapBehavior給動力項指定一個捕捉點。動力項會根據配置的效果,來抓住這一捕捉點。

 

當動力行爲被添加到animator(UIDynamicAnimator類的實例對象)時,動力行爲就被激活。animator爲動力行爲的執行提供了上下文。動力項可以有多個行爲,只不過所有這些行爲都必須添加到相同的animator中。

 


UIKit動力架構:

一、UIDynamicAnimator介於iOS圖形引擎和動力項(View)之間,具有如下功效:
    •    提供動力行爲的上下文
    •    根據ref view確定座標系
    •    控制動力引擎
    •    維護着動力行爲的狀態

實例化UIDynamicAnimator的三種方法:
    •    在views上使用動力動畫,使用- (instancetype)initWithReferenceView:(UIView *)view方法(instancetype在iOS7中代替id)。reference view的座標系作爲動力行爲和動力項的座標系。動力項必須爲UIView,必須源自於reference view。

    •    在collection views上使用動力動畫,使用- (instancetype)initWithCollectionViewLayout:(UICollectionViewLayout *)layout方法。collection view layout的座標系作爲動力行爲和動力項的座標系。動力項必須爲UICollectionViewLayoutAttributes對象。可使用setTranslatesReferenceBoundsIntoBoundaryWithInsets:設置碰撞動力界限(相對於collection view layout的座標系),當collection view layout發生改變時,會自動調用invalidateLayout、暫停、重新開始動力。

    •    在遵循UIDynamicItem協議的對象使用動力動畫,通過init方法創建。動畫使用絕對座標系(估計是受窗口約束)。沒有  什麼時候創建碰撞界限  的參考,然而可以在描述UICollisionBehavior實例的時候指定自定義碰撞界限。

UIDynamicAnimator通性:
    •    每個DynamicAnimator獨立於其他的DynamicAnimator。
    •    可以通過向相同的DynamicAnimator提交多個UIDynamicBehavior,將行爲綁定到動力項。
    •    所有dynamic item休息的時候DynamicAnimator會暫停,UIDynamicBehavior或者dynamic item增加刪除會重啓DynamicAnimator。

UIDynamicAnimator管理:
    •    – itemsInRect:返回貫穿指定區域的所有dynamic item。
    •    – addBehavior:向UIDynamicAnimator中添加UIDynamicBehavior。
    •    – removeBehavior:撤銷指定UIDynamicBehavior。
    •    – removeAllBehaviors撤銷所有UIDynamicBehavior。

UIDynamicAnimator狀態訪問:
    •    – elapsedTime 返回動畫開始到現在的時間間隔。 
    •     running  property (read-only) 如果UIDynamicAnimator正在運行,返回YES
    •     behaviors  property (read-only) 返回UIDynamicAnimator管理的UIDynamicBehavior
    •     referenceView  property (read-only) 返回用來實例化UIDynamicAnimator的UIView
    •     delegate  property  響應UIDynamicAnimator暫停或重啓的代理
    •     – updateItemFromCurrentState: (更新dynamic item在UIDynamicAnimator內部的代表的狀態),dynamic item被加入到UIDynamicAnimator後,你更改了dynamic item的狀態,你應該使用這個方法更新dynamic item的狀態。

UIDynamicAnimator中的Collection View Additions:
    •    - (UICollectionViewLayoutAttributes *)layoutAttributesForCellAtIndexPath:(NSIndexPath *)indexPath 返回指定位置collection view cell的佈局屬性
    •    - (UICollectionViewLayoutAttributes *)layoutAttributesForDecorationViewOfKind:(NSString *)decorationViewKind atIndexPath:(NSIndexPath *)indexPath 返回indexPath位置上collection view cell的指定(用decorationViewKind指定)decorationView的佈局屬性。
    •    - (UICollectionViewLayoutAttributes *)layoutAttributesForSupplementaryViewOfKind:(NSString *)kind atIndexPath:(NSIndexPath *)indexPath 返回indexPath位置上collection view cell的指定(用kind指定)SupplementaryView的佈局屬性。


二、UIDynamicAnimatorDelegate是與UIDynamicAnimator相關的一個delegate
UIDynamicAnimator停止或將要啓動的時候分別會調用UIDynamicAnimatorDelegate中的dynamicAnimatorDidPause:或dynamicAnimatorWillResume:方法。

UIDynamicBehavior學習總結


三、UIDynamicBehavior:二維動畫中,主要用來描述動力的行爲。在iOS7中,默認提供瞭如下動力行爲:
    •    UIAttachmentBehavior
    •    UICollisionBehavior
    •    UIDynamicItemBehavior
    •    UIGravityBehavior
    •    UIPushBehavior
    •    UISnapBehavior objects
動力行爲可以在任意時間內進行添加或移除。另外動力行爲可以是組合的,也可以被繼承。可以通過向UIDynamicBehavior或者用戶子類化的UIDynamicBehavior的實例使用addChildBehavior: 方法創建組合行爲。(但不能向系統提供的行爲使用該方法)

UIDynamicBehavior配置:
    •    action  property在UIDynamicAnimator運行過程中每一步都會調用的語句塊
    •    – addChildBehavior:向自定義的UIDynamicBehavior添加子行爲
    •    childBehaviors  property (read-only) 返回自定義UIDynamicBehavior的子行爲數組
    •    – removeChildBehavior:刪除自定義的UIDynamicBehavior的子行爲

UIAttachmentBehavior
        指定兩個動力項或者動力項和錨點間的連接。動力項默認錨點在他的center。步驟1.使用initWithItem:方法實例化UIAttachmentBehavior 2.使用addBehavior: 方法將行爲添加到動力動畫。
        可以加入到自定義的組合行爲,如果想在動力動畫的每一步改變行爲,可以實現繼承的 action 方法。

UIAttachmentBehavior實例化方法及管理:
    •    items  property(read-only)返回行爲連接的dynamic items。
    •    – initWithItem:attachedToAnchor:實例化UIAttachmentBehavior,連接dynamic item的center到一個錨點。
    •    – initWithItem:attachedToItem:實例化UIAttachmentBehavior,連接dynamic item的center到另一個dynamic item的center。
    •    – initWithItem:point:attachedToAnchor:實例化UIAttachmentBehavior,連接dynamic item的指定點(相對於dynamic item center的點)到一個錨點。
    •    – initWithItem:point:attachedToItem:point:實例化UIAttachmentBehavior,連接dynamic item的指定點(相對於dynamic item center的點)到另一個dynamic item的指定點。

UIAttachmentBehavior配置:
    •    anchorPoint  property 錨點類型UIAttachmentBehavior的錨點。
    •    attachedBehaviorType  property (read-only) UIAttachmentBehavior的類型,枚舉(UIAttachmentBehaviorTypeItems,UIAttachmentBehaviorTypeAnchor)
    •    damping  property 阻尼數值(浮點)
    •    frequency  property 震動頻率(浮點)
    •    length  property 兩個吸附點間的距離(浮點)

UICollisionBehavior
        指定一些dynamic item可以相互碰撞或者與UICollisionBehavior的界線碰撞。步驟1.使用init方法創建UICollisionBehavior,使用addItem: 方法向其添加dynamic item 或者使用initWithItems:實例化UICollisionBehavior。2. 使用addBehavior: 方法將UICollisionBehavior加入到動力動畫


UICollisionBehavior實例化方法及管理:
        – addItem:        向UICollisionBehavior實例添加dynamic item
        – initWithItems:  使用dynamic item數組實例化UICollisionBehavior
        – removeItem:     刪除dynamic item
          items  property (read-only)  返回UICollisionBehavior實例中的dynamic item數組
        
UICollisionBehavior配置:

UICollisionBehavior設置界線的三種方法:
    •    addBoundaryWithIdentifier:forPath: 
    •    addBoundaryWithIdentifier:fromPoint:toPoint: 
    •    setTranslatesReferenceBoundsIntoBoundaryWithInsets: (前提使用reference view 或者 collection view layout實例化的動力動畫)
注意: dynamic item的初始位置不能在界線外

      boundaryIdentifiers  property(read-only) 返回UICollisionBehavior 實例的所有界線標示符
       – boundaryWithIdentifier: 返回指定標示符對應的貝塞爾曲線界線
          collisionDelegate  property  UICollisionBehavior 實例的collisionDelegate會響應 碰撞的一些回調方法。查閱UICollisionBehaviorDelegate 
          collisionMode  property 指定碰撞類型        UICollisionBehaviorModeItems       = 1 << 0,
                                       UICollisionBehaviorModeBoundaries  = 1 << 1,
                                       UICollisionBehaviorModeEverything  = NSUIntegerMax
        – removeAllBoundaries
        – removeBoundaryWithIdentifier:
        translatesReferenceBoundsIntoBoundary  property 基於相對座標系統的界線是否有效


UIDynamicItemBehavior
基本的動力動畫描述,每一個屬性重寫了對應的默認值。
步驟1.使用init方法創建UICollisionBehavior,使用addItem: 方法向其添加dynamic item 或者使用initWithItems:實例化UIDynamicItemBehavior。2. 使用addBehavior: 方法將UIDynamicItemBehavior加入到動力動畫

使用allowsRotation 屬性設置行爲中的dynamic item是否可以循環。
使用elasticity 屬性設置碰撞彈性係數。範圍(0.0-1.0)
使用friction 屬性設置摩擦係數。
使用resistance  property設置線性阻力系數。(0--CGFLOAT_MAX)
使用angularResistance  property設置角度阻力系數。(0--CGFLOAT_MAX)
使用density  property設置相對密度。不明白什麼意思
注意: 如果向同一個動力動畫添加多個UIDynamicItemBehavior實例,只會應用一套屬性描述(交集?)多個UIDynamicItemBehavior實例配置同個屬性時,使用最後的。

– addAngularVelocity:forItem:向dynamic item增加角速度屬性。單位弧度
– addLinearVelocity:forItem: 向dynamic item增加線速度屬性。單位點
angularResistance  property         UIDynamicItemBehavior的角度阻力系數。


UIPushBehavior

UISnapBehavior
這兩個自學吧實在不想寫了。

四、Reference View:該用是用來初始化Animator用的,它的作用是給動力行爲提供座標系。

五、View:在UIKit動力中,又稱爲動力項(dynamic item)。動力項是遵循UIDynamicItem協議的任意對象(可以是SDK中默認提供的,或者開發者自定義的)。(The UIView and UICollectionViewLayoutAttributes classes implement this protocol starting in iOS 7.0.)
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章