欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

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

程序员文章站 2022-03-16 16:20:33
...

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

手势

1. 手势识别的代理方法

optional public func gestureRecognizerShouldBegin(_ gestureRecognizer:
UIGestureRecognizer) -> Bool

手势识别状态转换到 UIGestureRecognizerStatePossible状态。
optional public func gestureRecognizer(_ gestureRecognizer:
UIGestureRecognizer, shouldRecognizeSimultaneouslyWith
otherGestureRecognizer: UIGestureRecognizer) -> Bool

控制两个手势是否可以同时响应,返回 true 则可以同时响应,需要注意的是,返回 true 会保证两个⼿势能被同时响应,而返回 false 不能保证两个手势不能被同时响应。因为另一个手势的代理方法可能会返回 true,即“一真即真”。
optional public func gestureRecognizer(_ gestureRecognizer:
UIGestureRecognizer, shouldRequireFailureOf otherGestureRecognizer:
UIGestureRecognizer) -> Bool

optional public func gestureRecognizer(_ gestureRecognizer:
UIGestureRecognizer, shouldBeRequiredToFailBy otherGestureRecognizer:

这两个方法控制手势之间的牵制,在⼀个手势 fail 之后⾃己才可以执行, 自己 fail 之后其他可以识别,依旧跟上⾯方法一样“一真即真”。
optional public func gestureRecognizer(_ gestureRecognizer:
UIGestureRecognizer, shouldReceive touch: UITouch) -> Bool

在 touchesBegan之前就会调⽤用,如果返回 false,则会阻⽌止识别器器接收 UITouch optional public func gestureRecognizer(_ gestureRecognizer:
UIGestureRecognizer, shouldReceive press: UIPress) -> Bool

与上⾯面类似,会阻⽌止识别器器接受 UIPress。

关于UITouch和UIPress的区别

UITouch 指的是点触屏幕的⼿手势,⽽而 UIPress 代表了了远程控制器器或游戏⼿手柄上物理理 按钮按下的事件。

2. 手势冲突 遵循UIGestureRecognizerDelegate

  • 重写相应的方法
  • 指定手势代理者
  • 利用代理的方法

主要是利用 shouldRecognizeSimultaneouslyWith shouldRequireFailureOf shouldBeRequiredToFailBy 方法控制手势识别的,解决冲突。
如: 有时候会出现iOS判断该⼿手势符合多个条件,⽽用户此时只想要其中一种,这个情况下可以调用 requireGestureRecognizerToFail: 该方法会让当前⼿势对象根据指定对象状态来进行下一步操作,指定某个手势执行的前提是另一个手势失败。//类似设置优先级,也可实现跨视图层级的识别器器

3. 自定义手势

需要import UIKit.UIGestureRecognizerSubclass(UIKit⼦子类)重写 touchesBegan 等方法 更多关于类似于圆圈的精确识别可⾃行参考更更多的文章和算法

Task

1. 两个scrollView联动

  • 基本思路:
    更改offset,在把⼀一个scrollView的offset传给另⼀一个
  • 更多问题:
    如果是 两个⻚页数相差很⼤大的scrollView,要实现同步滑动,松开回弹,应该如何实现?
  • 开拓思路:
    把一个⼿手势同时传递给两个 view ? 设置子视图:由于把 scrollView 添 加到另一个 scrollView 上了了,它就也会跟着滚动,即一边⾃己滚动,一边跟着底部 的 scrollView 滚动。且 scrollView 默认是clipsToBounds的,如果要让两个 scrollView 平行放置,还要⾃己遮挡露出来的 content。有问题!
  • handlePan:
    ScrollView ⾥面是内置了一个panGestureRecognizer的,把这个 recognizer dump 出来看一下:

    <UIScrollViewPanGestureRecognizer: 0x7ff5df417700; state = Possible; delaysTouchesEnded = NO; view = <GestureAnimation.MyView 0x7ff5e081a400>; target= <(action=handlePan:, target= <GestureAnimation.MyView 0x7ff5e081a400>)>> #0
      - super: UIPanGestureRecognizer
          - super: UIGestureRecognizer
    
                - super: NSObject 

    内置的这个panGestureRecognizertarget 是⼀一个签名为 handlePan: 的方法, 我们无法改变这个⽅方法的逻辑,但我们可以通过 method swizzling把这个⽅法替 换成我们⾃己的方法。同时调⽤用原来的 handlePan 方法,保留 UIScrollView 的回弹 效果、减速效果等等。

2. 滑动手势限制

  • 主要功能实现:
    监测滑动的⻆角度,并在⼀一定情况下画线

动画

1. 转场动画

  • 系统自带转场动画
  • 自定义转场动画 重写 UIViewControllerAnimatedTransitioning

2. UIkit⼒学

UIKit中也可以很⽅便地去实现一些物理理效果
UIDynamicAnimator:封装了底层iOS物理理引擎,为动力项 UIDynamicBehavioer:动⼒行为,为动力项提供不不同的动力行为 UIDynamicItem:一个物体,被各种⼒量作用的物体

遇到的坑:
即使是设置完全弹性碰撞,也会损失能量量,导致不不断碰撞⽆无法实现(暂时⽆解)

3. tableview动态插⼊删除

在tableview 的代理理⽅方法 insert 和 delete 中,可以看到有是否有动画的选择,这是⾃自带 UITableViewRowAnimation

4. 下拉刷新

  • 思考:
    为什什么有那么多库?
  • 虽然 tableView 和 scrollView 就有⾃自带的下拉刷新,但是⾃自定义程度较低,在实现更更多效果时还需要⾃自定义

以上不完整,本人也需更多学习,还望指正!