首先,我們新建一個(gè)項(xiàng)目演示一下在Storyboard/xib中利用自動(dòng)布局給UIScrollView子控件添加約束會(huì)出現(xiàn)的問(wèn)題:
1.我們往Main.storyboard中拖入一個(gè)UIScrollView,并給其設(shè)置一個(gè)藍(lán)色背景方便我們調(diào)試,然后設(shè)置水平垂直方向居中,寬高各為200的約束:


2.運(yùn)行程序效果如下:

3.接下來(lái)我們給這個(gè)UIScrollView添加一個(gè)UITextField子控件并設(shè)置其約束:上部間距50,左邊間距20,寬度100,高度30:

一般給控件設(shè)置以上四個(gè)約束即可,但是這里我們發(fā)現(xiàn)界面報(bào)錯(cuò):

其實(shí),這是由于UIScrollView的特殊性造成的,雖然這樣也可以運(yùn)行程序,但是一般不推薦這樣做,如果UIScrollView中存在很多子控件可能會(huì)造成很多未知錯(cuò)誤.
那么怎么解決這個(gè)問(wèn)題呢?
首先,我們需要添加一個(gè)UIView類(lèi)型的控件成為UIScrollView的唯一子控件,并設(shè)置其上下左右間距都為0,這時(shí)候我們發(fā)現(xiàn)設(shè)置完四個(gè)約束后仍然會(huì)報(bào)錯(cuò),這里我們就來(lái)解釋一下UIScrollView的特殊性:其實(shí)UIScrollView要想實(shí)現(xiàn)滾動(dòng),必須設(shè)置其滾動(dòng)區(qū)域contentSize,而這里UIScrollView的滾動(dòng)區(qū)域是由其子控件的內(nèi)容決定的,所以這里我們先添加一個(gè)UIView成為UIScrollView的唯一子控件,并設(shè)置其上下左右約束均為0,然后設(shè)置UIView的寬度為300(這個(gè)高度就是UIScrollView的內(nèi)容寬度: contentSize.weight),在設(shè)置垂直居中,然后運(yùn)行程序就會(huì)看到UIScrollView可以左右滾動(dòng)了.



同理,如果要想上下滾動(dòng)就將UIView的高度約束設(shè)置成300(這個(gè)高度就是UIScrollView的內(nèi)容高度: contentSize.height),水平居中就可以了.


如果要想上下左右都可以滾動(dòng),那么就將寬高約束都設(shè)置為300.不用設(shè)置水平和垂直居中.

4.接下來(lái)所有的控件都添加到UIView中即可利用自動(dòng)布局來(lái)設(shè)置約束.
