ios自定義帶過渡效果的segment分段控制器

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;//將當前位移變成緩存位移
}

這樣基本就完成了.

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內容

友情鏈接更多精彩內容