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 类,因此它们同时参与系统事件 ((如运动和操作) )以及能够处理触摸事件。
事件处理
UIView 可以通过两种方式处理触摸事件。 开发人员使用高级手势识别器 API 来检测和处理手势,或者通过使用低级别界面来滚动自己的事件处理,该界面在发生时提供详细的触摸事件:每次手指触摸屏幕或抬起时,以及这些手指的运动。 下面介绍了两者
若要使 UIView 通过更新其显示来响应用户输入,开发人员应调用 SetNeedsDisplayInRect(CGRect) 或 SetNeedsDisplayInRect(CGRect) ,这将对开发人员方法的 Draw(CGRect) 调用排队,开发人员在其中实现了逻辑以使用新状态重新呈现控件。
可以通过将 设置为 UserInteractionEnabled false 来关闭事件传递,也可以通过调用 BeginIgnoringInteractionEvents()在应用程序级别暂时禁用它们。 在这两种情况下,目标为视图的事件将被删除,并且不会传递到视图。
播放动画时禁用事件。 开发人员可以在使用显式动画时更改此行为,方法是在 UIViewAnimationOptions动画中使用 的 AllowUserInteraction 标志。
使用手势识别器处理事件
与触摸界面交互导致一系列常见的手势成语,这些习惯用语随处可见。 轻扫、平移、长按、捏旋转和点击等手势。 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() 如何调整大小 (,例如,) 响应设备旋转。
创建视图后,开发人员将其添加到包含视图。 在main屏幕上,这可能是 UIWindow,也可以是View当前 UIViewController的 属性。 这是使用以下方法之一完成的:
- AddSubview(UIView)
- InsertSubview(UIView, nint)
- InsertSubviewAbove(UIView, UIView)
- InsertSubviewBelow(UIView, UIView)
尽管开发人员可以使用上述 API 将子视图添加到任何 UIView,但 Apple 建议不要通过向高级视图添加子视图来扩展现有高级视图。 相反,开发人员应使用公共 API,这些高级视图公开。
边界和大小
使用初始 Frame创建每个视图。 Frame 是一个 RectangleF 结构,表示视图的大小和初始位置。 Frame 的坐标用于指定相对于其超视图的位置。
可以使用框架调整视图大小并四处移动视图。 每次设置框架时,视图都会布局其子视图。 如果只是移动视图,则使用帧可能会导致性能问题,因为它会中继视图及其所有子视图。
Bounds是视图的可用框架。 与 不同,FrameBounds不使用容器的坐标空间,而是表示视图自己的坐标空间中的大小。 默认情况下,位置 Bounds (0,0) 。
当开发人员更新 属性时Bounds,它将根据 的值Center修改 Frame 。 开发人员还可以通过更新 Center 属性来更改视图的位置。
当 P:UIKit.UIView.Bound 属性发生更改时,视图的大小将相对于 属性 Center 受到影响。
动画
Apple 建议应用开发人员使用 UIViewPropertyAnimator 类在其 UIView 对象上实现动画。 Apple 也不鼓励类上 UIView 的任何其他动画 API,但尚未弃用。 此外,开发人员可以通过创建具有为动画键提供动画操作的自定义属性的自定义 Layer 视图,为部分或所有属性实现隐式动画。
开发人员可以通过创建新的 UIViewPropertyAnimator、配置 UIView 并调用其 StartAnimation(Double) 方法,对 UIView 的几何图形或外观更改进行动画处理。 例如,开发人员可以更新动画 (,以便在动画正在进行时调用 AddAnimations(Action, nfloat) 方法来取消动画) 。 使用 UIKit 对 UIView 进行动画处理说明如何使用 类创建取消动画UIViewPropertyAnimator。
或者,开发人员可以通过调用 M:UIKit.UIView.BeginAnimations (string) 方法创建动画,配置动画,对可动画属性进行更改,然后通过调用 CommitAnimations()完成事务。
在开发人员调用 M:UIKit.UIView.BeginAnimations (string) 之后,他们可以调用以下方法来配置动画:
- 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 类直接支持的一组基本动画。 为了更好地控制动画,开发人员可以使用 N:CoreAnimation API 对其 UI 元素上的属性进行动画处理。 虽然为 UIView 的默认层禁用了隐式动画,但开发人员可以扩展 UIView 类以创建包含正确处理动画操作键的派生的 CALayer UIView。 开发人员应注意,如果在添加子视图时更改的动画属性的默认值与最终值不同,则会在添加期间对其进行动画处理。 例如,“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 方法不是线程安全的。 开发人员应避免从非main线程的任何线程配置或调用任何 UIView 静态方法。 较新版本的 MonoTouch 通过引发异常在调试版本中捕获这些错误。 有关详细信息,请参阅CheckForIllegalCrossThreadCalls。
若要在必须更新任何 UIView 属性或调用任何 UIView 静态方法的后台线程中执行某些工作, 开发人员应使用 M:Foundation.NSObject.BeginInvokeOnMainThread () 或 M:Foundation.NSObject.InvokeOnMainThread () 方法。 这两种方法都采用在main线程上调用的 C# 委托或 lambda。
M:Foundation.NSObject.InvokeOnMainThread () 方法将在main线程上同步调用指定的委托方法。 M:Foundation.NSObject.BeginInvokeOnMainThread () 将排队在main线程上执行的操作。
示例:
//
// 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;
});
}
以下示例演示了一个帮助程序方法,该方法可用于在main线程上运行提供的操作。 它已针对已从main线程调用而优化,并避免了main循环泵的跳动:
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 方法中的绘图代码可以使用 N: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 首先通过运行循环首次调用它,然后在视图被标记为需要时通过调用 SetNeedsDisplayInRect(CGRect) 或 SetNeedsDisplayInRect(CGRect)进行显示。
核心图形使用与设备无关的点,而不是像素。 这样,绘图代码就可以在不同的分辨率之间进行缩放。 例如,在 Retina 显示器上,1 磅相当于 2 像素,而在非 Retina 显示器上,1 磅相当于 1 像素。
打印
可以打印 UIView。 默认行为是打印方法呈现 Draw(CGRect) 的 UIView 内容。
通过重写 DrawRect(CGRect, UIViewPrintFormatter) 方法,开发人员可以在打印视图时为视图提供不同的呈现。
约束
若要在子类视图中使用基于约束的布局系统 i (ntroduced with iOS 6.0) ,开发人员必须响应 requiresConstraintBasedLayout 选择器,如以下示例所示:
class MyView : UIView {
[Export ("requiresConstraintBasedLayout")]
bool UseNewLayout ()
{
return true;
}
}
若要使用约束来布局视图的子视图,开发人员必须重写 UpdateConstraints() 方法。 在执行基于约束的布局之前调用此方法。
基于约束的布局在对齐矩形上执行,而不是在视图的 Frame上执行。 默认情况下,对齐矩形计算为 Frame 由 修改的 AlignmentRectInsets。 开发人员可以通过重写 AlignmentRectForFrame(CGRect) 和 FrameForAlignmentRect(CGRect) 方法来更改该行为并提供自定义对齐矩形。
Layout
UIView 的默认布局系统非常简单。 创建 UIView 时使用初始 Frame 值和 , AutoresizingMask 用于确定如何调整视图的大小,以响应容器边界中的更改。
开发人员应在初始化后设置默认 AutoresizingMask 属性。
对于视图, 将是其他视图的容器,开发人员应配置其 AutoresizingMask 属性。 如果提供的布局行为不够,开发人员应重写 LayoutSubviews() 方法。 此方法负责更新 Frame 每个子视图的 属性。
对于为了响应某些 API 调用而更改其状态的视图,开发人员应调用 SetNeedsLayout(),而不是自行布局视图。 然后在下次运行main循环时处理布局事件。 通过使用此方法,开发程序可以在一次传递中合并对布局的多个更改。
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) 在支持的硬件和配置上引发事件,以更改用户应用的压力。 Force set 参数中 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 子类派生时,它们应调用 base。
应用程序开发人员可以通过重写 GestureRecognizerShouldBegin(UIGestureRecognizer) 方法来控制是否激活手势识别器。
视图和 CALayers
每个 UIView 都由 N:CoreAnimation 层 (CALayer) 提供支持。 CALayer 表示支持 GPU 的位图,该位图用于将视图呈现到屏幕中。 绘制到 UIView 实际上会绘制到 CALayer 中。
虽然可以通过设置 UIView Frame的 、 Alpha、 BackgroundColor或 重写其 Draw(CGRect) 方法来控制 UIView 的外观,但所有这些属性和函数实际上都在修改 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 转换属性更通用。 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 发出信号,指示层将执行所有工作。
动作效果
动作效果是一系列效果,可应用于 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)更精确的控制。
可以使用 、 SendSubviewToBack(UIView)和 ExchangeSubview(nint, nint) 方法操作 BringSubviewToFront(UIView)的Subviews排序。
焦点
在手持 iOS 设备上,用户直接与屏幕对象交互。 在 tvOS 上,遥控器用于在屏幕上的元素中导航,并且只有一个 UIView 具有“焦点”。 与焦点相关的 API 包括:
- CanBecomeFocused
true
UIView如果 可能成为焦点视图,则为 。 (请参阅下文关于其他要求的讨论。) - DidUpdateFocus(UIFocusUpdateContext, UIFocusAnimationCoordinator) 在 UIView 丢失或接收焦点后调用。 (另请参阅 ShouldUpdateFocus(UIFocusUpdateContext)。)
- Focused 是否 UIView 为聚焦视图。
- PreferredFocusedView 返回 UIView 实际应聚焦的 。 (例如,子 UIView.)
- SetNeedsFocusUpdate() 当这是活动焦点环境时,请求焦点更新,这可能会更改 PreferredFocusedView。 (另请参阅 UpdateFocusIfNeeded()。)
- ShouldUpdateFocus(UIFocusUpdateContext) 在 UIView 失去或接收焦点之前调用。 如果任一焦点环境返回
false
,则取消焦点更新。 - UpdateFocusIfNeeded() 如果任何焦点环境有挂起的更新,此方法将强制立即更新焦点。 与 不同 SetNeedsFocusUpdate(),此方法可由任何 UIView调用,无论它当前是否包含焦点。
除了CanBecomeFocused返回 ,对于UIView要聚焦的 false
,它必须具有 一个值 ,一个HiddenUserInteractionEnabled值 true
,一个Alpha大于 0 的值,并且它不能被另一个 UIViewtrue
遮盖。
构造函数
UIView() |
不带参数初始化此类的新实例的默认构造函数。 |
UIView(CGRect) |
使用指定的帧初始化 UIView。 |
UIView(IntPtr) |
创建非托管对象的托管表示形式时使用的构造函数;由运行时调用。 |
UIView(NSCoder) |
从 unarchiver 对象中存储的数据初始化 对象的构造函数。 |
UIView(NSObjectFlag) |
在派生类上调用 的构造函数,以跳过初始化并仅分配 对象。 |
属性
方法
事件
AnimationWillEnd |
动画结束时引发此事件。 |
AnimationWillStart |
动画将启动时引发此事件。 |