補作業(yè) - Dynamic Animator

UIDynamicAnimator :為我們提供了一些基于物理學的動畫,讓我們更容易的做出一些與現(xiàn)實世界(物理行為)相符的逼真的二維動畫。

iOS 7 之后,Apple 給我們提供了一個與物理學相關(physics-related)的 API,與之相關的有兩個類和一個協(xié)議:

  • UIDynamicAnimator - 動畫生成器,我們只需配置好屬性并提交給它,其余的由它去做。
  • UIDynamicBehavior - 一些物理學行為。它的子類提供了一些具體的物理學行為。
  • UIDynamicItem - 這是一個協(xié)議,只要遵循了這個協(xié)議的任何對象, 都可以成為UIDynamicAnimator動畫的對象。UICollectionViewLayoutAttributes, UIDynamicItemGroup(iOS 9.0 +), UIView都遵循了這個協(xié)議。

一張圖更好的理解:


UIDynamicAnimator

Demo

它像一個驅(qū)動類,它關聯(lián)了遵守UIDynamicItem協(xié)議的可動畫對象Item和行為Behavior,給動畫的執(zhí)行提供了上下文,之后動畫的執(zhí)行由它驅(qū)動。它有類似于集合的一些方法:- addBehavior:,- removeBehavior:,- removeAllBehaviors.

其中,需要注意的有幾點:

  • 初始化方法:- initWithReferenceView:中傳入的是參考view,而不是直接動畫的view。
  • 動畫執(zhí)行完畢后,可動畫對象的一些屬性會被改變而不會復原(frame、color、size and so on...)。所以,如果我們需要重復執(zhí)行一個動畫的話,我們需要在合適的時機重新設置這些值。

APIs

UIDynamicAnimatorAPI只有幾個,如下:

UIDynamicAnimator

UIDynamicBehavior

提供動畫行為的類。使用中我們更多的是直接使用他的子類。子類具體如圖1所示。它的子類實現(xiàn)了各種物理學行為。具體可以查看每個子類的頭文件。他們有幾個通用的屬性:

UIAttachmentBehavior

Discussion

UIAttachmentBehavior可以把兩個view或者viewanchorPoint 關聯(lián)起來。

APIs

它有一些自己的屬性,其中比較重要的是:

  • damping: 阻尼,要和阻力做區(qū)分,當此值設置為1時,達到臨界阻尼,到達臨界阻尼后我們的動畫便不再會有回彈的效果。
  • frequency: 頻率,行為的頻率,單位Hz,值越大,頻率越高,動畫過程越快,動畫效果越不明顯。
  • length: 關聯(lián)的兩個對象(viewview 或者 viewanchorPoint) 動畫結束后兩者錨點(anchor)之間的距離長度。
  • frictionTorque: 摩擦力矩,作用暫時不詳。

demo

基于蘋果爸爸強大的封裝,我們可以很容易的實現(xiàn)下面的效果:

Attachment

完整的代碼為:

UIAttachmentBehavior *attachment = [[UIAttachmentBehavior alloc] initWithItem:self.animationView attachedToItem:self.relyView];
attachment.damping = 0.5;
attachment.frequency = 1.f;
attachment.length = 80;
//    attachment.frictionTorque = 1.f;
attachment.action = ^{
   NSLog(@"%@",NSStringFromCGRect(self.animationView.frame));
};
[self.animator addBehavior:attachment];

你可以自己調(diào)整下參數(shù),看看之后的效果。

UIGravityBehavior

Discussion

UIGravityBehavior模擬的是現(xiàn)實生活中的重力特性。

Gravity

APIs

能讓我們自定義的API只有幾個,其中:

  • gravityDirection: 重力方向。單位向量,默認是(0.0,1.0),即重力向下。重力坐標系和UIKit的一樣。y軸向下為正,x 軸向左為正。如下:

UICollisionBehavior

Discussion

UICollisionBehavior模擬的是現(xiàn)實生活中的碰撞特性。在碰撞中,我們需要指定碰撞的邊界,碰撞的邊界可以是另一個view,可以是一個邊界。如果我們沒有指定邊界的話, 并且也沒有將參考視圖作為邊界,那么碰撞行為就不會發(fā)生。

