今天逛微博,看到有人想實(shí)現(xiàn)這個效果,我就試了試,感覺效果還行,但是因?yàn)榕R時做的,樣子太丑了。
地址:https://github.com/xxycode/wxTabBar
最終實(shí)現(xiàn)效果圖:
思路就是scrollView結(jié)合containerView來實(shí)現(xiàn),支持橫屏效果。
現(xiàn)在進(jìn)入正題
首先,打開Xcode,新建一個項(xiàng)目
這樣的:
然后往ViewController上面拖一個View,用來當(dāng)做tabBar,并加上如圖約束:
然后再拖入一個scrollView,加上如圖約束
接下來,就要開始使用containerView了,這里以四個ViewController為例,在scrollView里面并排放入四個containerView,containerView在右邊控件框的靠下邊部分:
你會發(fā)現(xiàn),每拖一個containerView,都會多出一個連線,這個連線連著一個ViewController,拖完四個之后就是這樣了:
然后新建四個類,分別是FirstViewController、SecondViewController、ThirdViewController、FouthViewController:
并在故事板中給四個ViewController分別關(guān)聯(lián)這四個類:
為了等下能看到比較明顯的效果,給四個ViewController的view加上不同的背景色,并插入一個Lable顯示自己的名字:
然后分別給四個containerView加上約束,他們的大小要相對于View,這樣才能確定scrollView的contentSize,個人覺得這個AutoLayout的一個坑,初學(xué)者容易遇到錯誤,就是無法確定scrollView的contentSize,點(diǎn)擊第一個containerView,按下control鍵把線往viewController的view上拉,選擇Equal Widths和Equal Height,但是這里我們不希望containView的和viewController的高度是一樣的,因?yàn)槲覀兿旅孢€有一個tabBar,所以要比view的高度少44,我們在右邊的約束欄里面的高度約束那里填入-44:
然后分別給其他三個containerView加上同樣的大小約束,接下來,給這四個containerView加上位置約束,如圖:
但是這里要注意最后一個(最右邊的一個),還要加上右邊的約束才行,加了右邊的約束,AutoLayout就能確定scrollView的contentSize了,不然會報錯的。如圖:
好了加好約束了,我們運(yùn)行一下,效果如下圖:
已經(jīng)有點(diǎn)樣子了,哈哈,現(xiàn)在設(shè)置一下scrollView的一些屬性:
然后給tabBar加上四個按鈕,給它們設(shè)置選中時候的樣式,設(shè)置tag值 1~4
然后上約束
然后把每個按鈕的位置約束中的左邊間距約束拉進(jìn)代碼里面:
我代碼里面的命名可以無視,隨便命名的,為了讓四個按鈕等間距并且在屏幕旋轉(zhuǎn)的時候如此,加上下面代碼
代碼應(yīng)該比較好理解(按鈕的寬度是46)。
然后給按鈕拉一個動作進(jìn)代碼,四個按鈕可以綁定到一個方法上:
把scrollView拖進(jìn)來,叫做containerScrollView,申明一個全局的變量selectedIndex用來記錄當(dāng)前選中的是第幾個viewController
現(xiàn)在加上下面代碼
這里如果吧scrollView的setContentOffset的第二個參數(shù)換成true,點(diǎn)擊按鈕的時候就會有動畫切換效果,這里遵循微信的效果,我就默認(rèn)是不用動畫。
然后就是scrollView滾動的時候也要改變tabBar按鈕的狀態(tài)以及剛開始選中第一個按鈕,這里就要實(shí)現(xiàn)scrollView的代理了
加上下面代碼:
至此,整個效果就得到了簡單的實(shí)現(xiàn),由于使用了AutoLayout,對各個設(shè)備(包括iPad)的支持都是很好的,又做了代碼的適配,所以各個屏幕方向都支持。當(dāng)然如果想做成通用的可以使用這個思路封裝一下。個人感覺這個思路是最容易想到的,第一次寫博客,寫的不好的地方,大家多多包涵。我的微博@我是叉叉歪