初识 swift app 首页常用模块之 分类

一、介绍

  上一篇《初识 swift 封装轮播图》介绍的是首页常用模块-图片轮播效果。

  在这一篇将介绍另外一个常用的模块 分类 、常用app 你就会发现 58、美团、淘宝、京东 都回有这样一个模块。接下来以美团为例子

二、知识点

  相比较上一篇 这里主要用到泛型、二维数组,

      实现的只是一个定义好的 两行四列的数组、 对于有其他要求的改动可以直接修改代码来实现

三、功能实现

      先上效果图:

      下面还是直接上代码:定义了一个自定义类 MType 包含三个属性{init(title:String,imageName:String,type:String)}

protocol HomeTypeDelegate:NSCoding{
    
}

class HomeType: UIView,UIScrollViewDelegate {
    
    private var arrayData:Array<Array<MType>>?;
    private var mainScroll:UIScrollView?;
    private var pageControl:UIPageControl?;
    
    private var _itemSize:CGSize=CGSizeMake(screen_width/4, 80.0);
    private var titleHeight:CGFloat=15.0;
    private var _hiddenPageControl:Bool=false;
    private var _contentHorizontalAlignment:UIControlContentHorizontalAlignment=UIControlContentHorizontalAlignment.Center
    
    
    override init(frame: CGRect) {
        super.init(frame: frame);
        self.arrayData = [[MType]]()
        self.queryData();
        
        self.mainScroll = UIScrollView(frame: CGRectMake(0, 0, screen_width, frame.size.height));
        self.pageControl = UIPageControl();
        
        self.layoutUI();
    }
    
    required init(coder aDecoder: NSCoder) {
        super.init(coder: aDecoder);
    }
    
    //MARK: ======================================================== 试图布局
    private func layoutUI(){
        self.mainScroll?.showsHorizontalScrollIndicator = false;
        self.mainScroll?.showsVerticalScrollIndicator = false;
        self.mainScroll?.scrollsToTop = false;
        self.mainScroll?.pagingEnabled = true;
        self.mainScroll?.delegate = self;
        
        for(var i:Int=0;i<self.arrayData!.count;i++){
            let arrayEmpty=self.arrayData![i]
            let emptyViewFrame:CGRect = CGRectMake(screen_width*CGFloat(i), 0, screen_width, self.frame.size.height);
            let emptyView:UIView = UIView(frame: emptyViewFrame)
            self.mainScroll?.addSubview(emptyView)
            let row:Int = Int(self.bounds.size.height / _itemSize.height)
            for(var y:Int=0;y<row;y++){
                let column:Int = Int(screen_width/_itemSize.width);
                for(var x:Int=0;(x < column && (y*column+x)<arrayEmpty.count );x++){
                    let itemRect = CGRectMake(screen_width * CGFloat(x)/CGFloat(column), self.bounds.size.height * CGFloat(y)/CGFloat(row), screen_width / CGFloat(column), self.bounds.size.height / CGFloat(row))
                    let btn:UIButton = UIButton.buttonWithType(UIButtonType.Custom) as! UIButton
                    btn.frame=itemRect;
                    btn.setTitleColor(UIColor.clearColor(), forState: UIControlState.Normal)
                    btn.setTitle(arrayEmpty[y*column+x].title, forState: UIControlState.Normal)
                    btn.addTarget(self, action: Selector("homTypeTouch:"), forControlEvents: UIControlEvents.TouchUpInside)
                    
                    let ico = UIImageView(frame: CGRectMake((itemRect.size.width-50)/2, (itemRect.height-20-50)/2, 50, 50))
                    ico.image=UIImage(named: arrayEmpty[y*column+x].imageName)
                    btn.addSubview(ico)
                    
                    let label = UILabel(frame: CGRectMake(0, 55, itemRect.size.width, 20))
                    label.text = arrayEmpty[y*column+x].title
                    label.textAlignment=NSTextAlignment.Center
                    label.contentMode = UIViewContentMode.Bottom
                    label.font = UIFont.boldSystemFontOfSize(14.0)
                    label.textColor = UIColor(red: 86/255.0, green: 86/255.0, blue: 86/255.0, alpha: 1.0)
                    btn.addSubview(label)
                    emptyView.addSubview(btn)
                }
            }
        }
        self.mainScroll?.contentSize = CGSizeMake(screen_width*CGFloat(self.arrayData!.count), self.frame.size.height);
        self.addSubview(self.mainScroll!);
        self.contentHorizontalAlignment = _contentHorizontalAlignment;
        self.pageControl!.currentPage=0;
        self.pageControl!.pageIndicatorTintColor = UIColor(red: 155/255.0, green:  155/255.0, blue:  155/255.0, alpha: 1.0);
        self.pageControl!.currentPageIndicatorTintColor=UIColor.blueColor();
        self.pageControl!.userInteractionEnabled = false;
        self.pageControl?.hidden=self.hiddenPageControl;
        self.pageControl?.numberOfPages = self.arrayData!.count;
        self.addSubview(self.pageControl!);
        
    }
    
