hi,all:
在經過了一番猶豫之后,我決定將我自己做的這個小APP的源碼公布給大家:
其出發點是和大家一起學習iOS開發,僅供學習參考之用。之前代碼是托管於gitlab
上的,今天我將其pull到github上來了,大家可以自行下載:git clone git@github.com:lihux/twentyThousandTomatoes.git沒有安裝git或者不會用的童鞋,
請猛戳github地址:https://github.com/lihux/twentyThousandTomatoes,進去之后選
擇download zip下載即可。
Xcode6中極大的增強了IB中自動布局的能力,下面就通過對刺兒頭scrollview進行一次自動布局實戰,看看自動布局在Xcode6中到底值不值得使用:
說UIScrollView是個刺兒頭,實在沒有誇張,這是由於scrollview本身contentSize、contentInsets等復雜的特性導致,蘋果文檔在講autolayout的時候甚至專門拿出一節講如何對scrollview進行自動布局。國外有個哥們曾經那他遇到的布局問題請教蘋果員工,結果花費了40分鍾才得出可行的辦法:
When I had a chance to go talk to an actual Apple Engineer about AutoLayout last week at WWDC, I made sure to go. I thought of my most painful experience using AutoLayout recently – when I was making a login screen with username and password fields on a ScrollView (so it scrolls up when the keyboard comes up) – and had the Apple engineer walk me through the example.......This “simple” solution took the Apple Engineer 40 minutes to solve! However, several senior engineers I know said that they’ve never been able to get AutoLayout working quite right on a ScrollView, so 40 minutes is actually not bad! 【原文地址】
我們要如下圖實現這樣一種布局:
整個視圖一共有三個組件:頭像(UIimageView)、文字(UILabel)、和一個UIScrollView。我們的布局預期是豎屏是整個view采用正常的上下結構;橫屏時則采用左右結構。
調整完view的尺寸后將size class設為(wAny, hCompact)
前面需求中提到,在橫屏模式我們希望中,將頭像和scroll view按照左右順序布局,這樣可以有效的利用屏幕空間,給用戶最好的使用體驗(尤其是iphone6 & plus出來后)。
考慮橫屏的情況,我們不知道屏幕的具體寬度(實際從4s到6 plus可能有4種數值),我們想確定頭像和scroll view 的具體位置,這時,我們又要找一個參照物了,有了參照我們就能很好的確定各自的約束。這種參照物的思想在自動布局中有着廣泛的應用,它可以有效的幫我們降低布局的復雜度、提高布局的靈活性。
我們仍然選取一個view作為參考物or 錨點,我們把它的位置放在整個屏幕的正中間,這個view我們稱之為:middle anchor view,頭像的trailing space和scroll view 的leading space就都可以以這個middle anchor view為錨確定x坐標值了。
接着,頭像和scroll view以及content view的其他約束可以按照豎屏時的思路依次添加。布局完成后如圖所示(紅色view即為anchor view,在布局完成之后可將該view隱藏):
注意,因為前面豎屏的時候我們使用了(wAny, hAny)的寬和高都任意的size class,它包含(wAny, hCompact)這種情況,因此,在上一個size class設置的布局元素在當前的size class中依然都存在,為了防止布局干擾,我們可以將這些布局全部清除掉再重新布局:
可以方便的在storyboard中清除全部約束
全部布局完成后,編譯運行即可獲得前面需求中所示的效果。下面的gif動畫展示了由豎屏到橫屏時autolayout對界面重新布局的效果,相當給力:
本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系我们删除。