1.storyboard创建手势
工作原理参见控件操作,非常相似。
操作步骤:
(1)在对象库中,拖拽相应的手势到相应视图中。
(2)给手势连线添加相应的事件方法。
注意:如果要给UIImageView添加手势功能,要记得修改交互属性。
(3)添加相应手势事件方法的功能。(code)
练习:重构图片查看器
2.手势的同事识别问题
默认情况下,一个视图一次只能识别一种手势,如果希望同事能识别多个手势,那么就需要一个对象(被委托对象)在多个手势之间进行沟通。
多个手势要向被委托对象发送消息,来确认他们是否可以同时工作。
(1)要求被委托对象要遵守协议
UIGestureRecognizerDelegate
(2)实现相应方法
CocoaLigature0 - (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldRecognizeSimultaneouslyWithGestureRecognizer:(UIGestureRecognizer *)otherGestureRecognizer;CocoaLigature1
返回值是YES是支持多手势
NO 不支持
(3)将委托对象与被委托对象关联在一起
(4)方法的参数
有些时候,需要根据判断哪个手势可以同时支持,需要使用参数进行判断
3.深入坐标系
和坐标系的四个属性:
.frame .bounds .transform .center
3.1 frame属性
1.是什么
是一个CGRect类型的结构体{x,y,width.height}
描述的是一个视图在父视图中的位置和占用空间大小
2.什么时候使用
当一个视图加入到父视图中时,需要设置这个视图的frame属性,该子视图在父视图中的位置和大小,与transform/AutoLayout技术会有冲突。
3.frame属性和其他三个的关系
<1>frame -> center? 会
直接修改frame的值会修改center
<2>frame -> bounds? 会
直接修改frame的值会修改bounds的值
<3>frame -> transform? 不会
直接修改frame的值不会修改transform
4.一般情况下,如果一个视图.trans属性值是初始值,其frame属性和bounds属性会保持一致。
3.2 bounds属性
1. 是什么
也是一个CGRect类型的结构体{x,y,width.height}
描述的是一个视图自身的大小,和父视图无关,由于和父视图无关,所以bounds属性中,没有位置信息。其x,y的值永远为0.
2. 什么时候用
当计算子视图的坐标时,需要参考子视图本身的大小、或者父视图的大小,需要使用Bounds属性。当写一个View的子类(自定义Cell),视图的大小不同,由数据的多少决定的,计算大小时,就需要自行修改视图(自定义Cell)的bounds的值。
3. 和其他三个的关系
1>.bounds -> frame 会
2>.bounds -> center 不会
直接改变bounds的值,以中心点,改变大小。
3>.bounds ->transform 不会
3.3 center
是一个视图的中心点(位置),位移...
(x+width/2,y+height/2)
和其他三个的关系:
center -> frame
center -> bounds 不会
center -> transform 不会
3.4 transform
1. 是什么
是一个CGAffineTransform类型的结构体
描述是一个3*3的矩阵,此矩阵可以让视图在.frame基础上发生变形(旋转、绽放、位移)。
2. 什么时候用
视图处于AutoLayout管理下时,不可用,只有想让视图进行旋转和缩放时采用,用时需要关掉AutoLayout。
3. 和其他3个的关系
<1> transform -> frame 会
<2> transform -> center 不会
<3> transform -> bounds 不会
注:主动改变frame其bounds的值会改变,如果通过transform改变frame的值,其bounds的值不会改变。
4. UITouch 类 触控
4.1 是什么
是一个UITouch类型的对象,当用户touch"视图",会自动产生UITouch对象。
响应者对象:
在iOS中不是任何对象都能处理时间,只有继承了UIResponder的对象,才能接受并处理事件,我们称之为响应者对象。
4.2 如何获取UITouch对象
需要自定义视图类,覆盖指定的方法,在方法中获取UITouch对象。
4.3 有什么用
可以跟踪用户在视图上手指移动的轨迹,判断用户的意图,以此进行绘图、涂鸦、手写等操作。
4.4 怎么用
在视图中,覆盖父类的方法。
touchesBegan 手指开始触摸屏幕时调用
touchesMoved 手指开始移动时调用
touchesEnded 手指离开视图时调用
两个参数:
参数1:NSSet集合一个手指头就是一个Touch对象
参数2:事件->事件类型、事件的触发时间
4.5UITouch 对象
通过两个对象方法,可以得到手指移动的轨迹
返回一个CGPoint类型的值,表示触摸在View这个视图上的位置
- (CGPoint)locationInView:(UIView *)view;
该方法记录了前一个坐标值
- (CGPoint)previousLocationInView:(UIView *)view;
练习:画图板
1.将所有点保存起来
2.记录手指移动的轨迹
3.把轨迹连线 ->得到图形
4.将图形显示在View上
作业:
1.做一个界面上画矩形效果
按下手指后开始画,拖动时大小变化,松手后消失,类似电脑上的选择框
2.完善绘图程序
做一个类似画图工具
<1>可以画多线
<2>设置化纤的颜色和宽度
可以考虑使用slider
<3>支持橡皮功能
也是化纤,只不过先的颜色是北京颜色
拖出来的矩形框中,是否曾经画过内容,将原来的点删除。
<4>支持各种图形
矩形、圆矩形、圆、椭圆
5.布局(Layout)
5.1 是什么
实质一个试图中如何排放他的指示图(安排子视图的位置和大小)
5.2 为什么要布局
屏幕尺寸的大小会经常变化或不一致,当屏幕大小发生变化时,父视图的bounds会改变,父视图中的内容重新安排,安排子视图的位置和大小。
5.3 可以导致屏幕的大小发生变化的原因
1>设备不同
iphone4/4S 320*480
iphone5/5S 360*568
……
2>屏幕方向不同
iphone5S 320*568(竖) 568*320(横)
3>状态栏
可以隐藏 20个点height(宽度不一定)
特殊状态:
来电话时:绿色的状态显示
开启个热点:蓝色状态显示
录音:红色状态栏
4>各种bar
NavigationBar 44(竖)/32(横)
TabBar 49(竖)/32(横)
ToolBar 44.. /32..
IOS7中,状态栏,NavigationBar
5>*键盘
容易遮挡住重要的信息,高度不确定。
5.4 如何布局
1>.纯代码布局
当屏幕大小发生变化时,自动执行一段代码,重新计算所有的子视图和位置的大小。
其本质就是计算和修改所有子视图的frame属性
特点:功能强大,非常繁琐。
2>.Autoresizing
IOS5及以前的自动布局技术,只能选择其一。
如果纯代码布局(手动布局),一定不会使用AutoLayout(自动布局),autoresizing和代码布局经常在一起使用。
特点:操作简单,但功能有限,只能设置一些特定环境下的布局。
3>.AutoLayout
从IOS6开始有,IOS7中技术更加成熟。
也可以用代码的方式使用AutoLayout
其本质是创建很多对子视图的约束,从而让系统自动计算视图的位置和大小。
特点:操作简便,灵活度略差。
6.纯代码布局
6.1 是什么
当屏幕大小发生变化时,代码改变了视图.frame属性,在显示时位置和大小的方式。
6.2 注意
一定要关掉autolayout
6.3
在控制器类中,有一个方法,viewDidLayoutSubView 当屏幕的大小发生变化时自动调用,布局代码就应该写在此方法中。
练习:创建一个label,右边距20点,下边距20点。解决屏幕布局(适配)
1.添加连个等宽的按钮,高40,有背景色。
2.在1的基础之上加上一个大小不会变化的ImageView(图)imageView离屏幕上、下、左、右分别保持70,50,20,20
3.在2的基础上增加三个按钮(20*20),永远在屏幕的右下角: