一 拋磚引玉
在iOS的開發(fā)中烹笔,當TableView遇到導航欄后自動下移的解決方案:
1.self.automaticallyAdjustsScrollViewInsets = NO;// 默認是YES
2.self.edgesForExtendedLayout = UIRectEdgeNone;// 推薦使用
3.self.navigationController.navigationBar.translucent = NO; // 默認是YES
很多開發(fā)者都很熟悉這幾句簡單的代碼早处,都知道TableView遇到導航欄后自動下移怎么解決牌里。真正的大牛應該是掌握知識點途蒋,知道運用其能解決什么問題瓷马,做出什么效果糠涛,而不是純粹的copy社搅。
二 庖丁解牛
iOS7開始厉斟,你有幾種方式常見的方式去操作控制器view的布局(控制器就默認添加了全屏屬性)
- edgesForExtendedLayout (默認的值UIRectEdgeAll)
- automaticallyAdjustsScrollViewInsets (默認值YES)
- contentInsetAdjustmentBehavior (UIScrollView屬性)
- extendedLayoutIncludesOpaqueBars (默認值NO)
- edgesForExtendedLayout
字面含義:控制器view的鋪滿樣式挚躯,指定邊緣要延伸的方向,默認UIRectEdgeAll是延伸到整個屏幕的高度擦秽,即使有上有navigationBar,下有tabBar码荔;UIRectEdgeNone是view從navigationBar下tabBar上開始平鋪漩勤,即不透過導航欄和tabBar。
當edgesForExtendedLayout值為UIRectEdgeAll時:
當edgesForExtendedLayout值為UIRectEdgeNone時:
- automaticallyAdjustsScrollViewInsets和contentInsetAdjustmentBehavior
字面含義:視圖里面存在唯一一個UIScrollView或其子類View缩搅,那么它會自動設置相應的內(nèi)邊距越败,決定scroll是否占據(jù)整個視圖。
automaticallyAdjustsScrollViewInsets默認值是YES,contentInsetAdjustmentBehavior默認值是UIScrollViewContentInsetAdjustmentAutomatic硼瓣,即默認是有內(nèi)邊距的究飞。
溫馨小提示:automaticallyAdjustsScrollViewInsets在iOS11已廢除,需要設置contentInsetAdjustmentBehavior才生效堂鲤,為了兼容iOS11亿傅,偷懶的程序員都會擴展一個屬性如autoAdjustsScrollViewInsets內(nèi)部再根據(jù)系統(tǒng)判斷設置哪個。
當automaticallyAdjustsScrollViewInsets默認值是NO(iOS11:contentInsetAdjustmentBehavior默認值是UIScrollViewContentInsetAdjustmentAutomatic)時:
- extendedLayoutIncludesOpaqueBars
字面含義:是否延伸到包含不透明的狀態(tài)欄筑累,默認值是NO袱蜡。蘋果的狀態(tài)欄(status bar)是透明的。如果狀態(tài)欄不透明慢宗,這個試圖就不回擴展到不透明的狀態(tài)欄底部坪蚁,除非將其值設置為YES。
溫馨小提示:如果狀態(tài)欄不透明镜沽,即使你設置edgesForExtendedLayout 為 UIRectEdgeAll敏晤,extendedLayoutIncludesOpaqueBars為NO(默認如此),view不會延伸到狀態(tài)欄底部的
三 靈活應用
需求一:滾動視圖view從導航欄底部開始缅茉,但是在滑動時嘴脾,讓其穿透到導航欄的底部
需求二:滾動視圖view從導航欄底部開始,在滑動時蔬墩,不讓其穿透到導航欄底部
需求三:等等译打,業(yè)務往往有很多種不同的需求
針對需求一只需將edgesForExtendedLayout設置為UIRectEdgeAll且automaticallyAdjustsScrollViewInsets(或者contentInsetAdjustmentBehavior為UIScrollViewContentInsetAdjustmentAutomatic)為YES即可。
針對需求二將edgesForExtendedLayout設置為UIRectEdgeNone即可
雖然內(nèi)容很簡單拇颅,但要掌握其原理奏司,才能應付各種需求,學無止境樟插,只有不斷學習韵洋,程序員才有立足之地。