iOS 6(及以下版本)的Navigation手势pop

iOS 7 里面的UINavigationController里面新增了一个interactiveGestureRecognizer。如果不自定义leftBarButton的话,它会自动生效,如果自定义leftBarButton的话,就要麻烦一点,自己弄一个delegate,不过需要很小心,因为我已经碰到了好几个bug related to interactiveGestureRecognizer。比如多个NavigationController一起使用的话会出现界面死锁,push没完成的适合划一下,会导致navigation bar错乱等等。

Anyway,现在讲一下怎么在iOS6上面实现这个效果。原始代码我在https://gist.github.com/siqin/7579845 找到的,不过这串代码有点问题,我改了改。

原理是障眼法——这个方法在很多控件里面都用到了——自定义UINavigationController,在它的view下方插一个UIImageView。在UINavigationController push的时候,对当前屏幕生成一个snapshot,保存到自己设定的snapshot栈里面去。那个UIImageView里面显示栈顶图片。UINavigationController本身的View增加一个pan gesture recogniser。在手指滑动的时候,把UINavigationController.view进行位移,露出后面的UIImageView,这样就出现滑动效果了。等滑到底或者滑到预设的pop阈值后松手时,在动画完成后,马上执行对navigationController.view的frame的重设,并且pop without animation。这一系列的障眼法看上去就跟真的似的。

完整代码: https://gist.github.com/hikui/8160076

No Comments

Post a Comment