你好,歡迎來到IOS教程網

 Ios教程網 >> IOS編程開發 >> IOS開發基礎 >> iOS 9 學習系列:UIKit Dynamics

iOS 9 學習系列:UIKit Dynamics

編輯:IOS開發基礎

UIKit Dynamics 在 iOS 7 中首次被介紹的,可以讓開發者通過簡單的方式,給應用界面添加模擬物理世界的交互動畫。iOS 9 中又加入了一些大的改進,我們將在本文中查看一些。

Non-Rectangular Collision Bounds

在 iOS 9 之前,UIKitDynamics 的 collision bounds 只能是長方形。這讓一些並非是完美的長方形的碰撞效果看起來有些古怪。iOS 9 中支持三種 collision bounds 分別是 Rectangle(長方形), Ellipse(橢圓形) 和 Path(路徑)。Path 可以是任意路徑,只要是逆時針的,並且不是交叉在一起的。一個警告是,path 必須是凸面的不能使凹面的。

為了提供一個自定義的collision bounds ,你可以子定義一個 UIView 的子類。

blob.png

如果你有個自定義的視圖有一個自定義的bounds,你同樣可以這麼做。

UIFieldBehavior

在 iOS 9 之前,只有一種 gravity behaviour(重力感應)類型的 behaviour。開發者也無法擴展或者自定義其他類型。

現在,UIKit Dynamics 包含了更多的 behaviours.

  • Linear Gravity

  • Radial Gravity

  • Noise

  • Custom

這些 behaviours 都有一些屬性可以用來設置不同的效果,並且可以簡單的添加和使用。

Building a UIFieldBehavior & Non-Rectangular Collision Bounds Example

我們來用創建一個例子,把這兩個特性都融合進來。它有幾個視圖(一個橢圓和一個正方形)添加了一些碰撞邏輯和一些噪音的 UIFieldBehavior。

1.jpg

要使用 UIKit Dynamics,首先要創建一個 UIDynamicAnimator。在 viewDidLoad方法中,為你的變量創建一個引用。

blob.png

現在你需要添加一些視圖,他們將會動起來。

blob.png

這是我們給view 添加的兩個基本的behaviors。

blob.png

第一個 behaviors, 我們添加了一個重力感應模型。

blob.png

接下來我們添加了一個 UIFieldBehavior。使用noiseFieldWithSmoothness方法進行了初始化。我們把方形和橢圓形添加到了behavior中,然後給 animator 添加了 field behavior。

blob.png

我們接著創建了一個 UICollisionBehavior。這會阻止兩個元素在碰撞時疊加,並增加了物理模型的動畫效果。我們使用setTranslatesReferenceBoundsIntoBoundaryWithInsets,給視圖添加了一個邊緣的設置。如果不設置這個盒子的話,剛才的重力感應動畫會把方形和橢圓形的視圖掉進屏幕以下,而回不來。(我們就看不到碰撞了)

說到重力感應,我們需要確保他的方向始終是朝下的,也就是實際的物理世界中的方向。為了做到這點,我們需要使用 CoreMotion framework。創建一個CMMotionManager 變量。

blob.png

我們設置一個變量作為類的屬性,是因為我們始終需要用到它。否則的話,CMMotionManager 會因為被釋放掉而無法更新。當我們發現設備的方向發生變化,為們設置重力感應模型的 gravityDirection 屬性來,讓重力的方向始終向下。

blob.png

注意,我們這個例子只支持了 portrait一種模式,如果你希望支持全部的方向的話,你可以自己添加一些計算代碼。

當你打開應用時,你可以看到如下圖一樣的畫面。

2.jpg

方形視圖圍繞著橢圓移動,但你無法看出什麼門道。WWDC的session 229,介紹了一個方法,可以可視化的看到動畫的效果。你需要添加一個橋接頭(如果是用swift寫的項目),添加以下代碼。

blob.png

這會暴露一些私有 API,讓UIDynamicAnimator 把debug模式打開。這能讓你觀察到空間扭曲的情況。在ViewController 類中,把 animator 的 debugEnable 屬性設置為 true。

blob.png

現在,當你打開應用時,你就能夠看到 UIFieldBehavior 提供的空間扭曲了。

3.jpg

你同樣能夠看到視圖碰撞時,圍繞在方形和圓形上的的輪廓線。你還可以添加另外一些屬性,他們並非 API 的標注屬性,但是可以在lldb中使用。比如 debugInterval 和 debugAnimationSpeed ,當你需要debug你的動畫時,他們會非常有幫助。

我們可以看到field 起了作用,可以清楚的看到碰撞的效果。如果我們想tweak更多屬性。我們可以給對象設置具體的數值。然後重啟應用看看他的變化。我們給頁面添加三個UISlider 控制組件。分別控制力量,平滑度和速度。力量的組件數值范圍在0-25,其他兩個都是0-1。

4.jpg

當你在Interface Builder中創建好,拖拽三個動作事件到ViewController類。,然後按下面設置,更新他們的屬性。

blob.png

現在,運行應用。你可以通過控制條來設置屬性的具體值,以觀察動畫的實際效果。

5.jpg

希望這些能夠讓你快速理解 UIKit Dynamics 裡UIFieldBehavior 和 ?non-rectangular ?collision bounds APIs 是怎麼工作和 debug 的。我推薦你在真實的設備(而不是模擬器)中查看效果,否則你看不出 motion 所帶來的效果變化。

延伸閱讀

想要了解更多關於 UIKit Dynamics 的新特性,請浏覽 WWDC 2015 的 session 229 What’s New in UIKit Dynamics and Visual Effects。另外,並忘了我們的 demo 項目文件可以在 Github 上找到。


  1. 上一頁:
  2. 下一頁:
蘋果刷機越獄教程| IOS教程問題解答| IOS技巧綜合| IOS7技巧| IOS8教程
Copyright © Ios教程網 All Rights Reserved