iOS UIDynamicAnimator 簡介

iOS UIDynamicAnimator 簡介

UIDynamicAnimator類是iOS平臺的物力引擎??梢詫崿F重力、彈簧、碰撞等等行為,達到現實世界的效果。使用的基礎類有:

  • UIDynamicAnimator 行為 - 基類
  • UIGravityBehavior 重力
  • UICollisionBehavior 碰撞
  • UIAttachmentBehavior 彈簧、連接
  • UISnapBehavior 吸附
  • UIPushBehavior 推力

UIDynamicAnimator

UIDynamicAnimator介于iOS圖形引擎和動力項(View)之間,具有如下功效:

  • 提供動力行為的上下文
  • 根據referenceView確定坐標系
  • 控制動力引擎
  • 維護著動力行為的狀態

如何創建

var dynamicAnimator = UIDynamicAnimator()

dynamicAnimator = UIDynamicAnimator.init(referenceView: self.view)

UIGravityBehavior

重力行為,常用屬性如下

屬性 類型 釋義
Items array[UIDynamicItem] 模擬重力行為的模擬對象數組
gravityDirection CGVector 從坐標原點向這個點連線就是一個矢量,也就是重力的方向,默認是(0.0, 1.0)
angle CGFloat 重力矢量方向與坐標軸x的夾角,例如垂直向下:π/2
magnitude CGFloat 重力加速度的倍數

如何創建

var gravity = UIGravityBehavior()

gravity = UIGravityBehavior.init(items: [square])
dynamicAnimator.addBehavior(gravity)

效果

GravityBehavior.gif

UICollisionBehavior

為Item與邊界以及Item之間添加碰撞效果。常用的屬性

屬性 類型 釋義
collisionMode UICollisionBehaviorMode 三種碰撞模式,只有Item之間;只有邊界;邊界以及Item之間
translatesReferenceBoundsIntoBoundary Bool referenceView的bounds轉換為邊界

常用方法

//設置碰撞內邊距
open func setTranslatesReferenceBoundsIntoBoundary(with insets: UIEdgeInsets)
//添加邊界
open func addBoundary(withIdentifier identifier: NSCopying, for bezierPath: UIBezierPath)

open func addBoundary(withIdentifier identifier: NSCopying, from p1: CGPoint, to p2: CGPoint)

open func boundary(withIdentifier identifier: NSCopying) -> UIBezierPath?

open func removeBoundary(withIdentifier identifier: NSCopying)

open var boundaryIdentifiers: [NSCopying]? { get }

open func removeAllBoundaries()

如何創建

var collision = UICollisionBehavior()
//添加碰撞元素
collision = UICollisionBehavior.init(items: [square])
collision.translatesReferenceBoundsIntoBoundary = true;

//自定義碰撞邊界
//  collision.addBoundaryWithIdentifier ('barrierView',forPath : UIBezierPath ( rect : barrierView.frame ))

animator.addBehavior(collision)
collision.action =  {
    //無返回值 無參數。
}

UIAttachmentBehavior

為Items之間或者Item和anchorPoint來創建連接行為

屬性 類型 釋義
attachedBehaviorType UIAttachmentBehaviorType 連接一個元素或者一個點
anchorPoint CGPoint 錨點
length CGFloat 連接點到元素長度
damping CGFloat 阻尼
frequency CGFloat 震蕩頻率

常用方法

//初始化
public convenience init(item: UIDynamicItem, attachedToAnchor point: CGPoint)

public init(item: UIDynamicItem, offsetFromCenter offset: UIOffset, attachedToAnchor point: CGPoint)

public convenience init(item item1: UIDynamicItem, attachedTo item2: UIDynamicItem)

public init(item item1: UIDynamicItem, offsetFromCenter offset1: UIOffset, attachedTo item2: UIDynamicItem, offsetFromCenter offset2: UIOffset)

如何創建

let attach = UIAttachmentBehavior.init(item: collidingView, attachedTo: square)
animator.addBehavior(attach)

UISnapBehavior

吸附在錨點進行震蕩,震蕩行為定義了一個動態運動,達到指定點后實現震蕩效果,震蕩的數量是可以設置的。

屬性 類型 釋義
damping CGFloat 震蕩數量
snapPoint CGPoint 吸附點

常用方法

//item 吸附元素  point吸附在哪里
public init(item: UIDynamicItem, snapTo point: CGPoint)

如何創建

var snap: UISnapBehavior!

//item 吸附元素  snapTo吸附在哪里
snap = UISnapBehavior.init(item: square, snapTo: touch.location(in:view))
animator.addBehavior(snap)

UIPushBehavior

給一個Item持續或者瞬間的推力

屬性 類型 釋義
mode UIPushBehaviorMode 推力的類型 瞬間還是持續
active Bool 狀態
angle CGFloat 力的角度
magnitude CGFloat 推力大小
pushDirection CGVector 推力方向

常用方法

//items 元素  mode 類型 瞬間 持續
public init(items: [UIDynamicItem], mode: UIPushBehaviorMode)

如何創建

var push = UIPushBehavior()

push = UIPushBehavior.init(items: [square], mode: .instantaneous)
push.angle = 0.1;
push.magnitude = 20;
animator.addBehavior(push)

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容

  • 本文中所有代碼演示均有GitHub源碼,點擊下載 UIDynamic簡介 簡介:UIKit動力學最大的特點是將現實...
    si1ence閱讀 10,287評論 8 79
  • iOS 7增加了UIKit Dynamics庫,其集成于UIKit框架中,將2D物理引擎引入了UIKit,提供了以...
    pro648閱讀 2,859評論 2 14
  • 簡介 什么是UIDynamic UIDynamic是從iOS 7開始引入的一種新技術,隸屬于UIKit框架 可以認...
    JonesCxy閱讀 210評論 0 1
  • 第八章 愛情,你有沒有見過它全部的樣子? 最近的橙子小姐和向陽先生就好像泡在了蜂蜜里面,每天臉上都掛著甜死人不...
    南橘愛北枳閱讀 502評論 0 21
  • 家賦予生命的母體不不求回報只求平安你一直在無償索取索取屬于你的生命標簽索取屬于你的家庭幸福索取屬于你的祝福牽掛但是...
    戀上時光橋閱讀 141評論 0 0