iOS 7 簡介
本文涵蓋 iOS 7 中引進的主要新 API,包括檢視控制器轉換、UIView 動畫、UIKit Dynamics 和 Text Kit 的增強功能。 它也涵蓋使用者介面的一些變更,以及新的迷人的多任務功能。
iOS 7 是 iOS 的主要更新。 它引進了全新的使用者介面設計,將焦點放在內容上,而不是應用程式 Chrome。 除了視覺效果變更之外,iOS 7 還新增了大量新的 API,以建立更豐富的互動和體驗。 本文件會調查 iOS 7 引進的新技術,並作為進一步探索的起點。
UIView 動畫增強功能
iOS 7 可增強UIKit中的動畫支援,讓應用程式執行先前需要直接卸除至Core Animation架構的動作。 例如, UIView
現在可以執行 spring 動畫以及主要畫面格動畫,而主要畫面格動畫先前 CAKeyframeAnimation
已套用至 CALayer
。
Spring 動畫
UIView
現在支援使用彈簧效果建立屬性變更的動畫效果。 若要新增這項功能,請呼叫 AnimateNotify
或 AnimateNotifyAsync
方法,並傳入 spring 阻尼比率和初始彈簧速度的值,如下所述:
springWithDampingRatio
– 介於 0 到 1 之間的值,其中振蕩增加較小的值。initialSpringVelocity
– 初始春季速度,以每秒動畫總距離的百分比表示。
下列程序代碼會在影像檢視的中心變更時產生春季效果:
void AnimateWithSpring ()
{
float springDampingRatio = 0.25f;
float initialSpringVelocity = 1.0f;
UIView.AnimateNotify (3.0, 0.0, springDampingRatio, initialSpringVelocity, 0, () => {
imageView.Center = new CGPoint (imageView.Center.X, 400);
}, null);
}
這個春季效果會導致影像檢視在完成動畫到新的中心位置時出現反彈,如下所示:
主要畫面格動畫
類別 UIView
現在包含 AnimateWithKeyframes
在上 UIView
建立主要畫面格動畫的方法。 這個方法與其他 UIView
動畫方法類似,不同之處在於其他 NSAction
方法會傳遞為參數以包含主要畫面格。 在 中 NSAction
,會藉由呼叫 UIView.AddKeyframeWithRelativeStartTime
來新增主要畫面格。
例如,下列代碼段會建立主要畫面格動畫,以建立檢視中心動畫,以及旋轉檢視:
void AnimateViewWithKeyframes ()
{
var initialTransform = imageView.Transform;
var initialCeneter = imageView.Center;
// can now use keyframes directly on UIView without needing to drop directly into Core Animation
UIView.AnimateKeyframes (2.0, 0, UIViewKeyframeAnimationOptions.Autoreverse, () => {
UIView.AddKeyframeWithRelativeStartTime (0.0, 0.5, () => {
imageView.Center = new CGPoint (200, 200);
});
UIView.AddKeyframeWithRelativeStartTime (0.5, 0.5, () => {
imageView.Transform = CGAffineTransform.MakeRotation ((float)Math.PI / 2);
});
}, (finished) => {
imageView.Center = initialCeneter;
imageView.Transform = initialTransform;
AnimateWithSpring ();
});
}
方法的前兩個參數 AddKeyframeWithRelativeStartTime
分別將主要畫面格的開始時間和持續時間指定為整體動畫長度的百分比。 上述範例會讓影像檢視在第一秒以動畫顯示到新中心,接著在下一秒旋轉 90 度。 由於動畫會 UIViewKeyframeAnimationOptions.Autoreverse
指定為選項,因此兩個主要畫面格也會反向產生動畫效果。 最後,最終值會設定為完成處理程式中的初始狀態。
下列螢幕快照說明透過主要畫面格合併的動畫:
UIKit Dynamics
UIKit Dynamics 是 UIKit 中一組新的 API,可讓應用程式根據物理建立動畫互動。 UIKit Dynamics 會封裝 2D 物理引擎,讓這成為可能。
API 本質上是宣告式。 您可以宣告物理互動的運作方式,方法是建立物件 -- 稱為 行為 - 以表達物理概念,例如重力、碰撞、彈簧等。然後,您會將行為附加至另一個 物件,稱為動態動畫工具,其會封裝檢視。 動態動畫工具會負責將宣告的物理行為套用至動態專案 - IUIDynamicItem
實作 的專案,例如 UIView
。
有數種不同的基本行為可用來觸發複雜的互動,包括:
UIAttachmentBehavior
– 附加兩個動態專案,讓它們一起移動,或將動態專案附加至附件點。UICollisionBehavior
– 允許動態項目參與衝突。UIDynamicItemBehavior
– 指定要套用至動態專案的一般屬性集,例如彈性、密度和摩擦。UIGravityBehavior
- 將重力套用至動態專案,導致專案在引力方向加速。UIPushBehavior
– 強制套用至動態專案。UISnapBehavior
– 允許動態專案貼齊具有彈簧效果的位置。
雖然有許多基本類型,但使用UIKit Dynamics將物理型互動新增至檢視的一般程式在行為上是一致的:
- 建立動態動畫工具。
- 建立行為(s)。
- 將行為新增至動態動畫工具。
Dynamics 範例
讓我們看看將重力和碰撞界限新增至 的 UIView
範例。
UIGravityBehavior
將重力新增至影像檢視會遵循上述的 3 個步驟。
在此範例中 ViewDidLoad
,我們將使用 方法。 首先,新增 UIImageView
實例,如下所示:
image = UIImage.FromFile ("monkeys.jpg");
imageView = new UIImageView (new CGRect (new CGPoint (View.Center.X - image.Size.Width / 2, 0), image.Size)) {
Image = image
}
View.AddSubview (imageView);
這會建立位於畫面上邊緣的影像檢視。 若要讓影像以重力「下降」,請建立 的 UIDynamicAnimator
實例:
dynAnimator = new UIDynamicAnimator (this.View);
會 UIDynamicAnimator
採用參考 UIView
或 UICollectionViewLayout
的實例,其中包含會根據附加行為產生動畫效果的專案。
接下來,建立 UIGravityBehavior
實例。 您可以傳遞一或多個實作 IUIDynamicItem
的物件,例如 UIView
:
var gravity = new UIGravityBehavior (dynItems);
行為會傳遞 的 IUIDynamicItem
陣列,在此案例中會包含我們正在建立動畫的單一 UIImageView
實例。
最後,將行為新增至動態動畫:
dynAnimator.AddBehavior (gravity);
這會導致影像以重力向下動畫,如下所示:
由於沒有任何限制螢幕界限,因此影像檢視只會落在底部。 若要限制檢視,讓影像與螢幕邊緣相撞,我們可以新增 UICollisionBehavior
。 我們將在下一節中討論這一點。
UICollisionBehavior
我們一開始會建立 UICollisionBehavior
,並將其新增至動態動畫工具,就像我們對 所做的一 UIGravityBehavior
樣。
修改程式代碼以包含 UICollisionBehavior
:
using (image = UIImage.FromFile ("monkeys.jpg")) {
imageView = new UIImageView (new CGRect (new CGPoint (View.Center.X - image.Size.Width / 2, 0), image.Size)) {
Image = image
};
View.AddSubview (imageView);
// 1. create the dynamic animator
dynAnimator = new UIDynamicAnimator (this.View);
// 2. create behavior(s)
var gravity = new UIGravityBehavior (imageView);
var collision = new UICollisionBehavior (imageView) {
TranslatesReferenceBoundsIntoBoundary = true
};
// 3. add behaviors(s) to the dynamic animator
dynAnimator.AddBehaviors (gravity, collision);
}
UICollisionBehavior
具有稱為TranslatesReferenceBoundsIntoBoundry
的屬性。 將此設定為 true
會導致參考檢視的界限當做衝突界限使用。
現在,當影像以重力向下動畫時,它會稍微從螢幕底部反彈,然後再安頓下來。
UIDynamicItemBehavior
我們可以使用其他行為進一步控制下降影像檢視的行為。 例如,我們可以新增 UIDynamicItemBehavior
來增加彈性,導致影像檢視在與螢幕底部相撞時反彈更多。
UIDynamicItemBehavior
新增 會遵循與其他行為相同的步驟。 首先建立行為:
var dynBehavior = new UIDynamicItemBehavior (dynItems) {
Elasticity = 0.7f
};
然後,將行為新增至動態動畫:
dynAnimator.AddBehavior (dynBehavior);
當影像檢視與界限相撞時,此行為就已就緒,會反彈更多。
一般使用者介面變更
除了UIKit Dynamics、控制器轉換和上述增強UIView動畫等新的UIKit API之外,iOS 7 還對UI引進了各種視覺變更,以及各種檢視和控件的相關 API 變更。 如需詳細資訊, 請參閱 iOS 7 使用者介面概觀。
Text Kit
Text Kit 是新的 API,可提供功能強大的文字版面配置和轉譯功能。 它是建置在低階核心文字架構之上,但比核心文字更容易使用。
多工
iOS 7 會變更背景工作的執行時機和方式。 iOS 7 中的工作完成不再讓應用程式在背景中執行時保持醒目,而應用程式會以非連續方式喚醒背景處理。 iOS 7 也會新增三個新的 API,以在背景中使用新內容更新應用程式:
- 背景擷取 – 允許應用程式定期更新背景中的內容。
- 遠端通知 - 允許應用程式在收到推播通知時更新內容。 通知可以是無訊息的,或可以在鎖定畫面上顯示橫幅。
- 背景傳輸服務 – 允許上傳和下載數據,例如大型檔案,而沒有固定的時間限制。
如需有關新多任務功能的詳細資訊,請參閱 Xamarin Backgrounding 指南的 iOS 小節。
摘要
本文涵蓋 iOS 的數個主要新增專案。 首先,它會示範如何將自定義轉換新增至檢視控制器。 然後,它會示範如何在集合檢視中使用轉換,無論是在流覽控制器內,還是以互動方式在集合檢視之間。 接下來,它引進了幾個UIView動畫的增強功能,顯示應用程式如何使用UIKit來直接針對Core Animation進行程序設計。 最後,新的UIKit Dynamics API會將物理引擎帶入UIKit,並隨著文字套件架構中現在提供的 RTF 支援一起推出。