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

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

效果圖.gif

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

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

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

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

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

故事板視圖.png

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

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

</br>
2.滾動視圖的實現(xiàn)思路

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

//控制器數(shù)組
private lazy var vcs = [UIViewController]()
//寫一個設(shè)置方法用來初始化(因為這里是用故事板來寫的,就不重寫其初始化方法了)
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()
    }

上面就搞好現(xiàn)在搞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{
 /*!
     根據(jù)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){
        //防止多次調(diào)用
        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){
        //取消之前按鈕的選中狀態(tài)
        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記
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市恋拍,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌藕甩,老刑警劉巖,帶你破解...
    沈念sama閱讀 222,104評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件狭莱,死亡現(xiàn)場離奇詭異,居然都是意外死亡贩毕,警方通過查閱死者的電腦和手機悯许,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,816評論 3 399
  • 文/潘曉璐 我一進店門辉阶,熙熙樓的掌柜王于貴愁眉苦臉地迎上來瘩扼,“玉大人,你說我怎么就攤上這事集绰」嫒瑁” “怎么了栽燕?”我有些...
    開封第一講書人閱讀 168,697評論 0 360
  • 文/不壞的土叔 我叫張陵,是天一觀的道長碍岔。 經(jīng)常有香客問我浴讯,道長蔼啦,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 59,836評論 1 298
  • 正文 為了忘掉前任,我火速辦了婚禮奈籽,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘衣屏。我一直安慰自己躏升,他們只是感情好狼忱,可當我...
    茶點故事閱讀 68,851評論 6 397
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著藕赞,像睡著了一般成肘。 火紅的嫁衣襯著肌膚如雪斧蜕。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,441評論 1 310
  • 那天批销,我揣著相機與錄音,去河邊找鬼均芽。 笑死丘逸,一個胖子當著我的面吹牛掀宋,可吹牛的內(nèi)容都是我干的深纲。 我是一名探鬼主播劲妙,決...
    沈念sama閱讀 40,992評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼镣奋!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起侨颈,我...
    開封第一講書人閱讀 39,899評論 0 276
  • 序言:老撾萬榮一對情侶失蹤余赢,失蹤者是張志新(化名)和其女友劉穎哈垢,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體温赔,經(jīng)...
    沈念sama閱讀 46,457評論 1 318
  • 正文 獨居荒郊野嶺守林人離奇死亡蛤奢,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,529評論 3 341
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了啤贩。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,664評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡痹屹,死狀恐怖章郁,靈堂內(nèi)的尸體忽然破棺而出志衍,到底是詐尸還是另有隱情暖庄,我是刑警寧澤楼肪,帶...
    沈念sama閱讀 36,346評論 5 350
  • 正文 年R本政府宣布,位于F島的核電站春叫,受9級特大地震影響肩钠,放射性物質(zhì)發(fā)生泄漏暂殖。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 42,025評論 3 334
  • 文/蒙蒙 一呛每、第九天 我趴在偏房一處隱蔽的房頂上張望踩窖。 院中可真熱鬧晨横,春花似錦、人聲如沸颓遏。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,511評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽坪稽。三九已至曼玩,卻和暖如春窒百,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背篙梢。 一陣腳步聲響...
    開封第一講書人閱讀 33,611評論 1 272
  • 我被黑心中介騙來泰國打工顷帖, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人贬墩。 一個月前我還...
    沈念sama閱讀 49,081評論 3 377
  • 正文 我出身青樓,卻偏偏與公主長得像陶舞,于是被迫代替她去往敵國和親嗽测。 傳聞我的和親對象是個殘疾皇子肿孵,可洞房花燭夜當晚...
    茶點故事閱讀 45,675評論 2 359

推薦閱讀更多精彩內(nèi)容