Viewday04

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),永远在屏幕的右下角:

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值