日常搞事---用故事板擼一個滾動頁面視圖

先上效果圖,如果你覺得還不錯的話,請往下喵多幾眼~喵?

效果圖.gif

實現思路(個人感覺特別Low,但是實用)

界面布局(這里用的是StroyBoard)
主要分為兩部分:
</br>1.頭部視圖(MysegmnetView)

只是布局麻煩了一點..這里的分割線用了點小技巧來寫,其實這個View的背景是灰色的,用白色UIView來放入每一個按鈕然后每個間隔1px這樣就做成了分割線的效果了~再也不用蛋疼的拖一坨1px的View來做分割線了..

</br>2.滾動部分的視圖

這里布局就比較簡單了,我就不多說了,剛開始做的時候,我是利用UIScorllView來做的,做出來的效果之后非常不理想,內存占用大,而且需要For循環添加視圖.所以后來(也就是現在的完成品)就換成了UICollectionView,利用其重用機制來做更加適合.

故事板視圖.png

實現方法
</br>
1.頭部動畫及按鈕高亮思路(這里,比較Low有好的方法記得告訴我)

首先說下MysegmnetView底部滑動條的實現思路:直接初始化一個View,設置其位置 X:0 Y:頭部視圖的高/item的個數 W:里面Item的寬 H:2 (如果你不嫌煩的話,可以在故事板創建,再拉線過來),顏色為灰色,監聽滾動部分的視圖的X變化,實時改變其X的位置,即可以達到聯動的效果.
至于按鈕高亮實現比較Low,設置每次按鈕的Tag值分別為15,每次滾動算出當前的__Page+1__(因為Page是從0開始的),然后根據Tag找出按鈕設置為選中狀態,利用for循環15取消其他按鈕的選中狀態

</br>
2.滾動視圖的實現思路

根據傳入來的VC數組來注冊不同的Cell,其ID為類名,每個Item的Size為父視圖的Frame(self.bounds.size),在這里要注意監聽ScrollView的變化傳回給MysegmnetView至于為什么,前面說了

//控制器數組
private lazy var vcs = [UIViewController]()
//寫一個設置方法用來初始化(因為這里是用故事板來寫的,就不重寫其初始化方法了)
func setPageView(vcs:[UIViewController],parentViewController:UIViewController,segmentView:MySegmentView){
        self.vcs = vcs
        //視圖控制器
        self.parentViewController = parentViewController
       //頭視圖
        self.segmentView = segmentView
        self.segmentView?.delegate = self
        //分別注冊Cell
        self.vcs.forEach{
            self.collectionView.registerClass(UICollectionViewCell.self, forCellWithReuseIdentifier: String($0))
        }
        self.collectionView.reloadData()
    }

上面就搞好現在搞CollectViewItem里面的控制器把

