iOS6下實現滑動返回


【轉載請注明出處】

之前在看iOS7滑動返回時,發現了一個iOS6 SDK下的第三方實現,今天偶然間發現了作者在其博客上對該實現的一些心得,讀來深覺之前的思考太過膚淺,許多實際的問題沒有考慮到。帖子鏈接如下:
http://www.vinqon.com/codeblog/?detail/11108

工程github地址如下:

https://github.com/vinqon/MultiLayerNavigation

 

在帖子中作者貼出了實現代碼,此處只說明一下思路和可能產生不兼容的情況,貼別人代碼這么Low的行為還是算了。

代碼中是通過繼承UINavigationController,並在其中添加了一個UIPanGestureRecognizer實現的,大體思路如下:

1、重載pushViewController和popViewController,在push之前,截取當前界面保存為UIImage,在pop之前,移除最近保存的截圖;

2、在UIPanGestureRecognizer的target中,做4件事:

(1)當手勢觸發時(panGestureRecognizer.state == UIGestureRecognizerStateBegan),把最近保存的截圖(通常來說即上一級界面的截圖,特殊情況見下文)放到當前viewController.view的下方;

(2)當手指在屏幕上移動時,相應地修改當前viewController.view.frame,使其下方的截圖逐漸露出;

(3)當手勢結束時(panGestureRecognizer.state ==UIGestureRecognizerStateEnded),調用重載的popViewController;

(4)當手勢取消時(panGestureRecognizer.state ==UIGestureRecognizerStateEnded),將當前viewController.view.frame恢復原樣。

 

如此就基本實現了滑動返回的手勢支持,要進一步加強的,應該說有兩方面:

1、效果上盡可能接近iOS7原生手勢的體驗:

(1)判斷手勢觸發時的位置,只在屏幕邊緣才起作用【Mark:沒有找到具體的數字說明觸發的范圍】;

(2)手勢觸發時修改當前viewController.view及其所有子view的透明度;

(3)導航欄的漸變:當前界面的導航欄漸漸淡出,上一級菜單的導航欄的漸漸清晰。事實上上一級菜單的整個界面都應有一個漸漸清晰的效果,只是導航欄作為多個ViewController共享的部分,需要同時顯示兩種效果確實需要一定當量的腦細胞。(作者在帖子中描述了網易新聞和新浪微博各自的實現)此外,默認的導航欄中生成的左上角返回鍵,其文本就是上一級菜單的主標題,這種情況下“返回會漸漸變成主標題”。

2、實現中沒有考慮的一些因素:
(1)setViewControllers的支持:一次性向棧中加入多個ViewController時,僅僅重載push就顯得無能為力了;

(2)內存的控制:每進入一級界面都需要截取上一級界面,當層級較多時對內存的壓力不小,似乎可以通過降低截取圖的分辨率來達到一定的改善。將截圖保存到disk上也可以,只是在快速進出時,是否會造成卡頓尚未驗證。

(3)對界面中可能造成手勢沖突的兼容:比如UIScrollView就內置了一個panGestureRecognizer,還有UIWebView的手勢支持。

(4)當前界面可能能夠造成上一級界面發生更改:比如更換主題這樣的功能,以截圖的方式來做的話,基本無解。

(5)截圖的方式是直接截取viewController.view,沒有考慮tabbar等情況,在有tabbar的情況下,下方會有一道黑邊。

 

 

【參考】

1、iOS頁面右滑返回交互實現方案

http://www.vinqon.com/codeblog/?detail/11108


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM