创建视图对象
初始化并返回具有指定框架矩形的新分配的视图对象。
- (instancetype)initWithFrame:(CGRect)frame;
// frame
视图的框架矩形,以点为单位度量。
框架的原点相对于您计划在其中添加它的父视图。
此方法使用框架矩形相应地设置center和bounds属性。
// 讨论
新视图对象必须插入到窗口的视图层次结构中才能使用。
如果你以编程方式创建一个视图对象,这个方法是UIView类的指定初始化器。
子类可以覆盖此方法来执行任何自定义初始化,但必须在实现开始时调用super。
如果使用Interface Builder设计接口,则在随后从nib文件加载视图对象时不会调用此方法。
nib文件中的对象被重新构造,然后使用它们的initWithCoder:方法初始化,该方法修改视图的属性以匹配存储在nib文件中的属性。
有关如何从nib文件加载视图的详细信息,请参阅Resource Programming Guide。
---------------------------------------------------------------------------------
- (instancetype)initWithCoder:(NSCoder *)aDecoder;
配置视图的视觉外观
视图的背景颜色。
@property(nonatomic, copy) UIColor *backgroundColor;
可以动画化对该属性的更改。默认值为nil,这将产生透明的背景颜色。
---------------------------------------------------------------------------------
确定视图是否隐藏的布尔值。
@property(nonatomic, getter=isHidden) BOOL hidden;
// 讨论
将此属性的值设置为YES将隐藏接收方,将其设置为NO将显示接收方。
默认值是NO。
隐藏视图将从其窗口中消失,并且不接收输入事件。
不过,它仍然保留在父视图的子视图列表中,并像往常一样参与自动调整大小。
隐藏具有子视图的视图具有隐藏这些子视图及其可能具有的任何视图后代的效果。
这种效果是隐式的,不会改变接收者后代的隐藏状态。
隐藏窗口当前第一个响应器的视图会导致视图的下一个有效键视图成为新的第一个响应者。
此属性的值仅反映接收方的状态,不反映视图层次结构中接收方祖先的状态。
因此,这个属性可以是NO,但是如果隐藏了一个祖先,则接收者仍然可能被隐藏。
---------------------------------------------------------------------------------
视图的alpha值。
@property(nonatomic) CGFloat alpha;
// 讨论
此属性的值是0.0到1.0范围内的浮点数,其中0.0表示完全透明,1.0表示完全不透明。
更改此属性的值只更新当前视图的alpha值。
然而,alpha值所赋予的透明度会影响视图的所有内容,包括子视图。
例如,一个alpha值为1.0的子视图嵌入到一个alpha值为0.5的父视图中,就会出现在屏幕上,就好像它的alpha值也是0.5一样。
可以动画化对该属性的更改。
---------------------------------------------------------------------------------
一个布尔值,用于确定视图是否不透明。
@property(nonatomic, getter=isOpaque) BOOL opaque;
// 讨论
这个属性向绘图系统提供了一个提示,说明它应该如何处理视图。
如果设置为YES,绘图系统将视图视为完全不透明的,这允许绘图系统优化一些绘图操作并提高性能。
如果设置为NO,绘图系统通常会将视图与其他内容组合在一起。此属性的默认值为YES。
一个不透明的视图应该用完全不透明的内容来填充其边界——也就是说,内容的alpha值应该为1.0。
如果视图是不透明的,或者没有填充其边界,或者包含全部或部分透明的内容,那么结果是不可预测的。
如果视图是完全透明或部分透明的,您应该始终将此属性的值设置为NO。
您只需要为UIView的子类中的不透明属性设置一个值,这些子类使用drawRect:方法绘制它们自己的内容。
不透明属性在系统提供的类(如UIButton、UILabel、UITableViewCell等)中不起作用。
---------------------------------------------------------------------------------
视图层次结构中的第一个非默认颜色值,从视图本身开始升序。
@property(nonatomic, strong) UIColor *tintColor;
// 讨论
如果系统无法在层次结构中找到非默认颜色,则此属性的值将改为系统定义的颜色。
如果视图的 tintAdjustmentMode 属性的值是 UIViewTintAdjustmentModeDimmed,那么tintColor属性值将自动变暗。
若要在此属性更改时刷新子视图呈现,请覆盖tintColorDidChange方法。
不支持模式颜色(如UIColor中所述)。
// 注意
如果您尝试使用图案颜色作为 tint color,系统会引发异常。
---------------------------------------------------------------------------------
视图层次结构中的第一个非默认色调调整模式值,从视图本身开始升序。
@property(nonatomic) UIViewTintAdjustmentMode tintAdjustmentMode;
// 讨论
当此属性的值为 UIViewTintAdjustmentModeDimmed 时,将修改tintColor属性的值以提供一个调暗的外观。
如果在查询此属性时系统无法在子视图层次结构中找到非默认值,则该值为UIViewTintAdjustmentModeNormal。
当此属性的值发生更改(通过视图的值更改或其父视图的值更改)时,系统调用tintColorDidChange方法来允许视图刷新其呈现。
---------------------------------------------------------------------------------
一个布尔值,用于确定子视图是否局限于视图的边界。
@property(nonatomic) BOOL clipsToBounds;
// 讨论
将此值设置为YES会将子视图剪切到接收器的边界。
如果设置为NO,则不剪切帧超出接收器可见边界的子视图。默认值是NO。
---------------------------------------------------------------------------------
一个布尔值,用于确定在绘制之前是否应自动清除视图的边界。
@property(nonatomic) BOOL clearsContextBeforeDrawing;
// 讨论
当设置为YES时,在调用drawRect:方法之前,绘图缓冲区将自动清除为透明黑色。
此行为确保在重新绘制视图的内容时不会留下任何可视构件。
如果视图的不透明属性也设置为YES,则视图的backgroundColor属性不能为nil,否则可能会发生绘图错误。
此属性的默认值为YES。
如果将此属性的值设置为NO,则负责确保在drawRect: method中正确绘制视图的内容。
如果您的绘图代码已经进行了大量优化,那么将此属性设置为NO可以提高性能,尤其是在滚动时,可能只需要重新绘制视图的一部分。
---------------------------------------------------------------------------------
一个可选视图,其alpha通道用于屏蔽视图的内容。
@property(nonatomic, strong) UIView *maskView;
// 讨论
视图的alpha通道决定了视图的内容和背景显示了多少。
完全或部分不透明像素允许底层内容通过但完全透明的像素块显示该内容。
---------------------------------------------------------------------------------
返回用于为该类的实例创建层的类。
@property(class, nonatomic, readonly) Class layerClass;
// 讨论
默认情况下,该方法返回CALayer类对象。
子类可以覆盖此方法并根据需要返回一个不同的层类。
例如,如果您的视图使用平铺显示一个大的可滚动区域,您可能想要覆盖这个属性并返回CATiledLayer类,如清单1所示。
清单1,返回一个平铺层
override class var layerClass : AnyClass {
return CATiledLayer.self
}
为了创建相应的层对象,在创建视图的早期只调用此方法一次。
---------------------------------------------------------------------------------
视图的核心动画层,用于渲染。
@property(nonatomic, readonly, strong) CALayer *layer;
// 讨论
这个属性从不为空。
对象的实际类由layerClass属性中返回的值决定。view是layer的代理。
// 警告
因为视图是层的委托,所以永远不要让视图成为另一个CALayer对象的委托。
此外,永远不要更改这个层对象的委托。
配置与事件相关的行为
一个布尔值,用于确定是否忽略用户事件并将其从事件队列中删除。
@property(nonatomic, getter=isUserInteractionEnabled) BOOL userInteractionEnabled;
// 讨论
当设置为NO时,用于视图的touch、press、keyboard和focus事件将被忽略,并从事件队列中删除。
当设置为YES时,事件将正常交付给视图。
此属性的默认值为YES。
在动画期间,对动画中涉及的所有视图暂时禁用用户交互,而不考虑此属性中的值。
您可以通过在配置动画时指定UIViewAnimationOptionAllowUserInteraction选项来禁用此行为。
// 请注意
一些UIKit子类覆盖这个属性并返回一个不同的默认值。
请参阅该类的文档以确定它是否返回不同的值。
---------------------------------------------------------------------------------
一个布尔值,指示视图是否一次接收多个触摸。
@property(nonatomic, getter=isMultipleTouchEnabled) BOOL multipleTouchEnabled;
// 讨论
当设置为YES时,视图接收所有与多点触摸序列相关的触摸,并在视图的范围内开始。
当设置为NO时,视图只接收从视图边界内开始的多点触摸序列中的第一个触摸事件。
此属性的默认值为NO。
// 请注意
此属性不影响附加到视图的手势识别器。
手势识别器接收视图中发生的所有触摸。
当此属性为NO时,同一窗口中的其他视图仍然可以接收触摸事件。
如果您希望此视图仅处理多点触摸事件,请将此属性和exclusive vetouch属性的值都设置为YES。
此属性不阻止视图被要求处理多个触摸。
例如,两个子视图都可以将它们的触摸转发给一个公共的父视图,例如一个窗口或视图控制器的根视图。
这个属性决定有多少最初针对视图的触摸被交付到那个视图。
---------------------------------------------------------------------------------
一个布尔值,指示接收者是否仅处理触摸事件。
@property(nonatomic, getter=isExclusiveTouch) BOOL exclusiveTouch;
// 讨论
将此属性设置为YES会导致接收者阻止将触摸事件传递到同一窗口中的其他视图。
此属性的默认值为NO。
配置边界和框架矩形
框架矩形,它描述视图在父视图的坐标系统中的位置和大小。
@property(nonatomic) CGRect frame;
// 讨论
这个矩形定义了视图在父视图坐标系中的大小和位置。
在布局操作期间使用此矩形设置视图的大小和位置。
设置此属性将更改center属性指定的点,并相应地更改边界矩形中的大小。
框架矩形的坐标总是以点为单位指定的。
改变框架矩形会自动重新显示视图,而不需要调用它的drawRect:方法。
如果你想让UIKit在框架矩形改变时调用drawRect:方法,设置contentMode属性为UIViewContentModeRedraw。
可以动画化对该属性的更改。
但是,如果transform属性包含一个非恒等变换,则frame属性的值是未定义的,不应该修改。
在这种情况下,使用center属性重新定位视图,并使用bounds属性调整大小。
---------------------------------------------------------------------------------
边界矩形,它在自己的坐标系中描述视图的位置和大小。
@property(nonatomic) CGRect bounds;
// 讨论
默认边界原点是(0,0),大小与frame属性中的矩形大小相同。
更改此矩形的大小部分将使视图相对于其中心点增长或收缩。
更改大小还会更改frame属性中要匹配的矩形的大小。
边界矩形的坐标总是以点为单位指定的。
更改边界矩形将自动重新显示视图,而不调用其drawRect:方法。
如果你想UIKit调用drawRect:方法,设置contentMode属性为UIViewContentModeRedraw。
可以动画化对该属性的更改。
---------------------------------------------------------------------------------
// 视图框架矩形的中心点。
@property(nonatomic) CGPoint center;
// 讨论
中心点以其父视图的坐标系统中的点指定。
设置此属性可适当地更新frame属性中矩形的原点。
当您想要更改视图的位置时,请使用此属性,而不是frame属性。
中心点总是有效的,即使将缩放或旋转因子应用于视图的转换。
可以动画化对该属性的更改。
---------------------------------------------------------------------------------
指定应用于视图的转换,相对于其边界的中心。
@property(nonatomic) CGAffineTransform transform;
// 讨论
使用此属性可在视图的父视图的坐标系统中缩放或旋转视图的框架矩形。
(要更改视图的位置,请修改center属性。)此属性的默认值是CGAffineTransformIdentity。
转换相对于视图的锚点发生。
默认情况下,锚点等于框架矩形的中心点。
要更改锚点,请修改视图的底层CALayer对象的锚点属性。
可以动画化对该属性的更改。
在iOS 8.0及更高版本中,transform属性不影响自动布局。
自动布局根据视图的未转换帧计算视图的对齐矩形。
// 警告
当这个属性的值不是恒等变换时,frame属性中的值是未定义的,应该被忽略。