回顾:
1.手势:
基本手势类:UIGestureRecongnizer类型
六种手势:
一次性手势:tap Swipe点击一下 划一下
连续性的手势:longPress Pinch rotation Pan
多手势共存:设置需要共存的手势的Delegate,然后让代理对象遵守协议,实现方法二:return Yes
2. 变形
变形包括:位移 缩放 旋转
使用transForm属性来记录变形的状态,使用的是3*3的矩阵类记录三种状态的值的该变
使用一下两种属API改变对数据
带有make的这组函数,变换的基准是一个常量这个常量记录的是试图没有变化之前的一个状态
CGAffineTransformMakeRotation()
CGAffineTransformMakeScale()
CGAffineTransfromMakeTranslation()
使用不带make的这组函数,变化都是基于本次修改该之前的基础上进行修改
CGAffineTransformRotate()
CGAffineTransformScale()
CGAffineTransformTranslate()
重点注意:
变形与Auto Layout是冲突的,所以一定要先关闭视图的自动布局功能,在做变形,否则会出现未知结果
3. 使用故事板创建手势的步骤:
step1:从资源库中拖拽某种类型的手势对象,如果在拖拽时就想与某视图相关联起来,那么就把手势对象拖到试图中,如果不想关连,那么就拖拽倒场景中的资源条上
step2:选中要关连的试图 按住Control连线到场景中的资源条上的手势对象
step3:选中手势对象,按住control连线倒控制器中,生成方法,在方法中编写手势的响应代码即可
今天:
1 深入了解坐标系(frame bounds center transform)
1.1frame属性
a.什么是frame
类型:是CGRect结构体类型
作用:该视图左定点在父试图中坐标系的位置,以及该试图在父视图中占据的宽和高
b.直接修改frame 其他属相的变化如何:
center:会被改变
bounds:会被改变
transform:不会被改变
c.什么时候需要使用frame
当把一个视图添加到父试图的时候,一定要设置frame属性
1.2bounds属性
a.什么是Bounds属性
类型:CGRect结构提类型
作用:描述的是该试图的坐标系定点的值,以及自身的大小
b.直接修改bounds其他属相的变化如何:
frame:会被改变
center:不会被改变
transform:不会被改变
c.什么时候需要使用bounds
当需要定位视图的,要读取父视图的大小,那么就用父视图的bounds
当修改试图内的子试图的位置时,可以让子试图的位置发生偏移,实现移动的效果
1.3center的属性
a.什么是center
类型:CGPoint的结构体类型
作用:描述的是该视图中心点,在父试图中的坐标位置
b.直接修改了 center属性时,其他属性如何改变
frame:会被改变
bounds:不会被改变
transform:不会被改变
c.什么时候需要center
需要修改视图的位置,也就是位移时,需要修改center
1.4transform的属性
a.什么是transform属性
类型:CGAffineTransform结构体类型
作用:描述该试图的状态
b直接修改了transform属性时,其他属性如何变化
frame:会
bounds:不会
Center:不会
c.结论:
变形之前,frame和bounds保持变化的一直性,变换之后,frame代表的是在视图中表现出来的外观,所以会随着变形而记录不同的外观状态,但是bounds不是用来变现的,只是记录大小的,所以不会改变,bounds的坐标系也不会改变
2. 触控(UITouch)
2.1 什么是触控:
是一个UITouch的对象,当用touch视图时,自动产生UITouch对象
2.2 如何获取Touch
需要自定义视图类,覆盖类中的指定方法,在方法中才能获取倒这个Touch对象
2.3 有什么用:
可以跟踪用户在视图上手指移动的轨迹,判断用户的意图,以此进行绘制。
2.4 怎么使用:
step1:自定义视图类
step2:重写类中的方法
touchesBegan:withEvent//手指接触视图时调用
TouchesMoved:withEvent//手指在视图上移动时调用
touchesEnd:WithEven
3.布局(Layout)
3.1 什么是布局:
在一个视图中如何摆放他的子视图(安排子视图的位置以及大小) 3.2 为什么要使用布局
屏幕的尺寸会经常发生变化或者设备的改变,屏幕的尺寸也会随着改变,于是只要屏幕大小发生变化没坐标系也会随着变化,于是变化之前设置的frame在新的f坐标系中定位就会与期待的不一样,所以就需要在屏幕发生变化时重新定位
3.3 什么时候需要改变屏幕的大小
a.设置不同(3.5存 4存.....)
b.屏幕方向不同
c.状态栏
隐藏
特殊的状态栏:来电时,绿色状态栏
录音时 红色状态栏
开启个人热点 蓝色状态
d.各种bar
NavigationBar:44/32 如果设置了prompt bar会更高
TabBar:49个点高
ToolBar:44/32个点
IOS7中导挤占了状态栏,高度是64/52
e.键盘
弹出时挤占屏幕,高度不确定,因为中英文键盘的高度不同
3.4布局的方式:
方法一:纯代码布局 古老的方法
理念:当屏幕发生变化时,自动执行一段我们写好的代码,代码中重新计算一下视图的frame,从而达到在新坐标系下重新定位的目的。
特点:功能强大,非常繁琐
方法二:AutoResizing布局 以前的一种自动布局的技巧
理念:记录视图与父视图的边缘为可调整或者固定值,然后屏幕发生变化时,依据这段相对的距离,重新布局视图
特点:操作简单,功能有限
方法三: AutoLayout布局
理念:将视图与视图之间的位置以及视图自身的大小,用多个约束来记录,当屏幕发生变化时,系统根据定好的约束,自动计算满足该约束的情况下新的坐标值,然后调整位置
特点:简单易用
注意:以上方式的布局,选择其一
4 纯代码方式:
4.1 理念:在屏幕大小发生变化时,通过代码的方式改变视图的frame
4.2 重写控制器中的方法ViewDidLayoutSubviews即可
该方法,在屏幕发生变化时,有系统自动调用,所以,改变frame的代码写在这个方法中就会被调用自动执行了
注意:使用纯代码方式时一定要先关闭AutoLayout 否则代码可能会无效
补充:
当关闭自动布局时,使用drawRect绘制图形以后,如果屏幕旋转后图形出现了扭曲,如何保持不变?
解决方案:设置视图的contentMode为redraw即可