文章讲解点

1.UIView 的 概述
2.UIView 的 外观属性 及 切边属性
3.UIView 的 几何属性
4.UIView 的 嵌套和层次关系
5.UIView 的 交互属性
6.UIView 的 变形操作
7.CALayer层
1.UIView的概述
UIView是UIKit框架里面最基础的视图类。UIView类定义了一个矩形的区域,并管理该矩形区域内所有屏幕显示。
在iOS应用程序中,每个视图对象都要负责渲染视图矩形区域中的内容,并响应该区域中发生的触碰(touch)事件,这一双重行为意味着视图是应用程序与用户交互的重要机制。
UIView类定义了视图的基本行为,但并不定义其为视觉表现,而是UIKit通过其子类来为文本框(textfile)、按键(button)等这样的标准界面元素定义具体的外观和行为。
如下图:

NSObject根类:NSObject 是一个根类,几乎所有的类都是从它派生而来。根类拥有所有类都有的方法,如 [alloc] 和 [init]。
UIResponsder响应者:UIResponsder 可以让继承它的类响应移动设备的触摸时间,由于可能有多个对象响应同一个时间,iOS将时间沿响应链向上传递。
UIWindow窗口类:UIWindow 提供了一个用于管理和显示视图的窗口。窗口提供一个描述内容的表面,是所有其他视图的根容器。每个应用程序通常都只有一个窗口。
UIView视图类:UIView 视图是所有控件的父类。控件用于响应用户的交互,而UIView则负责内容的显示和布局。
UIControl控件类: UIControl 类几乎是所有交互控件的父类,如按钮(Button)、文本框(TextFile)等。所以UIControl类负责根据触摸事件(Touch)触发相应的动作。
警告视图和动作表单: 警告视图和动作表单都可以用于提示用户。它们向用户显示一条消息和一个或多个可选的按键,用户通过这些选项来响应消息。
2.UIView的外观属性
UIView类的外观属性主要有背景颜色、透明度、显示与隐藏、切边
工程创建如下图


swift中代码创建如下(1)-背景色backgroundColor
let view = UIView(frame:CGRect(x:40,y:80,width:240,height:240))
view.backgroundColor = UIColor.black
self.view.addSubview(view)
第一行代码中,创建了一个位置为(40,80)、宽度高度都为240的UIView视图
第二行代码中,设置该视图的背景颜色属性为黑色
最后一行代码中通过方法addSubView(),将设置背景颜色后的视图添加到当前的视图控制器的跟视图中
运行后如下图所示

swift中代码创建如下(2)-透明度alpha
let view = UIView(frame:CGRect(x:40,y:80,width:240,height:240))
view.backgroundColor = UIColor.black
view.alpha = 0.5
self.view.addSubview(view)
第三行代码中通过设置透明度0.1~1.0值范围来改变透明度显色
运行后如下图所示

swift中代码创建如下(3)-显示与隐藏isHidder
let view = UIView(frame:CGRect(x:40,y:80,width:240,height:240))
view.backgroundColor = UIColor.black
view.alpha = 0.5
view.isHidden = true
view.isHidden = false
self.view.addSubview(view)
第四行代码中通过设置ishidden的BOOL值为true或者false来改变视图的隐藏或显示
isHidden 默认值为false - (视图处于显示状态)
运行后如下图所示

swift中代码创建如下(4)-切边属性clipsToBounds
let view = UIView(frame:CGRect(x:40,y:80,width:240,height:240))
view.backgroundColor = UIColor.black
let subView = UIView(frame:CGRect(x:40,y:40,width:240,height:240))
subView.backgroundColor = UIColor.green
view.addSubview(subView)
self.view.addSubview(view)
首先创建2个UIView视图
第五行代码中将绿色背景的subView视图添加到view视图中,使subView视图作为黑色背景视图的子视图
运行后如下图所示

接下来设置view视图的clipsToBounds属性
view.clipsToBounds = true
self.view.addSubview(view)
clipsToBounds 默认值为false
运行后如下图所示

3.UIView的几何属性
swift中代码创建如下
let frame1 = CGRect(x:0,y:0,width:250,height:250)
let view = UIView(frame:frame1)
view.backgroundColor = UIColor.black
let frame2 = CGRect(x:0,y:0,width:200,height:200)
let subView = UIView(frame:frame2)
subView.backgroundColor = UIColor.green
view.addSubview(subView)
self.view.addSubview(view)
首先创建2个UIView视图
运行后如下图所示

接下来修改父视图view的bounds属性
view.backgroundColor = UIColor.black
view.bounds = CGRect(x:-50,y:-50,width:250,height:250)
运行后如下图所示

接下来继续修改父视图view的bounds属性
view.backgroundColor = UIColor.black
view.bounds = CGRect(x:-50,y:-50,width:200,height:200)
运行后如下图所示