    //MARK: ======================================================== 数据源
    private func queryData(){
        var arrayEmpty:Array<MType>=[MType]();
        arrayEmpty.append(MType(title: "新闻", imageName: "ico_type_news", type: "News"));
        arrayEmpty.append(MType(title: "微视频", imageName: "ico_type_video", type: "MicroVideo"));
        arrayEmpty.append(MType(title: "商家", imageName: "ico_type_store", type: "Store"));
        arrayEmpty.append(MType(title: "旅游", imageName: "ico_type_tourism", type: "Tourism"));
        arrayEmpty.append(MType(title: "影院", imageName: "ico_type_film", type: "Film"));
        arrayEmpty.append(MType(title: "公交", imageName: "ico_type_bus", type: "Bus"));
        arrayEmpty.append(MType(title: "查违章", imageName: "ico_type_break", type: "Break"));
        arrayEmpty.append(MType(title: "水电燃", imageName: "ico_type_fire", type: "Water"));
        arrayData?.append(arrayEmpty);
        arrayEmpty = [MType]();
        arrayEmpty.append(MType(title: "新闻", imageName: "ico_type_news", type: "News"));
        arrayEmpty.append(MType(title: "微视频", imageName: "ico_type_video", type: "MicroVideo"));
        arrayEmpty.append(MType(title: "商家", imageName: "ico_type_store", type: "Store"));
        arrayEmpty.append(MType(title: "旅游", imageName: "ico_type_tourism", type: "Tourism"));
        arrayEmpty.append(MType(title: "影院", imageName: "ico_type_film", type: "Film"));
        arrayEmpty.append(MType(title: "公交", imageName: "ico_type_bus", type: "Bus"));
        arrayEmpty.append(MType(title: "查违章", imageName: "ico_type_break", type: "Break"));
        arrayEmpty.append(MType(title: "水电燃", imageName: "ico_type_fire", type: "Water"));
        arrayData?.append(arrayEmpty);
    }
    
    
    //MARK: ======================================================== UIScrollView 协议实现
    func scrollViewDidScroll(scrollView: UIScrollView) {
        var pageWidth:CGFloat = scrollView.frame.size.width;
        var page:Int = Int(((scrollView.contentOffset.x - pageWidth/2 ) / pageWidth)+1);
        pageControl!.currentPage=page;
        
    }
    
    func scrollViewDidEndDecelerating(scrollView: UIScrollView) {
        var page:Int = self.pageControl!.currentPage;
        self.mainScroll?.scrollRectToVisible(CGRectMake(CGFloat(self.frame.size.width*CGFloat(page)),0,self.frame.size.width,self.frame.size.height), animated: false);
    }
    
    //MARK: ======================================================== Selector
    @objc private func homTypeTouch(sender:UIButton){
         //点击事件
    }
    
    //MARK: ======================================================== 属性封装
    var hiddenPageControl:Bool{
        get{return _hiddenPageControl}
        set{
            _hiddenPageControl = newValue;
            if pageControl != nil {
                self.pageControl?.hidden=_hiddenPageControl;
            }
        }
    }
    
    var contentHorizontalAlignment:UIControlContentHorizontalAlignment{
        get{ return _contentHorizontalAlignment }
        set{
            _contentHorizontalAlignment = newValue;
            let size:CGSize =   self.pageControl!.sizeForNumberOfPages(self.arrayData!.count)
            switch _contentHorizontalAlignment {
            case   UIControlContentHorizontalAlignment.Center :
                self.pageControl?.center=CGPointMake(self.center.x, self.frame.size.height-self.titleHeight+self.titleHeight/2)
                break;
            case UIControlContentHorizontalAlignment.Left :
                self.pageControl?.frame.origin.x=size.width/2;
                break;
            case UIControlContentHorizontalAlignment.Right :
                self.pageControl?.frame.origin.x=self.frame.size.width-size.width/2
                break;
            default:
                break;
            }
        }
    }
    var itemSize:CGSize{
        get{ return _itemSize}
        set {
            _itemSize = newValue;
        }
    }
    
}

 

四、总结

   相比上一篇<初识 swift 封装轮播图>用到了自定类、泛型、二维数组。还有就是在 scrollview+pagecontrol 控制分页上有些许区别。

posted @ 2015-09-02 11:30  每周报  阅读(498)  评论(1编辑  收藏  举报