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)