markdown真的是很好用,因為是寫的第一篇文章,所以著重強調一下,讓人注重寫作而不是注重排版.關于markdown的入門大家可以看這個文章-獻給寫作者的 Markdown 新手指南
在項目中,分段控制器是個再常見不過的控件,但是官方自帶的分段控制器太過簡單,已無法滿足需求.所以自己寫了一個實時過度動畫的分段控制器.
效果如下

2016-11-01 14_13_00.gif
下面說實現(xiàn)的思路
- 實現(xiàn)segment上面的按鈕

QQ20161101-1@2x.png
簡單的布局,如果按鈕很多的話,用個for循環(huán),很基礎的東西.我這里用的是view,用的點擊手勢做事件處理,用tag區(qū)分.用button也可,因為這里只需要展示沒有選中時的狀態(tài).所以用UIView也很簡單,不需要用button,為什么只有一種未選中的狀態(tài),下面會說到.
- 創(chuàng)建與上面按鈕相關聯(lián)的scrollView,就是下面的頁面.

Paste_Image.png
創(chuàng)建用來顯示各個頁面的scrollView,看需求,大多數(shù)直接用屏幕寬度xsegment的按鈕數(shù),計算總體的頁面的frame;
//大scrollView,用來展示各個controller的view
self.mainScrollView=[[UIScrollView alloc]initWithFrame:CGRectMake(0, self.baseView.height, self.width, self.height-self.baseView.bottom)];
self.mainScrollView.delegate=self;
//整頁滾動以及禁止反彈
self.mainScrollView.pagingEnabled=YES;
self.mainScrollView.bounces=NO;
[self addSubview:self.mainScrollView];
//設置contentsize大小
self.mainScrollView.contentSize=CGSizeMake(conArray.count*self.width, self.height-self.backview.bottom-7);
//controllerArray是傳過來controller數(shù)組,將每個controller的view添加到scrollView上面
for (int i=0; i<conArray.count; i++) {
UIViewController*VC=conArray[i];
VC.view.frame=CGRectMake(i*self.mainScrollView.width, 0, self.mainScrollView.width, self.mainScrollView.height);
[self.mainScrollView addSubview:VC.view];
}
-
重點就是這個過度效果,我會主要說明這個
上面創(chuàng)建分段控制器button的時候說過只需要創(chuàng)建未選中時候的狀態(tài),現(xiàn)在要創(chuàng)建一個用來展示選中狀態(tài)的scrollView,為了方便我叫他遮罩視圖.
遮罩的frame就是一個按鈕的大小,contentsize是整個上面按鈕欄的大小.
將這個遮罩完全覆蓋第一個按鈕的位置.就形成了選中狀態(tài).

遮罩的frame.png

遮罩的contentsize
一句話說明,在手指滑動下面大的scrollView的同時,讓遮罩視圖的frame與contentOffSet跟著下面的視圖同時更改
然后將遮罩的contentView設置成跟后面未選中狀態(tài)一樣的布局.將顏色字體更改成選中的狀態(tài).設置scrollView的代理,在滑動頁面,更改遮罩的位置frame,并且同時更改遮罩的contentOffset,這里要加上uiview animation的動畫,這樣就實現(xiàn)了想要的效果.下面代碼并不是全部代碼,只是這一部分的代碼
//在左右滑動頁面的時候,同時滑動遮罩scrollView,并且設置contentoffset;一系列計算…俗稱好屌算啊握草
-(void)scrollViewDidScroll:(UIScrollView *)scrollView{
if(scrollView == self.mainScrollView){
[self.zheZhaoScroll setFrame:CGRectMake(scrollView.contentOffset.x*(self.zheZhaoScroll.width/SWIDTH), self.zheZhaoScroll.top, self.zheZhaoScroll.width,self.zheZhaoScroll.height)];
[self.zheZhaoScroll setContentOffset:CGPointMake(scrollView.contentOffset.x*(self.zheZhaoScroll.width/SWIDTH), 0)];
}
}
- 點擊事件的處理也這里就不細說了,還有個重點上滑隱藏segment,下滑顯示
-(void)slideUpOrDown:(UIScrollView*)scrollView
{
if (scrollView.contentOffset.y > self.sonOldOffset) {//如果當前位移大于緩存位移,說明scrollView向上
POSTUP;
}else
{
POSTDOWN;
}
self.sonOldOffset = scrollView.contentOffset.y;//將當前位移變成緩存位移
}
這樣基本就完成了.