学习笔记:iOS手势&动画(一)

学习笔记:iOS手势&动画(一)

手势

常见手势

Tap(点击)、Pan(平移)、Swipe(滑动)、rotation(旋转)、pinch(缩放)……

触摸事件传递机制

  • 从父控件传递到子控件
  • UIApplication->window->寻找处理事件最合适的view

UIApplication->window

发生触摸事件后,系统会将该事件加入到一个由UIApplication管理的事件 队列中,UIApplication会从事件队列中取出最前面的事件,并将事件分发下去以便处理,通常先发送事件给应用程序的主窗口(keyWindow)

UIView不接受触摸事件的三种情况
  • 不允许交互
  • 隐藏
  • 透明

特别地,默认UIImageView不能接受触摸事件,因为不允许交互,即userInteractionEnabled = NO(isUserInteractionEnabled = False),所以如果希望UIImageView可以交互,需要userInteractionEnabled = YES(isUserInteractionEnabled = True)。

找到最合适的控件来处理事件

  1. 首先判断主窗口(keyWindow)自己是否能接受触摸事件
  2. 判断触摸点是否在自己身上
  3. 子控件数组中从后往前遍历子控件,重复前面的两个步骤(所谓从后往前遍历子控件,就是首先查找子控件数组中最后一个元素,然后执行1、2步骤)
  4. view,比如叫做fitView,那么会把这个事件交给这个fitView,再遍历这个fitView的子控件,直至没有更合适的view为止。
  5. 如果没有符合条件的子控件,那么就认为自己最合适处理这个事件,也就是自己是最合适的view。

事件传递详细过程

主窗口会在视图层次结构中找到一个最合适的视图来处理触摸事件,但是这仅仅是整个事件处理过程的第一步 找到合适的视图控件后,就会调用视图控件的touches方法来作具体的事件处理
touchesBegan, touchesMoved, touchedEnded… 这些touches方法的默认做法是将事件顺着响应者链条向上传递,将事件交给上一个响应者进行处理,图例如下:
这里写图片描述

动画

UIView 动画

UiView动画是基于高层API封装进行封装的,对UIView的属性进行修改时候所产生的动画, 可设置的动画属性有:
1. 大小变化(frame)
2. 拉伸变化(bounds)
3. 中心位置(center)
4. 旋转(transform)
5. 透明度(alpha)
6. 背景颜色(backgroundColor)
7. 拉伸内容(contentStretch)

Layer 动画

  • CABasicAnimation
    在长度为duration的持续时间内,keyPath相应属性的值从fromValue(初始值)渐渐地变为toValue(结束值)
  • CAKeyFrameAnimation
    CABasicAnimation只能从一个数值(fromValue)变到另一个数值(toValue),而CAKeyframeAnimation会使用一个NSArray保存这些数值
    CABasicAnimation可看做是只有2个关键帧的CAKeyframeAnimation
  • 因为在动画的过程中,我们修改的是Presentation Tree,并没有实际修改CALayer的属性,想要让动画停在结束的位置,通常有两种方式:
    1. 改变实际的属性
      CALaye做动画设置的frame是无效的,你应该在动画结束后显式地指定position的值
    2. 如果fillMode = kCAFillModeForwards同时removedOnComletion = NO,那么在动画执行完毕后,图层会保持显示动画执行后的状态。
      但在实质上,图层的属性值还是动画执行前的初始值,并没有真正被改变。
  • 无法动画进行中的view无法响应事件:对Core Animation来说,不管是显式动画还是隐式动画,对其设置frame都是立即设置的,比如说给一个UIView做移动动画,虽然看起来frame在持续改变,但其实它的frame已经是最终值了,这种情况下,哪怕这个UIView是UIButton的实例,其触发touch事件的范围还是最终frame的地方。

猜你喜欢

转载自blog.csdn.net/weixin_40477931/article/details/80296572