UIView基础介绍
官网文档:
UIView简介
UIView 算得上是iOS中就基础重要的显示控件,大部分控件都是基于其而来,它具有展示、响应、动画等基础特点,也是自定义的基础控件的最佳选择。
UIView无法响应点击事件情况:
- 透明度小于0.001
- 视图被影藏
- 用户交互被设置为false
Frame/bounds/center的理解
绝对坐标系:屏幕的左上角是坐标原点(0,0);横向为X轴,纵向为Y轴;向左边移动X值减小,向右边移动X值增加;向下边移动Y值增加,向上边移动Y值减小;
每个视图的起始位置和大小由Frame来确定,frame是一个CGRect类型的属性,CGRect是一个结构体,里面有两个变量origin和size,其中origin是一个CGPoint点,指的是视图左上角的那个点的位置,决定了视图的位置;size是CGSize类型的,决定了视图的大小;
Frame:视图在其父视图坐标系中的位置和大小,建议大家在控件初始化之后,紧接着就去设置Frame,设置完成后,假如涉及到修改控件的位置、大小等,就需要再去修改Frame;
Bounds:视图在其自己的坐标系中的位置和大小。Bounds属性中,视图的bounds.origin始终是(0,0),因此bounds属性最核心的作用是设置视图的大小,即bounds.size,当需要去修改视图大小的时候,可以修改bounds.size;
Center:视图中心点在父视图坐标系中的坐标,当需要修改视图对象的位置时,可以修改Center属性。
坐标系转换:[传送门]
视图的变形【transform】
相关知识点参考开发文档CGAffineTransformReference
在开发过程中,经常需要对视图对象的样式进行修改,常见的修改操作有位移、放大/缩小、旋转等。当涉及到视图位移的时候,可以修改视图的center以及frame属性;当涉及到视图的缩放以及旋转操作时,推荐修改视图的transform属性
1、位移
当需要修改视图对象的位置时(上移、下移、左移、右移),可以通过修改视图对象的center和frame属性。提示,point由x和y构成。该方法沿固定x轴或者y轴移动
第二中位移方法是沿初始移动边方向移动,比如发生旋转后移动方向将变换。
使用方法:public func CGAffineTransformTranslate(t:CGAffineTransform, _ tx: CGFloat, _ ty: CGFloat) -> CGAffineTransform
2. 放大和缩小【scate:比例、放大】
第一种方法可以修改视图对象的bounds.size属性,第二种方法是直接修改视图对象的transform【变形】属性
利用方法:public func CGAffineTransformScale(t:CGAffineTransform(放大对象【myView.transform】), _ sx: CGFloat(放大或缩小比例), _ sy: CGFloat) -> CGAffineTransform
3、旋转【rotate:旋转】
通过修改视图对象的transform属性,可以实现视图的顺时针旋转以及逆时针旋转,此时需要使用到如下函数,其中,angle属性是旋转的角度。
利用方法:public func CGAffineTransformRotate(t:CGAffineTransform, _ angle: CGFloat) -> CGAffineTransform
4、重置transform属性
当需要重置transform属性时,可以进行如下设置。但要注意的是:假如需要完全重置一个视图的样式,除了重置transform属性之外,还需要重置frame, center, bounds。
myView.transform=CGAffineTransformIdentity
视图的层次与构成
图层的处理有代码和IB两种方法,最好不要混搭使用,这里我选择用IB处理图层,有一个总原则,后产生的视图层在最外层 。
常用属性和方法:
public var superview: UIView? { get }//父视图
public var subviews: [UIView] { get }//所有子视图
public var window: UIWindow? { get }//视图所在Window
public func removeFromSuperview()
public func insertSubview(view: UIView, atIndex index: Int)
public func exchangeSubviewAtIndex(index1: Int, withSubviewAtIndex index2: Int)
public func addSubview(view: UIView)
public func insertSubview(view: UIView, belowSubview siblingSubview: UIView)
public func insertSubview(view: UIView, aboveSubview siblingSubview: UIView)
public func bringSubviewToFront(view: UIView)
public func sendSubviewToBack(view: UIView)
public func didAddSubview(subview: UIView)
public func willRemoveSubview(subview: UIView)
public func willMoveToSuperview(newSuperview: UIView?)
public func didMoveToSuperview()
public func willMoveToWindow(newWindow: UIWindow?)
public func didMoveToWindow()
public func isDescendantOfView(view: UIView) -> Bool // returns YES for self.
public func viewWithTag(tag: Int) -> UIView? // recursive search. includes self
// Allows you to perform layout before the drawing cycle happens. -layoutIfNeeded forces layout early
public func setNeedsLayout()
public func layoutIfNeeded()
public func layoutSubviews() //
视图的动画
1.哪些属性可以采用动画?只要是可以修改变化的属性大都可以用动画,动画效果对系统资源消耗不是很高。
2.实现动画播放的方法类CAAnimation Class Reference
视图响应用户交换事件
相关文档:UIGestureRecognizer Calss Reference
1、相关属性
UIView类中,userInteractionEnabled属性可以用来定义视图类对象是否能够响应用户点击。对于某些UIView的子类,例如UILabel,UIImageView,该属性默认情况下是关闭的,因此如果需要响应手势等交互事件,需要修改该属性的值为YES。
另外,multipleTouchEnabled属性用于设置视图对象能否支持多点触控,默认情况下,其取值是NO。这些都是可以再IB中设置的
2、添加手势【gesture:手势 recognize:识别】
对于视图类对象,都可以通过添加手势的方法,来响应用户的交互。一个视图类对象,可以添加多个手势。例如,在一些游戏App中,一个按钮的点击以及长按可以对应不同的操作。UIView类中,与手势相关的属性和方法如下:
public var gestureRecognizers: [UIGestureRecognizer]?//交互手势个数
public funcaddGestureRecognizer(gestureRecognizer: UIGestureRecognizer)//添加交互手势
public funcremoveGestureRecognizer(gestureRecognizer: UIGestureRecognizer)//移除手势
添加手势响应的步骤
1.创建一个交互手势对象,一般使用UIGestureRecognizer的子类,自行查看
创建对象时注意,要实现Selecto方法(及产生交互之后的处理)【可能会遇到的问题:selector访问权问题】,targe一般为自身
2、再将对象添加手势
3、自定义视图类实现touches系列方法
由于UIView继承自UIResponder,因此UIView也同时具有UIResponder的属性和方法。在UIResponder类的定义中,提供了一些响应用户点击操作的方法,如下所示。在自定义视图类中,如果需要响应用户的点击操作,也可以通过重写这些方法来实现用户交互。
需要特别注意的一点是:视图类能够响应用户交互的范围,一定不能超出视图frame所划定的区域,大家可以做一个测试:在父视图中再添加一个更大的子视图,点击超出父视图的范围,看看是否可以调用touchesBegan:方法。
内容模式(contentMode)
凡事带有Scanle的图片都会拉伸
凡事带有Aspect的,图片都会保持原来的宽高比,图片不会变形
scaleAspectFit:图片拉伸完全显示在View中(可能变形)
显示图片时,最好视图大小与图片大小一致,达到不失真,进行比例拉伸。
图片拉伸
Xcode中提供了Slicing功能专门用来裁剪图片。通过Slicing功能,可以设置固定不需要拉伸的区域,以及需要拉伸的区域。这个功能是针对图片的设置,不需要针对UIView去做任何的操作。选择Assets.xcassets,选中某个图片,并点击右下角的Show Slicing,