UIView 類別
定義
重要
部分資訊涉及發行前產品,在發行之前可能會有大幅修改。 Microsoft 對此處提供的資訊,不做任何明確或隱含的瑕疵擔保。
基類,用於想要自行轉譯和回應事件的元件。
[Foundation.Register("UIView", true)]
public class UIView : UIKit.UIResponder, CoreAnimation.ICALayerDelegate, Foundation.INSCoding, IDisposable, System.Collections.IEnumerable, UIKit.IUIAccessibilityIdentification, UIKit.IUIAppearance, UIKit.IUIAppearanceContainer, UIKit.IUICoordinateSpace, UIKit.IUIDynamicItem, UIKit.IUIFocusItem, UIKit.IUIFocusItemContainer, UIKit.IUITraitEnvironment
type UIView = class
inherit UIResponder
interface IEnumerable
interface INSCoding
interface INativeObject
interface IDisposable
interface IUIAccessibilityIdentification
interface IUIAppearance
interface IUIAppearanceContainer
interface IUICoordinateSpace
interface IUIDynamicItem
interface IUIFocusEnvironment
interface IUIFocusItem
interface IUIFocusItemContainer
interface IUITraitEnvironment
interface ICALayerDelegate
- 繼承
- 衍生
- 屬性
- 實作
備註
UIView 類別是螢幕上的矩形區域,負責顯示內容及處理與該內容的互動。 它也可以包含其他檢視,讓開發人員能夠建立複雜的互動式控制項。 因此,UIView 可以做為獨立控制項,或是從許多其他獨立 UIView 建置的全螢幕內容。
檢視有三個主要責任:
- 視覺效果:UIView 實例負責顯示其內容,通常是使用、OpenGL 或自訂某些視覺效果屬性來實作繪製方法。 檢視也有內建支援以動畫顯示檢視的元素。
- 管理版面配置和子檢視:UIView 負責管理其版面配置,以回應大小和方向的變更。 這包括重新繪製他們管理的任何內容,以及重新置放子檢視。 這通常是為了回應 UIView 的大小。 例如,如果檢視代表按鈕,角落的位置會根據大小而變更。 或者,如果裝置已旋轉,則檢視可能會 (調整大小,或可能會調整其子檢視的大小) 。
- 事件處理:UIView 是處理觸控事件的自然位置,因為它們是獨立的使用者介面元素。 UIViews 子類別 UIResponder ,因此它們同時參與系統事件 (,例如動作和動作) ,以及能夠處理觸控事件。
事件處理
UIViews 可以透過兩種方式處理觸控事件。 開發人員會使用高階手勢辨識器 API 來偵測及處理手勢,或使用低階介面來偵測及處理自己的事件,以在發生時提供詳細的觸控事件:每次手指觸碰螢幕或隨即移動,以及這些手指的動作。 以下涵蓋這兩者
為了讓 UIView 藉由更新其顯示來回應使用者輸入,開發人員應該呼叫 SetNeedsDisplayInRect(CGRect) 或 SetNeedsDisplayInRect(CGRect) ,將呼叫排入開發人員 Draw(CGRect) 方法的佇列,其中開發人員已實作邏輯以新的狀態重新轉譯控制項。
事件傳遞可以藉由將 設定 UserInteractionEnabled 為 false 來關閉,或者您可以呼叫 BeginIgnoringInteractionEvents() 來暫時停用應用層級的事件傳遞。 在這兩種情況下,目的地為檢視的事件都會卸載,而且不會傳遞至檢視。
動畫播放時會停用事件。 開發人員可以使用動畫中的 AllowUserInteraction 旗標,在使用明確動畫 UIViewAnimationOptions 時變更此行為。
使用手勢辨識器處理事件
與觸控介面互動會導致一系列常見的手勢慣用語,這些慣用語會隨處使用。 手勢,例如撥動、移動流覽、長按、捏合旋轉和點選。 iOS 提供手勢辨識器,讓偵測這些常見手勢慣用語的程式變得非常簡單。 這些是繼承自 UIGestureRecognizer 類別的物件,而且可以偵測各種標準手勢慣用語。 內建辨識器包括:
- UILongPressGestureRecognizer
- UIPanGestureRecognizer
- UIPinchGestureRecognizer
- UIRotationGestureRecognizer
- UISwipeGestureRecognizer
- UITapGestureRecognizer
此外,開發人員可以藉由子類別化 UIGestureRecognizer 來建立自己的自訂手勢辨識器。
開發人員藉由建立所需的特定辨識器實例、選擇性地設定某些參數,並藉由呼叫 AddGestureRecognizer 將其新增至檢視,以使用辨識器。 可以將多個手勢辨識器附加至單一檢視。
例如,下列程式碼會建立手勢辨識器,以偵測移動流覽手勢,並將它指派給 myView:
var recognizer = new UIPanGestureRecognizer ((g) => {
Console.WriteLine ("Panning detected");
Console.WriteLine ("Gesture recognizer state: {0}", g.State);
});
myView.AddGestureRecognizer (recognizer);
傳遞至 Lambda 的參數 (上述程式碼中的 「g」 參數) 是偵測到手勢的手勢辨識器實例。 開發者可以藉由查看辨識器中的屬性來查詢已辨識查詢的參數; State 屬性包含辨識器狀態。
使用方法覆寫處理事件
雖然手勢辨識器提供高階且方便的方式來擷取許多觸控事件,但不會涵蓋每個可能性。 在這些情況下,開發人員應該子類別 UIView,並覆寫繼承自 UIResponder 的下列一或多個方法:
- TouchesBegan(NSSet, UIEvent):當一或多個手指觸碰螢幕時傳送。
- TouchesMoved(NSSet, UIEvent):當一或多個手指移動時傳送。
- TouchesEnded(NSSet, UIEvent):當一或多個手指從螢幕隨即隨即轉移時傳送。
- TouchesCancelled(NSSet, UIEvent):當系統取消觸控時傳送 (例如,如果手機中斷您的應用程式) 。
根據預設,UIView 只會一次處理單一觸控事件。 如果您想要讓檢視處理多個觸控,您必須將 MultipleTouchEnabled 設定為 true。
iOS 會在手指觸碰螢幕、移動或從螢幕移除時建立 UIEvent 物件。 會 UIEvent 封裝目前畫面上發生的所有觸控,即使是不屬於此檢視的觸控。 除了 UIEvent 之外,還有 一個 NSSet 包含 UITouch 的物件,代表這個特定檢視螢幕上每個手指的狀態。
如果應用程式直接處理觸控,開發人員可以覆寫 GestureRecognizerShouldBegin(UIGestureRecognizer) 方法來控制相關聯的 UIGestureRecognizer 是否應該執行。
建立檢視表
UIView 通常是藉由叫用建構函式來建立,此建構函式會採用框架作為其參數, (框架的類型 RectangleF 為) ,例如:
var myView = new UIView (new RectangleF (0, 0, 100, 100));
UIView 的大部分子類別都會提供建構函式來接受初始框架,就像 UIView 一樣。 下一節的子類別化 UIView 有如何執行這項操作的詳細資訊。
開發人員應該設定 AutoresizingMask 屬性,以決定叫用 時 SetNeedsLayout() 檢視大小的方式,或檢視容器的幾何變更 (例如,回應裝置旋轉) 。
建立檢視之後,開發人員會將它新增至包含的檢視。 在主畫面上,這可能是 UIWindow,或者可能是 View 目前 UIViewController 的 屬性。 這是使用下列其中一種方法來完成:
- AddSubview(UIView)
- InsertSubview(UIView, nint)
- InsertSubviewAbove(UIView, UIView)
- InsertSubviewBelow(UIView, UIView)
雖然開發人員可以使用上述 API 將子檢視新增至任何 UIView,但 Apple 建議不要藉由將子檢視新增至它們來擴充現有的高階檢視。 相反地,開發人員應該使用公開這些高階檢視的公用 API。
界限和大小
每個檢視都是使用初始 Frame 建立的。 Frame 是結構 RectangleF ,代表檢視的大小和初始位置。 Frame 的座標是用來指定相對於其超級檢視的位置。
您可以使用框架調整大小並移動檢視。 每次設定框架時,檢視都會配置其子檢視。 如果您只是移動檢視,使用畫面可能會造成效能問題,因為它會轉寄檢視及其所有子檢視。
Bounds是檢視的可用框架。 Frame不同于 , Bounds 不會使用容器的座標空間,而是代表檢視本身座標空間的大小。 根據預設, Bounds 位置會 (0,0) 。
當開發人員更新 屬性時 Bounds ,它會根據 的值 Center 修改 Frame 。 開發人員也可以藉由更新 Center 屬性來變更檢視的位置。
當屬性變更時,檢視的大小會相對於 Center 屬性受到影響。
動畫
Apple 建議應用程式開發人員使用 UIViewPropertyAnimator 類別在其物件上 UIView 實作動畫。 Apple 也不建議使用類別上 UIView 的任何其他動畫 API,但尚未被取代。 此外,開發人員可以藉由建立具有自訂屬性的自訂 Layer 檢視,為動畫索引鍵提供動畫動作,來實作部分或所有屬性的隱含動畫。
開發人員可以藉由建立新的 UIViewPropertyAnimator 、設定 UIView 並呼叫其 StartAnimation(Double) 方法,以動畫顯示 UIView 的幾何或外觀變更。 例如,開發人員可以更新動畫 (,藉由在動畫進行時呼叫 AddAnimations(Action, nfloat) 方法來取消動畫) 。 使用 UIKit 配方建立 UIView 的動畫示範如何使用 類別建立取消動畫 UIViewPropertyAnimator 。
或者,開發人員可以呼叫 M:UIKit.UIView.BeginAnimations (字串) 方法來建立動畫、設定動畫、對可動畫屬性進行變更,然後藉由呼叫 CommitAnimations() 來完成交易。
在開發人員呼叫 M:UIKit.UIView.BeginAnimations (字串) 之後,他們可以呼叫下列方法來設定動畫:
- SetAnimationDuration(Double)
- SetAnimationCurve(UIViewAnimationCurve)
- SetAnimationDelay(Double)
- SetAnimationDelegate(NSObject)
- SetAnimationRepeatAutoreverses(Boolean)
- SetAnimationRepeatCount(Single)
- SetAnimationDidStopSelector(Selector)
下列範例示範如何在交易中使用這些方法:
UIView.BeginAnimations (null);
UIView.SetAnimationDuration (5);
UIView.SetAnimationCurve (UIViewAnimationCurve.EaseOut);
view.Bounds = new RectangleF (0, 0, 100, 100);
view.Position = new PointF (200, 200);
UIView.CommitAnimations ();
或者,開發人員可以在方法的 *集合中建立交易和設定設定選項。 這些方法會在單一呼叫中採取延遲、持續時間、動畫區塊,以及動畫完成時要叫用的動作。 不過,Apple 也不建議使用這些 API。 其使用方式如下所示:
UIView.Animate (duration, delay, UIViewAnimationOption.Autoreverse,
delegate {
view.Bounds = new RectangleF (0, 0, 100, 100);
view.Position = new PointF (200, 200);
},
delegate {
Console.WriteLine ("Animation completed");
}
);
上述是 UIView 類別直接支援的一組基本動畫。 為了更精細地控制動畫,開發人員可以使用 API 在其 UI 元素上以動畫顯示內容。 雖然已停用 UIView 預設層的隱含動畫,但開發人員可以擴充 UIView 類別,以建立衍生的 UIView,其中包含正確處理動畫動作索引鍵的 CALayer 衍生。 開發人員應該注意,如果新增子檢視的預設值與最終值不同,新增子檢視時所變更的動畫屬性將會以動畫顯示。 例如,如果擷取並產生動畫效果,「bounds」 和 「position」 索引鍵會導致從畫面的原點產生動畫效果。
為了啟用隱含動畫,開發人員會先建立自訂圖層,為圖層將處理的索引鍵或索引鍵組合提供自訂動畫。 下列自訂圖層範例會針對使用它的自訂檢視,以動畫顯示圓角半徑和透明度:
public class CustomLayer : CALayer
{
public CustomLayer(IntPtr ptr) : base(ptr)
{
}
public override CAAnimation AnimationForKey(string key)
{
CABasicAnimation animation = CABasicAnimation.FromKeyPath(key);
animation.From = this.ValueForKey(new NSString(key));
animation.Duration = 1f;
return animation;
}
override public NSObject ActionForKey(string key)
{
if (key == "cornerRadius" || key == "opacity")
{
return this.AnimationForKey(key);
}
else
{
return base.ActionForKey(key);
}
}
}
然後,開發人員會擴充 UIView,匯出 「layerClass」 選取器,以傳回上面建立之自訂圖層的類別:
public class CustomView : UIView
{
public CustomView(CGRect r) : base(r)
{
}
[Export("layerClass")]
public static ObjCRuntime.Class GetLayerClass()
{
return new ObjCRuntime.Class(typeof(CustomLayer));
}
}
最後,設定屬性時,已變更的屬性會以自訂圖層所指定的動畫屬性產生動畫效果:
fadeAndRound = () =>
{
redView.Layer.CornerRadius = 40;
redView.Alpha = 0.5f;
};
執行緒
UIView 方法不是安全線程。 開發人員應該避免從不是主執行緒的任何執行緒設定或叫用任何 UIView 靜態方法。 較新版本的 MonoTouch 會擲回例外狀況,以攔截偵錯組建中的這些錯誤。 如需詳細資訊,請參閱<CheckForIllegalCrossThreadCalls>一節。
若要在必須更新任何 UIView 屬性的背景執行緒中執行某些工作,或叫用任何 UIView 靜態方法, 開發人員應該使用 :Foundation.NSObject.BeginInvokeOnMainThread () 或 M:Foundation.NSObject.InvokeOnMainThread M:Foundation.NSObject.InvokeOnMainThread () 方法。 這兩種方法都會採用在主執行緒上叫用的 C# 委派或 Lambda。
M:Foundation.NSObject.InvokeOnMainThread () 方法會在主執行緒上同步叫用指定的委派方法。 M:Foundation.NSObject.BeginInvokeOnMainThread () 會將要執行于主執行緒上的動作排入佇列。
範例:
//
// This performs an expensive computation in the background, and then
// updates the main UI when done.
//
void DoSomeWork (UIView view)
{
double sum = 0;
for (int i = 0; i < Int32.MaxValue; i++)
sum += i * i;
// Now invoke the update on the main UI.
view.BeginInvokeOnMainThread (delegate {
view.BackgroundColor = UIColor.Green;
statusLabel.Text = "Sum is: " + sum;
});
}
下列範例示範可用來在主執行緒上執行所提供動作的協助程式方法。 它已針對從主執行緒呼叫優化,並避免前往主要迴圈幫浦:
static NSObject Invoker = new NSObject();
public static void EnsureInvokedOnMainThread (Action action)
{
if (NSThread.Current.IsMainThread) {
action ();
return;
}
Invoker.BeginInvokeOnMainThread (() => action());
}
如何子類別 UIView
開發人員通常會使用子類別 UIView 來提供自己的自訂檢視。 本節討論開發人員要覆寫以建立自訂類別的不同成員類別。
初始化
UIView 的子類別應該鏈結至使用初始框架初始化的 UIView 建構函式, ( ) C:UIKit.UIView (System.Drawing.RectangleF) ) 。 下列程式碼示範執行此動作的其中一種方式:
public class MyView : UIView {
public MyView (RectangleF frame) : base (frame)
{
// Your initialization code goes here
}
}
在將從 UI 設計工具所產生的封存還原序列化的物件中,開發人員必須鏈結至 C:UIKit.UIView (Foundation.NSCoder) 建構函式,並將建構函式標記為實作選取器 「initWithCoder:」 的建構函式,如下列程式碼所示:
public class MyView : UIView {
[Export ("initWithCoder:")]
public MyView (NSCoder coder) : base (coder)
{
// Your initialization code goes here
}
}
根據預設,UIViews 會針對其備份存放區使用 CALayer 實例。 下方「變更 CALayer」一節包含如何進行這項變更和範例的資訊。
開發人員應該在父檢視的建構函式中初始化子檢視。
自訂繪圖
若要在檢視中實作自訂繪圖程式碼,開發人員可以將 UIView 子類別化並覆寫 Draw(CGRect) 方法。 在 Draw 方法中放置的繪圖程式碼可以使用 CoreGraphics繪製。 使用核心圖形繪製的步驟如下:
- 取得目前圖形內容的參考。
- 設定任何所需的繪圖屬性,例如填滿和筆劃色彩。
- 從核心圖形基本類型建立幾何。
- 繪製幾何。
例如,下列程式碼顯示繪製三角形的覆寫 Draw 方法實作:
public override void Draw (RectangleF rect)
{
base.Draw (rect);
var context = UIGraphics.GetCurrentContext ();
context.SetLineWidth(4);
UIColor.Red.SetFill ();
UIColor.Blue.SetStroke ();
var path = new CGPath ();
path.AddLines(new PointF[]{
new PointF(100,200),
new PointF(160,100),
new PointF(220,200)
});
path.CloseSubpath();
context.AddPath(path);
context.DrawPath(CGPathDrawingMode.FillStroke);
}
開發人員不應該直接呼叫 Draw(CGRect) 。 iOS 會在執行迴圈處理期間呼叫它。 iOS 會第一次透過 run 迴圈呼叫它,然後每當檢視標示為需要顯示時,都會呼叫 SetNeedsDisplayInRect(CGRect) 或 SetNeedsDisplayInRect(CGRect) 。
核心圖形使用裝置獨立點,而不是圖元。 這可讓繪圖程式碼在不同的解析度之間進行縮放。 例如,在 Retina 顯示器上,1 點相當於 2 圖元,而在非 Retina 顯示器上,1 點對應至 1 圖元。
列印
UIView 可以列印。 預設行為是針對要列印的方法所 Draw(CGRect) 呈現的 UIView 內容。
開發人員可以藉由覆 DrawRect(CGRect, UIViewPrintFormatter) 寫 方法,為檢視提供不同的轉譯。
條件約束
若要在子類別檢視中使用以條件約束為基礎的配置系統 i (ntroduced 與 iOS 6.0) ,開發人員必須回應 requiresConstraintBasedLayout 選取器,如下列範例所示:
class MyView : UIView {
[Export ("requiresConstraintBasedLayout")]
bool UseNewLayout ()
{
return true;
}
}
若要使用條件約束來配置檢視的子檢視,開發人員必須覆寫 UpdateConstraints() 方法。 在執行條件約束型配置之前,會呼叫這個方法。
條件約束型配置是在對齊矩形上執行,而不是檢視的 Frame 。 根據預設,對齊矩形會計算為 Frame 所修改的 AlignmentRectInsets 。 開發人員可以藉由覆 AlignmentRectForFrame(CGRect) 寫 和 FrameForAlignmentRect(CGRect) 方法來變更該行為,並提供自訂的對齊矩形。
Layout
UIViews 的預設版面配置系統非常簡單。 UIView 是使用初始 Frame 建立,並 AutoresizingMask 決定如何調整檢視大小,以回應容器界限中的變更。
開發人員應該在初始化之後設定預設 AutoresizingMask 屬性。
對於檢視,將會是其他檢視的容器,開發人員應該設定其 AutoresizingMask 屬性。 如果提供的版面配置行為不足,開發人員應該覆寫 LayoutSubviews() 方法。 這個方法負責更新 Frame 每個子檢視的 屬性。
對於變更其狀態以回應某些 API 呼叫的檢視,開發人員應該呼叫 SetNeedsLayout() ,而不是配置檢視本身。 配置事件接著會在下次執行主要迴圈時進行處理。 藉由使用此方法,develoers 可以在單一階段中聯合多個版面配置變更。
UIViews 可以實作 方法, SizeThatFits(CGSize) 根據檢視的內容回報其所需大小。
開發人員可以覆寫 SubviewAdded(UIView) 和 WillRemoveSubview(UIView) ,以追蹤子檢視新增或移除至 UIView 的時間。
開發人員可以覆寫 WillMoveToWindow(UIWindow) 和 , MovedToWindow() 以追蹤檢視何時從一個檢視移到另一個 UIWindow 檢視。
開發人員可以覆寫 WillMoveToSuperview(UIView) 和 , MovedToSuperview() 以追蹤檢視何時從超級檢視新增或移除。
條件約束型版面配置
iOS 6.0 中已新增以條件約束為基礎的版面配置系統。 此系統不同于傳統的版面配置系統,因為它會使用規則 (條件約束) 來描述應該保留的子檢視之間的關聯性。 當檢視的大小變更 (例如標籤) 或容器的大小變更 (例如,在旋轉) 之後,會根據這些條件約束來計運算元檢視的新位置和大小。
若要加入宣告此系統,UIView 的子類別應該公開匯出為 「requiresConstraintBasedLayout」 的靜態方法,並傳回 true,如下所示:
class MyView : UIView {
[Export ("requiresConstraintBasedLayout")]
static bool RequiresConstraintBasedLayout ()
{
return true;
}
}
事件處理
使用手勢辨識器時,開發人員可以在初始化時直接將這些辨識項新增至建構函式。
若要執行低階觸控事件處理,開發人員會覆寫 TouchesBegan(NSSet, UIEvent) 、 TouchesMoved(NSSet, UIEvent)TouchesEnded(NSSet, UIEvent) 和 TouchesCancelled(NSSet, UIEvent) 方法。
由於 iOS 9.0, TouchesMoved(NSSet, UIEvent) 支援的硬體和設定會針對使用者套用壓力的變更引發事件。 Forceset 引數中 touches
物件的 屬性 UITouch 包含引發事件的觸控程度。 下列範例顯示基本用途:
if (TraitCollection.ForceTouchCapability == UIForceTouchCapability.Available) {
UITouch t = touches.AnyObject as UITouch;
ForceLabel.Text = "Force: " + t.Force.ToString ();
}
else {
ForceLabel.Text = "Force Not Active";
}
如果應用程式開發人員直接覆寫 UIView,就不需要呼叫上述任何方法的基底方法。 但是,它們應該在衍生自另一個 UIView 子類別時呼叫基底。
應用程式開發人員可以藉由覆 GestureRecognizerShouldBegin(UIGestureRecognizer) 寫 方法來控制是否啟用手勢辨識器。
檢視和 CALayers
每個 UIView 都支援 Layer (CALayer) 。 CALayer 代表 GPU 支援的點陣圖,用來將檢視轉譯成畫面。 繪製到 UIView 實際上會繪製到 CALayer 中。
雖然 UIView 的外觀可以藉由設定其 Frame 、 Alpha 、 BackgroundColor 或 覆寫其 Draw(CGRect) 方法來控制,但這些屬性和函式實際上都是修改 CALayer 檢視所擁有的 。
屬性 Layer 是檢視所擁有 CALayer 的參考。 開發人員修改該圖層的屬性,以變更檢視的外觀。
例如,修改 CornerRadius 檢視圖層的 屬性會變更檢視的圓角半徑:
view.Layer.CornerRadius = 4;
開發人員可以新增陰影:
view.Layer.ShadowColor = new CGColor (1, 0, 0);
view.Layer.ShadowOpacity = 1.0f;
view.Layer.ShadowOffset = new SizeF (0, 4);
開發人員也可以將 3D 轉換套用至圖層:
view.Layer.Transform = CATransform3D.MakeRotation ((float)(Math.PI / 2), 1, 1, 1);
此轉換是完整的 3D 轉換,具有檢視方塊元素,且比 UIView 的 2D Transform 屬性更具彈性。 Frame 屬性在這類的 3D 轉換之後不再有用。
變更 CALayer
由檢視擁有的 Layer 會自動建立並指派給 UIKit 的檢視,預設為 CALayer 實例。 您可以在靜態方法中回應 「layerClass」 選取器,來控制為檢視建立的圖層類型。
以下是使用自訂 CALayer 來執行其繪圖之 UIView 子類別的範例。 因此,此圖層和檢視一律會顯示藍色:
public class BlueView : UIView
{
[Export ("layerClass")]
public static Class GetLayerClass ()
{
return new Class (typeof (BlueLayer));
}
public override void Draw (RectangleF rect)
{
// Do nothing, the Layer will do all the drawing
}
}
public class BlueLayer : CALayer
{
public override void DrawInContext (CGContext ctx)
{
ctx.SetFillColor (0, 0, 1, 1);
ctx.FillRect (Bounds);
}
}
在此範例中,會建立名為 「BlueView」 的新 UIView 類別。 它會匯出名為 「GetLayerClass」 的靜態方法,告知 UIKit 此檢視想要擁有的圖層類型。 在此範例中,BlueView 希望擁有 BlueLayer。
現在由 BlueLayer 提供檢視的視覺表示。 它會藉由在其 方法中 DrawInContext(CGContext) 執行 CoreGraphics 繪製程式碼來執行這項作業。 這個方法與 UIView 的 Draw 方法非常類似,但用來填滿圖層。
即使 BlueLayer 會執行 BlueView 的所有繪圖,檢視仍必須覆寫其 Draw 方法。 此覆寫應該不會執行任何動作,而且只是 UIKit 的訊號,表示 Layer 會執行所有工作。
動作效果
動作效果是一系列效果,可套用至 UIView 以回應外來事件,通常是裝置傾斜。
開發人員可以系結至動作效果,這些屬性已經可產生動畫效果。 UIKit 隨附 UIInterpolatingMotionEffect 于 ,可控制單一屬性以回應裝置傾斜。
在開發人員建立效果之後,他們會藉由呼叫 方法將 AddMotionEffect(UIMotionEffect) 它附加至檢視,並藉由呼叫 RemoveMotionEffect(UIMotionEffect) 方法加以移除。 屬性 MotionEffects 也可以用來一次查詢或設定一些動作效果。
開發人員也可以藉由子類別化 UIMotionEffect 來建立自訂動作效果。
色調色彩
從 iOS 7 開始, TintColor 屬性現在會傳播至子檢視。 這可讓開發人員設定全域色調色彩,並將色彩向下傳遞至重要檢視的子檢視。 某些 UIView 會根據 TintColor 特別回應。 當某些檢視不再使用時,開發人員也應該將 設定 TintAdjustmentMode 為控制還原功能。
檢視階層
iOS 使用者介面是從階層建置 UIView 的。 父子式關聯性不僅會決定 UI 的視覺層面,還會決定應用程式如何回應觸控事件和方向變更。
檢視關聯性可以透過程式設計方式或透過 XIB 檔案來建置。 UIView可能有許多 Subviews ,但只有一個 Superview 。
新增子檢視最常見的方式是使用 AddSubview(UIView) ,它會將子檢視附加至 的清單 Subviews 。 插入期間排序的更精確控制,可以使用 、 InsertSubviewAbove(UIView, UIView) 和 InsertSubviewBelow(UIView, UIView) 方法來完成 InsertSubview(UIView, nint) 。
Subviews的順序可以使用 、 SendSubviewToBack(UIView) 和 ExchangeSubview(nint, nint) 方法操作 BringSubviewToFront(UIView) 。
焦點
在便攜 iOS 裝置上,使用者會直接與螢幕物件互動。 在 tvOS 上,遠端可用來流覽螢幕上的專案,而且只有一個 UIView 具有「焦點」。 焦點相關 API 包括:
- CanBecomeFocused
true
UIView如果 可能會成為焦點檢視,則為 。 (請參閱以下關于其他需求的討論。) - DidUpdateFocus(UIFocusUpdateContext, UIFocusAnimationCoordinator) 在 遺失或收到焦點之後 UIView 呼叫。 (另請參閱 ShouldUpdateFocus(UIFocusUpdateContext))。
- FocusedUIView是否為焦點檢視。
- PreferredFocusedView 傳 UIView 回應該實際專注的 。 (例如,子 UIView .)
- SetNeedsFocusUpdate() 當這是作用中的焦點環境時,會要求焦點更新,這可能會變更 PreferredFocusedView 。 (另請參閱 UpdateFocusIfNeeded())。
- ShouldUpdateFocus(UIFocusUpdateContext) 在失去或接收焦點之前 UIView 呼叫。 如果任一個焦點環境傳
false
回 ,則會取消焦點更新。 - UpdateFocusIfNeeded() 如果有任何焦點環境有擱置的更新,這個方法會強制立即更新焦點。 不同于 SetNeedsFocusUpdate() ,不論此方法目前是否包含焦點,都可以由任何 UIView 呼叫。
除了 CanBecomeFocused 傳回 , UIView 若要將 焦點放在 中,它必須具有 Hidden 的值 、 UserInteractionEnabled 值 false
true
、大於 0 的值,而且不能被另一 Alpha 個 UIView 遮 true
蔽。
建構函式
UIView() |
預設建構函式,這個建構函式會初始化這個類別的新實例,不含任何參數。 |
UIView(CGRect) |
使用指定的框架初始化 UIView。 |
UIView(IntPtr) |
建立 Unmanaged 物件的 Managed 標記法時所使用的建構函式;由執行時間呼叫。 |
UIView(NSCoder) |
從儲存在 unarchiver 物件中的資料初始化 物件的建構函式。 |
UIView(NSObjectFlag) |
呼叫衍生類別的建構函式,以略過初始化,並只配置 物件。 |
屬性
方法
事件
AnimationWillEnd |
當動畫結束時,就會引發此事件。 |
AnimationWillStart |
當動畫開始時,就會引發此事件。 |