这事其实挺无聊的。
过程也很是枯燥,只能作为单身狗的消遣。
我们知道,Navigation默认是有需要把手指放在屏幕边缘,才能够使返回动画生效。
从技术角度来讲,这是怎么实现的呢?
首先,只要愿意挖,你最终会找到UIScreenEdgePanGestureRecognizer这么个手势。并确定是这个手势来实现上述效果。
然后,你会分析这个手势。
在这,假设存在一段代码是“开始返回”,另一段代码是“返回中”。
通过直觉,UITouch是一种触发条件。(当然,直觉是马后炮,我猜到最后才猜对)
打印出UIScreenEdgePanGestureRecognizer所有的方法。你可能会注意到这两个方法 touchesBegan:withEvent:
touchesMoved:withEvent:
然后,通过method_exchangeImplementations,把这两个方法截取下,并且用touch的私有api “_locationInWindow ” 将一组touch参数平移到屏幕边缘。
成功。
另外,在navbar隐藏的情况下,返回动画会失效。怎么让他不失效呢?
UIScreenEdgePanGestureRecognizer的delegate是_UINavigationInteractiveTransition。
通过method_exchangeImplementations 可以发现,在隐藏bar的情况下 这个方法gestureRecognizer:shouldReceiveTouch: 会返回NO 。
使用method_exchangeImplementations ,让其永久返回YES。
game over ,通关时间 5小时。代码在这代码
最后,从产品的角度,我认为苹果的实现远远高于全屏返回。