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

学习笔记: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 就有⾃自带的下拉刷新,但是⾃自定义程度较低,在实现更更多效果时还需要⾃自定义

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


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值