4.UIView的嵌套和层次关系
视图可以通过嵌套的方式 ,组成复杂的层次结构
视图的这种布局方式被称为视图层次,一个视图可以包含任意数量的子视图,通过为子视图添加子视图的方式,可以实现任意深度的嵌套
视图在视图层次中的组织方法决定了在屏幕上显示的内容,原因是子视图总是被显示在其父视图的上方;这个组织方法还决定了视图如何响应事件和变化。每个父视图都负责管理其直接的子视图,即根据需要调整它们的位置和尺寸,以及响应它们没有处理的事件
insertSubview(view:,at:) 在指定的位置上插入视图
insertSubview(view:,aboveSubview:) 将视图添加到指定视图的上方
insertSubview(view:,belowSubview:) 将视图添加到指定视图的下方
bringSubview(toFront:) 将指定的子视图移动到最前面
bringSubview(toBack:) 将指定的子视图移动到最后面
exchangeSubview(at:,withSubviewAt:) 交换两个指定位置的子视图在父视图中的位置
rermoveFromSuperview 将子视图从父视图中删除
swift中代码创建如下
let firstView = UIView(frame:CGRect(x:20,y:40,width:200,height:200))
firstView.backgroundColor = UIColor.black
let secondView = UIView(frame:CGRect(x:50,y:70,width:200,height:200))
secondView.backgroundColor = UIColor.green
let thirdView = UIView(frame:CGRect(x:80,y:100,width:200,height:200))
thirdView.backgroundColor = UIColor.red
self.view.addSubview(firstView)
self.view.addSubview(secondView)
self.view.addSubview(thirdView)
首先创建3个UIView视图
运行后如下图所示

观察三个视图的层次关系,然后使用insertSubview(view:,belowSubview)方法,调整thirdView 和 secondView 两个视图在父视图中的层次
调用insertSubview(view:,belowSubview:)方法 - 将第三个视图插入到第二个视图的下方
self.view.insertSubview(thirdView, belowSubview: secondView)
运行后如下图所示

调用bringSubview(toFront:)方法 - 将第一个视图放置在其父视图的最顶部位置
self.view.bringSubview(toFront: firstView)
运行后如下图所示

调用removeFromSuperview()方法 - 删除指定视图
firstView.removeFromSuperview()
secondView.removeFromSuperview()
运行后如下图所示

5.UIView的交互属性
通过设置UIView 的 userInteractionEnabled 属性,可以激活用户的交互特性。该属性值为BOOL类型,由属性本身的名称可知,该属性决定UIView是否接受并响应用户的交互。
当该属性的值为false时,UIView会忽略那些发生在其自身的如触摸和键盘等用户时间,并将这些事件从消息队列中移除出去;当值为true时,这些用户事件会正常派发至UIView本身,UIView会按照之前注册的时间处理方法来响应这些事件。
swift中代码创建如下
import UIKit
class ViewController: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
let touchView = UIView(frame:CGRect(x:60,y:60,width:200,height:200))
touchView.backgroundColor = UIColor.red
self.view.addSubview(touchView)
let guesture = UITapGestureRecognizer(target:self,action:#selector(ViewController.SingleTap))
touchView.addGestureRecognizer(guesture)
}
@objc func SingleTap()
{
print("you touched me")
}
override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
}
}
创建一个UIView视图,并且创建一个UITapGestureRecognizer手势对象
通过addGestureRecognizer方法,将手势对象指定给视图对象。当用户点击该视图时,将调用手势定义的回调方法SingleTap()
运行后如下图所示

点击图片后如下图所示

6.UIView的变形操作
CGAffineTransform 仿射转换结构体代表了一种用于仿射变换的矩阵。
结构体的参数指定了从一个坐标系的点转换成另外一个坐标系的点的规则。
仿射变换是一种特殊类型的映射,保留在一个路径中的平行线,但不一定保留长度或角度。缩放、旋转、平移是最常用的仿射变换。
CGAffineTransformMakeTranslation 通过指定的x,y值,创建一个平移矩阵
CGAffineTransformTranslate 对已存在的矩阵进行平移
CGAffineTransformMakeRotation 通过指定角度来创建一个旋转矩阵
CGAffineTransformRotate 对已存在的矩阵进行旋转
CGAffineTransformMakeScale 通过指定的x,y缩放因子,创建一个缩放矩阵
CGAffineTransformfromScale 对已存在的矩阵进行缩放
CGAffineTransformInvert 反转矩阵,将值与反转矩阵相乘得到原先的值
CGAffineTransformConcat 对仿射效果进行叠加操作
swift中代码创建如下
let view = UIView(frame:CGRect(x:0,y:0,width:200,height:50))
view.center = self.view.center
view.backgroundColor = UIColor.red
self.view.addSubview(view)
创建一个UIView视图,将视图的center属性设置为与当前视图控制器根视图的center相同的位置。由于仿射变换是以视图的center为基点的,所以讲视图放置在屏幕的中心位置,方便对仿射变换操作效果进行观察。
运行后如下图所示

调用transform。translateBy(x:,y:)方法,对视图的仿射矩阵进行平移操作
let transform = view.transform
view.transform = transform.translatedBy(x: 0, y: 200)
运行后如下图所示

