日常搞事---用故事板撸一个滚动页面视图

先上效果图,如果你觉得还不错的话,请往下喵多几眼~喵?

效果图.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阅读 211,817评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,329评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,354评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,498评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,600评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,829评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,979评论 3 408
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,722评论 0 266
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,189评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,519评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,654评论 1 340
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,329评论 4 330
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,940评论 3 313
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,762评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,993评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,382评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,543评论 2 349

推荐阅读更多精彩内容