網上有一個UINavgationController+FDFullscreenPopGesture 的分類實現了 UIViewController 能夠在任意方向右滑返回到上移界面。他找個是利用Runtime交換了原生的 pushview 方法,而後自定義手勢代理等。 我要說的今天找個也是添加了一個手勢而後自定義了轉場動畫其中主要用到了一下幾個類:bash
爲UINavgationController 添加側滑手勢動畫
須要實現這兩個代理而後得到者倆對象spa
-(id<UIViewControllerInteractiveTransitioning>)navigationController:(UINavigationController *)navigationController interactionControllerForAnimationController:(id<UIViewControllerAnimatedTransitioning>)animationController**<br>
-(id<UIViewControllerAnimatedTransitioning>)navigationController:(UINavigationController *)navigationController animationControllerForOperation:(UINavigationControllerOperation)operation fromViewController:(UIViewController *)fromVC toViewController:(UIViewController *)toVC
複製代碼
動畫執行的狀態能夠設置取消 成功 progress,3d
這個類是UIViewController轉場動畫實現的必須的幾個協議. 他有一下幾個方法分別是
- (NSTimeInterval)transitionDuration:(nullable id )transitionContext; 返回動畫實現時間戳代理
- (void)animateTransition:(id )transitionContext; 動畫實現上下文動畫主要是在這裏實現的。code
- (id ) interruptibleAnimatorForTransition:(id )transitionContext; 這個方法返回一個執行動畫的對象把 UIView animation 那個方法對象化了。可選實現cdn
- (void)animationEnded:(BOOL) transitionCompleted;對象
得到當前手勢所在的UIView偏移的位置 若是 當前點小於0 則判斷爲右滑。 UINavgationControllerDelegate 須要在專場動畫將要執行的時候進行設置 並在手勢結束後置爲nil,不然可能形成手勢衝突,將interactivePopTransition設置爲0,得到progress即使宜的進度,根據動畫效果來,本動畫實現右滑效果,因此當前手勢所在點佔屏幕百分比就是當前progress。blog
我寫了一個其餘類來實現該動畫首先得到 fromeviewcontroller,toviewcontroller,containerView 和 context,animation
而後設置動畫執行: 下面這段比較 燒腦,反正對於我來講我差很少想了半小時纔想上來 注意着幾個數是怎麼得來的下面我經過一副圖理解。 根據動畫執行的進度來達到匹配效果其實 toview 是偏移了 0.6個屏幕寬度 而 fromview偏移了1個屏幕寬度有些事情其實沒本身想的那麼難