接下来调用transform.scaleBy(x:,y:)方法,对视图的仿射矩阵进行缩放操作
view.transform = transform.scaledBy(x: 1.5, y: 1.5)
运行后如下图所示

接下来调用transform.rotate(angle),对视图的仿射矩阵进行旋转操作
view.transform = transform.rotated(by: 3.14/4)
运行后如下图所示

斜切仿射变换
在上面进行的平移、缩放、旋转操作中,都是采用系统封装好的方法。
系统并没有提供类似于CGAffineTransformMake(CGFloat sx,CGFloat shx,CGFloat shy,CGFloat sy,CGFloat tx,CGFloat ty)方法,自定义视图的变换。
sx 水平方向上的缩放因子
sy 垂直方向上的缩放因子
shx 水平方向上的斜切因子
shy 垂直方向上的斜切因子
tx 水平方向上的位移因子
ty 垂直方向上的位移因子
swift 3.0中CGAffineTransformMake方法已经被取消
但是CGAffineTransform包含的6个属性a、b、c、d、tx、ty
对应CGAffineTransformMake方法中的sx、shx、shy、sy、tx、ty6个参数
view.transform.a = 1.0
view.transform.b = 0.5
view.transform.c = 0.5
view.transform.d = 1.0
view.transform.tx = 0.0
view.transform.ty = 0.0
运行后如下图所示

7.CALayer层
UIView是iOS系统中界面元素的基础,所有的界面元素都继承自它,它本身完全是由CoreAnimation来实现的
而UIView真正的绘图部分,是由一个叫CALayer(Core Animation Layer)的类来管理的
swift中代码创建如下(1)-CALayer边框
let view = UIView(frame:CGRect(x:60,y:60,width:200,height:200))
view.backgroundColor = UIColor.red
view.layer.borderWidth = 20
view.layer.borderColor = UIColor.green.cgColor
self.view.addSubview(view)
设置层的边缘宽度borderWidth为20
设置层的边缘颜色borderColor为绿色
运行后如下图所示

swift中代码创建如下(2)-CALayer阴影
let view = UIView(frame:CGRect(x:60,y:60,width:200,height:200))
view.backgroundColor = UIColor.red
view.layer.shadowColor = UIColor.green.cgColor
view.layer.shadowOffset = CGSize(width:10.0,height:10.0)
view.layer.shadowOpacity = 0.45
view.layer.shadowRadius = 5.0
self.view.addSubview(view)
设置shadowColor阴影颜色为绿色
设置shadowOffset阴影的偏移值为10.0
设置shadowOpacity阴影的不透明值为0.45
设置shadowRadius模糊半径为5.0
运行后如下图所示

swift中代码创建如下(3)-CALayer圆角
let view = UIView(frame:CGRect(x:60,y:60,width:200,height:200))
view.backgroundColor = UIColor.purple
view.layer.cornerRadius = 40
let subView = UIView(frame:CGRect(x:0,y:0,width:200,height:100))
subView.backgroundColor = UIColor.green
view.addSubview(subView)
self.view.addSubview(view)
设置cornerRadius圆角半径为40.当该属性被设置为大于0的值时,将会在层的四周绘制指定半径的圆角
运行后如下图所示

从效果图中可以看出,虽然给紫色视图添加了圆角效果,但是由于子视图的存在,无法看到上房两个定点的圆角效果。这是因为圆角效果只对视图的背景颜色和层的边框起作用,而不会对层中的内容起作用。不过系统提供了一个属性masksToBounds,将该属性的值设置为true就可以实现上下都有圆角效果了。
view.layer.masksToBounds = true
运行后如下图所示

如果想效果图运行完后出现一个正圆形,只需要将cornerRadius设置为正方向宽度的一半
view.layer.cornerRadius = 100
运行后如下图所示

继续改变
view.layer.cornerRadius = 200
运行后如下图所示

swift中代码创建如下(4)-CALayer渐变
let firstView = CGRect(x:20,y:60,width:240,height:240)
let secondView = UIView(frame:firstView)
let secondLayer = CAGradientLayer()
secondLayer.frame = secondView.frame
let firstColor = UIColor.yellow.cgColor
let secondColor = UIColor.blue.cgColor
let thirdColor = UIColor.red.cgColor
secondLayer.colors = [firstColor,secondColor,thirdColor]
secondLayer.startPoint = CGPoint(x:0,y:0)
secondLayer.endPoint = CGPoint(x:1,y:1)
secondLayer.locations = [0,0.3,1]
secondView.layer.addSublayer(secondLayer)
self.view.addSubview(secondView)
创建一个CAGradientLayer渐变层,并设置渐变层的frame属性与视图的frame属性相同
依次创建三个颜色黄色、蓝色、红色,这三个颜色将作为渐变线上的颜色
startPoint设置渐变层的起点位置为(0,0)
endPoint设置渐变成的结束位置为(1,1)
locations设置渐变线颜色的所占位置
依次将渐变层添加到视图对象的跟层中,最后将视图对象添加到当前视图控制器的根视图中
运行后如图所示

总结如下图

网友评论