学习笔记: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) -> Booloptional 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
内置的这个
panGestureRecognizer
的target
是⼀一个签名为handlePan:
的方法, 我们无法改变这个⽅方法的逻辑,但我们可以通过method swizzling
把这个⽅法替 换成我们⾃己的方法。同时调⽤用原来的handlePan
方法,保留 UIScrollView 的回弹 效果、减速效果等等。
2. 滑动手势限制
- 主要功能实现:
监测滑动的⻆角度,并在⼀一定情况下画线
动画
1. 转场动画
- 系统自带转场动画
- 自定义转场动画 重写 UIViewControllerAnimatedTransitioning
2. UIkit⼒学
在UIKit
中也可以很⽅便地去实现一些物理理效果 UIDynamicAnimator:
封装了底层iOS物理理引擎,为动力项 UIDynamicBehavioer:
动⼒行为,为动力项提供不不同的动力行为 UIDynamicItem:
一个物体,被各种⼒量作用的物体
遇到的坑:
即使是设置完全弹性碰撞,也会损失能量量,导致不不断碰撞⽆无法实现(暂时⽆解)
3. tableview动态插⼊删除
在tableview 的代理理⽅方法 insert 和 delete 中,可以看到有是否有动画的选择,这是⾃自带 UITableViewRowAnimation
4. 下拉刷新
- 思考:
为什什么有那么多库? - 虽然 tableView 和 scrollView 就有⾃自带的下拉刷新,但是⾃自定义程度较低,在实现更更多效果时还需要⾃自定义
以上不完整,本人也需更多学习,还望指正!
上一篇: iOS手势