在Scrollview中使用AutoLayout
AutoLayout 與 UIScrollView的相遇是一個不可避免的場景,像UITableView、UIWebView這些都是繼承于UIScrollView的,關于它們的autolayout布局大體一致,但還是會有略微不同,而我們這篇討論的主要是其contentSize問題,所以就直接講UIScrollView就OK了。
如上圖,我們將view分為3個部分,上面一部分主要用于展示海報或者一些封面圖片,中間部分用來展示一些基本的信息,比如商品頁面的價格,銷量,分類等比較重要的信息,下面用于展示一些額外的信息,比如推薦給用戶的一些其它商品或者門店等信息。
我們先按之前講的來添加一些contraints,看一下UIScrollView里面添加Constraints有什么區別沒有。 先依次添加約束:
?
1.為上面的橙色view與UIImageview添加高度與上下左右的邊距約束。 2.然后再添加中間藍色view及其內容的高度與上下左右邊距的約束。 3.再添加UISegment的高度與上下左右邊距的約束。 4.再添加底部的UITableView的上下左右邊距約束。我們來看一下IB會怎么處理目前的約束:
Scroll View ,Need constraints for height Scrollable Content Size Ambiguity, Has ambiguous scrollable content height Missing Constraints, Need constraints for : width Scrollable Content Size Ambiguity,Has ambigous content size全是Scrollview的問題,而且意思基本上就是說IB無法確定ScrollView的寬度與高度,我們知道UIScrollView最重要的就是其contentSize的寬高了,如果這個無法確定,那scrollview就無法知曉可以滾動查看的區域。其實這僅僅是表象,IB不會因為contentSize的可見區域不確定而抱怨,因為它會有一個默認的可見區域就是其bounds,其實IB真正抱怨的是其內部的subViews的布局對于它的依賴,比如我們看最上面的橙色View相對于上、左、右的約束都相對于scrollview的。scrollview內部的subViews的約束全依賴于scrollview,這樣子的話,問題就來了,Scrollview和UILabel、UIButton等這些控件一樣都會根據內容調整其contentSize(autolayout布局模式中,UILabel這種控件都會根據內容對自身寬高進行調整),如果Scrollview要根據其subviews來調整自身的contentsize,而其subviews又要根據scrollview的contentsize調整自身的布局,是不是就矛盾了,就成了相互依賴了。
所以IB要求UIScrollview(當然包括繼承于它的UITableview、UIWebview這些控件)的contentSize必須在布局時能夠確定。
由于Scrollview的contentSize由其subviews確定,其subviews的布局依賴于其父視圖Scrollview的邊界。這個矛盾,要不解決前者問題,要不解決后者,即要么不讓UIScrollView的contentSize由其subviews確定,要么就讓ScrollView的subviews不依賴其contentSize(即Scrollview的邊界)。很顯然,我們只能選擇后者,因為前者你無法改變,其實從宏觀上來看,改變了一個就相當于改變了兩個,其實二者并沒有什么特別區別,都是同一個問題導致的。
既然我們想好了策略,就來試一下,如何才能讓Scrollview的subviews不依賴于其邊界呢? 我們首先不考慮subviews的復雜布局情況,我們先把subviews嵌入到一個我們自己添加的ContainerView中,從而把我們的布局任務簡化成Scrollview與ContainerView二者的約束關系,所有之前的subviews我們都放在ContainerView中,則subviews的約束就會僅僅依賴于ContainerView了,這些subviews不再與scrollview有直接關系。
我們雖然簡化了布局任務,但是還是無法繞過Scrollview的ContentSize的邊界確定問題,我們前面已經知道了Scrollview的子視圖不能依賴于ScrollView的邊界,那我們就讓其子視圖不依賴于其邊界即可。 國外有一個網友在遇到上面的問題的時候就咨詢了Apple的工程師,結果他們畫了40分鐘才給出了解決方案,這說明Scrollview在autolayout中的使用真的不是那么簡單。Apple的工程師給出的解決方案就是讓我們的ContainerView建立一個與UIScrollview的父視圖即我們的main view建立一個Equal Width,Equal Height約束,這樣子ContainerView的寬高就不再依賴于ScrollView的邊界了,但是ContainerView還是Scrollview的子視圖,Scrollview的邊界還是沒有確定,我們還要為ContainerView添加與ScrollView的邊界約束,用以幫忙ScrollView確定邊界。
?
OK,我們建立了ContainerView與mainview的equal width與 equal height后,效果果然就是我們想要的。 關于Autolayout與Scrollview相遇的故事,我們就先講到這里,關于布局的場景總是像國際象棋一樣,有數不盡的步驟與結果,連Machine都可以為之苦惱,所以這里只是通過這么一個示例,讓大家對autolayout的布局理念有一個更深入的認識,不要過多的去抓魚,而要學會如何抓魚,抓魚的訣竅是什么,學習一門技術,大家都會有各自的體會與理解,從根本上去掌握技術的原理,以此來應對千變萬化的場景才能事半功倍。
本文示例代碼:本文Demo
為了更好的理解autolayout的原理,推薦閱讀:
Apple工程師如何講解AutoLayout的?
講解視頻地址:Cocoa AutoLaout Video,找名稱為Cocoa Autolayout的那一個視頻。
講稿:Cocoa autolayout PDF
轉載于:https://www.cnblogs.com/yulang314/p/5059201.html
超強干貨來襲 云風專訪:近40年碼齡,通宵達旦的技術人生總結
以上是生活随笔為你收集整理的在Scrollview中使用AutoLayout的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: LinbDesk --- 新的extjs
- 下一篇: 向linux内核加入系统调用新老内核比較