Collision

APIs

  • collisionMode: 指定碰撞的邊界類型。
  • translatesReferenceBoundsIntoBoundary: 把參考視圖轉(zhuǎn)化為碰撞的邊界。
  • - addBoundaryWithIdentifier:forPath::指定一個貝塞爾路徑作為碰撞邊界,并給這個碰撞邊界一個標記。
  • - addBoundaryWithIdentifier:fromPoint:toPoint:指定兩個點之間的連線為碰撞邊界。如果指定collisionModeUICollisionBehaviorModeItems,則設置這個屬性無效。

UIPushBehavior

Discussion

UIPushBehavior可以對一個物體施加一個連續(xù)的或者瞬時的力,并改變物體的位置。

Push

APIs

  • UIPushBehaviorMode:推力的類型,枚舉值。分為持續(xù)(UIPushBehaviorModeContinuous)和瞬時(UIPushBehaviorModeInstantaneous)。
  • angle: 推力的角度。
  • magnitude: 推力的大小。
  • pushDirection: 推力的方向,和UIKit 的坐標系相同。
  • active: 推力當前的狀態(tài),分為activeinactive.

SnapViewController

Discussion

UISnapBehavior模擬的是物體吸附的行為,并且伴有彈簧動畫。

Snap

APIs

  • damping: 阻尼。
  • snapPoint: 和anchorPoint 的作用類似,代表的是當前Item的錨點位置。

UIDynamicItemBehavior

如果你不滿足于上面的屬性,那么UIDynamicItemBehavior給你提供了更多的選擇。我們可以使用UIDynamicItemBehavior,來設置Item的更多屬性。包括:

  • elasticity: 彈力。在0 ~ 1 之間,0代表無彈性,1代表彈性碰撞

  • friction: 摩擦力。

  • charge: 電荷。決定了物體和電場或者磁場之間的相互作用力。

  • density: 密度。決定了動力項的其他屬性的表現(xiàn),比如摩擦、碰撞等。

  • angularResistance: 角度阻力。有效范圍在0 ~ CGFlOAT_MAX,值越大,在動力行為中物體越不容易旋轉(zhuǎn)。

  • resistance: 阻力。動力項的線性阻力。有效值范圍為0.0 ~ CGFLOAT_MAX。

  • anchored: 是否固定錨點。如果這個值為YES,那么,當發(fā)生碰撞的時候,物體不會移動,但參與碰撞。效果類似于一個碰撞邊界。

  • - addLinearVelocity:forItem:: 給物體增加一個線性速度。

  • - addAngularVelocity:forItem:: 給物體增加一個角速度。

  • allowsRotation: 值為 NO時,強制物體再發(fā)生碰撞之后不會旋轉(zhuǎn)。

小結

這是 Apple 在 iOS 7推出的功能,在iOS 9之后增加了一些新的API。算是一個老功能,現(xiàn)在才研究起來算是補作業(yè)了?;径际歉鶕?jù)官方文檔摸索著寫的一個小Demo,實現(xiàn)了一些基本的小效果。更加炫酷的就需要靠強大的 idea 了。

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

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

  • 發(fā)現(xiàn) 關注 消息 iOS 第三方庫、插件、知名博客總結 作者大灰狼的小綿羊哥哥關注 2017.06.26 09:4...
    肇東周閱讀 15,667評論 4 61
  • 概念介紹 UIDynamic從ios7才開始有的,其他2D仿真引擎:BOX2D:C語言框架,免費Chipmunk:...
    我是滕先生閱讀 2,360評論 5 23
  • iOS 7增加了UIKit Dynamics庫,其集成于UIKit框架中,將2D物理引擎引入了UIKit,提供了以...
    pro648閱讀 2,980評論 2 14
  • 小馬是一個熱愛表現(xiàn)的人,各方面都非常積極,劉老板非常高興,經(jīng)常讓他去做一些小事情。不過小馬這個人嘴上說的厲害,但是...
    趙艷偉閱讀 262評論 0 0
  • 坐于密密麻麻的人群中 感覺自己 就像是掉在油鍋里被炸著的麻球 不能呼吸 不能吐氣 感覺腦袋在一點點變大
    格伊閱讀 189評論 0 0

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