直接上圖,我相信你能懂的(#滑稽)

控制器

寫好之后我們要做的事情就是把這里的控制器視圖全部塞到滾動視圖里面,開搞~

這里我使用的是Extension中的方法

    func initView(){
          self.myPageViewContainer.setPageView(self.setFilterVc(), parentViewController: self,segmentView: self.mySegmentView)
    }
    
    private func setFilterVc()->[UIViewController]{
        let pictrue = StoryboardWithIdentifier("MyPageViewsStoryboard", Identifier: "pictureCollection") as! MyPictrueCollectionViewController
        let collection = StoryboardWithIdentifier("MyPageViewsStoryboard", Identifier: "collection") as! MyCollectionViewController
        let love = StoryboardWithIdentifier("MyPageViewsStoryboard", Identifier: "love") as! MyLoveViewController
        let dynamic = StoryboardWithIdentifier("MyPageViewsStoryboard", Identifier: "dynamic") as! MyDynamicViewController
        let notice = StoryboardWithIdentifier("MyPageViewsStoryboard", Identifier: "notice") as! MyNoticeViewController
        return [pictrue,collection,love,dynamic,notice]
    }

extension NSObject{
 /*!
     根據SB的名字和標識獲取其控制器
     - parameter storyboardName: 故事板名字
     - parameter Identifier:     標識
     
     - returns: Con
     */
    func StoryboardWithIdentifier(storyboardName:String,Identifier:String)-> UIViewController{
        let temStoryboard = UIStoryboard(name: storyboardName, bundle: nil)
        let vc = temStoryboard.instantiateViewControllerWithIdentifier(Identifier)
        return vc
    }
}

代碼部分

MySegmentView.Swift

import UIKit
protocol MySegmentViewDelegate:class{
    func segmentViewMove(index:Int)
}

class MySegmentView: UIView {
    @IBOutlet weak var notice: UIButton!
    @IBOutlet weak var huaerDynamic: UIButton!
    @IBOutlet weak var myCollection: UIButton!
    @IBOutlet weak var love: UIButton!
    @IBOutlet weak var pictureCollect: UIButton!
     var pageTemp = 0
    weak var delegate:MySegmentViewDelegate?
    /// 遮蓋層
    private lazy var coverLayer: UIView = {[unowned self] in
        let cover = UIView(x: 0, y: 38, w:MainW/5, h: 2)
        cover.backgroundColor = UIColor.grayColor()
        return cover
        }()
    
    required init?(coder aDecoder: NSCoder) {
        super.init(coder: aDecoder)
        self.addSubview(self.coverLayer)
    }
    
    func moveToPoint(x:CGFloat,page:Int){
        //防止多次調用
        if page != pageTemp{
            self.pageTemp = page
            self.changeButtonStat(page + 1)
        }
        UIView.animateWithDuration(0.1) {
           self.coverLayer.frame = CGRectMake(x, 38,MainW/5, 2)
        }
    }
    
    @IBAction func segmentViewbuttonTouch(sender:UIButton){
        self.changeButtonStat(sender.tag)
        self.delegate?.segmentViewMove(sender.tag - 1)
    }
    
    private func changeButtonStat(buttonTag:Int){
        //取消之前按鈕的選中狀態
        for i in 1...5{
            let button = self.viewWithTag(i) as! UIButton
            button.selected = false
        }
        //標記目標按鈕
        let selectButton = self.viewWithTag(buttonTag) as! UIButton
        selectButton.selected = true
    }
    
}

MyPageViewContainer.Swift

import UIKit

class MyPageViewContainer: UIView,UICollectionViewDelegate,UICollectionViewDataSource,UICollectionViewDelegateFlowLayout,MySegmentViewDelegate{
    
    private weak var segmentView:MySegmentView?
    private lazy var vcs = [UIViewController]()
    private weak var parentViewController:UIViewController?
    @IBOutlet weak var collectionView:UICollectionView!
    
    func setPageView(vcs:[UIViewController],parentViewController:UIViewController,segmentView:MySegmentView){
        self.vcs = vcs
        self.parentViewController = parentViewController
        self.segmentView = segmentView
        self.segmentView?.delegate = self
        //分別注冊Cell
        self.vcs.forEach{
            self.collectionView.registerClass(UICollectionViewCell.self, forCellWithReuseIdentifier: String($0))
        }
        self.collectionView.reloadData()
    }
    
    func collectionView(collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
        return vcs.count
    }
    
    func collectionView(collectionView: UICollectionView, cellForItemAtIndexPath indexPath: NSIndexPath) -> UICollectionViewCell {
        let vc = self.vcs[indexPath.row]
        let cell = collectionView.dequeueReusableCellWithReuseIdentifier(String(vc), forIndexPath: indexPath)
        vc.view.frame = bounds
        cell.contentView.addSubview(vc.view)
        //讓根VC托管這個控制器
        vc.didMoveToParentViewController(parentViewController)
        return cell
    }
    
    func collectionView(collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAtIndexPath indexPath: NSIndexPath) -> CGSize {
        return self.bounds.size
    }
    
    func collectionView(collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, insetForSectionAtIndex section: Int) -> UIEdgeInsets{
        return UIEdgeInsetsMake(0, 0, 0, 0)
    }
    
    func scrollViewDidScroll(scrollView: UIScrollView) {
        let offset = scrollView.contentOffset
        let page = Int(offset.x / MainW)
        self.segmentView?.moveToPoint(offset.x/5,page:page)
    }
    
    func segmentViewMove(index: Int) {
        if index >= self.vcs.count{return}
        self.collectionView.scrollToItemAtIndexPath(NSIndexPath(forItem: index, inSection: 0), atScrollPosition: UICollectionViewScrollPosition.None, animated: true)
    }
    
}

基本上如果你不嫌煩的話,很多東西都可以用故事板拉線代替~,以上就是這些啦,文章寫的有點Low,不服你來打我啊啊啊啊啊

                                             花早
                                          16年520記
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 227,837評論 6 531
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 98,196評論 3 414
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 175,688評論 0 373
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 62,654評論 1 309
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 71,456評論 6 406
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 54,955評論 1 321
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,044評論 3 440
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,195評論 0 287
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 48,725評論 1 333
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 40,608評論 3 354
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 42,802評論 1 369
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,318評論 5 358
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,048評論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,422評論 0 26
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,673評論 1 281
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,424評論 3 390
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 47,762評論 2 372

推薦閱讀更多精彩內容