搜索
您的当前位置:首页正文

[Swift 3.0 UI学习]-Swift 3.0 创建一个类

来源:二三娱乐

效果图

4513D4C3-04EA-40BD-ADCC-37B7C45681DC.png

MVC

8C6B8192-E02A-4489-8516-51D66751F77A.png
  1. cell模型(cell标题) –> section模型(section标题,是否展开,当前section对应cell的模型数组) –> 把section模型数组赋值到tableView

2.自定义cell(默认的就行,自定义为了达到通用的目的)和继承UITableViewHeaderFooterView的自定义HeaderView,自定义cell中在模型字段的didSet中为控件绑定数据,并且添加一个控件监听点击事件,把点击的结果用闭包传给控制器,实现闪开和收起效果.

3.在控制器中lazy load一个tableView和数据源的数组,并且实现对应数据源和代理方法.

SMHotTableHeader --- headerView

//
//  SMHotTableHeader.swift
//  TestSwift
//
//  Created by 微笑吧・°阳光 on 2016/11/26.
//  Copyright © 2016年  All rights reserved.
//


import UIKit

//HeaderView中定义一个闭包
typealias HeaderViewClickedBack = (Bool) -> Void

class SMHotTableHeader: UITableViewHeaderFooterView {

    var HeaderClickedBack: HeaderViewClickedBack?
    
      var model: SMHotSectionModel? = nil
    
     var sectionModel: SMHotSectionModel? {
        
        didSet {
            textLabel?.text = sectionModel?.sectionTitle
            if ((self.sectionModel!.isExpanded) != false) {
                self.directionImageView.transform = CGAffineTransform.identity
            } else {
                self.directionImageView.transform = CGAffineTransform(rotationAngle: CGFloat(M_PI))
            }
        }
        
    }
    
    
    override init(reuseIdentifier: String?) {
        super.init(reuseIdentifier: reuseIdentifier)
        
        //三角图片
        directionImageView = UIImageView.init(image: UIImage.init(named: "expanded"))
        directionImageView.frame = CGRect(x: kScreenWidth - 30, y: (44 - 8) / 2, width: 15, height: 8)
        contentView.addSubview(directionImageView)
        
        //header 点击按钮
        let button = UIButton.init(frame: CGRect(x: 0, y: 0, width: kScreenWidth, height: 44))
        contentView.addSubview(button)
        button.backgroundColor = UIColor.clear;
        button.addTarget(self, action: #selector(SMHotTableHeader.clickHeader(sender:)), for: UIControlEvents.touchUpInside)
        self.contentView.backgroundColor = SM_RGBColor(22,21,33);
        self.contentView.layer.borderColor = UIColor(red: 43/255, green: 43/255, blue: 62/255, alpha: 1).cgColor;
        self.contentView.layer.borderWidth = 0.5;
    }
    
    //header 点击事件
    func clickHeader(sender: UIButton) {
        sectionModel?.isExpanded = !((sectionModel?.isExpanded)!)
        UIView.animate(withDuration: 0.25) {
            if ((self.sectionModel?.isExpanded)  != false) {
//                CGAffineTransformIdentity
                self.directionImageView.transform = CGAffineTransform.identity
               
            } else {
                self.directionImageView.transform = CGAffineTransform(rotationAngle: CGFloat(M_PI))
            }
        }
        
        if (self.HeaderClickedBack != nil) {
            HeaderClickedBack!((self.sectionModel?.isExpanded)!)
        }
    }
    
    //对象初始化
    private lazy var directionImageView = UIImageView()
    

    
    required init?(coder aDecoder: NSCoder) {
        fatalError("init(coder:) has not been implemented")
    }
    
    

}

SMHotMoreTableCell ----Cell

//
//  SMHotMoreTableCell.swift
//  TestSwift
//
//  Created by 微笑吧・°阳光 on 2016/11/26.
//  Copyright © 2016年  All rights reserved.
//

import UIKit

class SMHotMoreTableCell: UITableViewCell {

    override func awakeFromNib() {
        super.awakeFromNib()
        // Initialization code

    }
    
    var cellModel: SMHotCellModel? {
          didSet {
        textLabel?.text = self.cellModel?.cellTitle
        }
    }
    
    override func setSelected(_ selected: Bool, animated: Bool) {
        super.setSelected(selected, animated: animated)

        // Configure the view for the selected state
    }

}

SMHotSectionModel---SectionModel

//
//  SMHotSectionModel.swift
//  TestSwift
//
//  Created by 微笑吧・°阳光 on 2016/11/26.
//  Copyright © 2016年  All rights reserved.
//

import UIKit


class SMHotSectionModel: NSObject {

    // 定义
    var sectionTitle: String? = nil
    var isExpanded: Bool? = false
        var cellModels: [SMHotCellModel] = []
    class func loadData(finish: (_ models: [SMHotSectionModel]?) -> ())  {
        
        var array = [SMHotSectionModel]()
        var headerTitleArr  = ["基础的UI","基础功能","动效集合","数据处理","常用封装","实战项目"]
        
        
         let diaryList:String = Bundle.main.path(forResource: "headerList", ofType:"plist")!
        let dataDicc:NSMutableDictionary = NSMutableDictionary(contentsOfFile:diaryList)!
        
        let itemArr :NSArray = Array(dataDicc.allValues) as NSArray
        
        
        for i in 0..<itemArr.count {
            let sectionModel = SMHotSectionModel()
            sectionModel.isExpanded = false
            sectionModel.sectionTitle = headerTitleArr[i]
            var cellModels = [SMHotCellModel]()
            let titleArr = itemArr[i]
            for j in 0..<(titleArr as AnyObject).count {
                let cellModel = SMHotCellModel()
                cellModel.cellTitle = String(j)
                cellModels.append(cellModel)
            }
            
            sectionModel.cellModels = cellModels
            array.append(sectionModel)
        }
        
        finish(array)
    }
    
    
}

SMHotCellModel -- CellModel


import UIKit

class SMHotCellModel: NSObject {

     var cellTitle: String? = nil
    
}

headerList.plist 数据源

75F4271D-3622-4A8C-A94E-3DC8C8954E45.png

SMHotMoreViewController

//
//  SMHotMoreViewController.swift
//  TestSwift


import UIKit

class SMHotMoreViewController: UIViewController ,UITableViewDelegate,UITableViewDataSource,UIScrollViewDelegate{
    var pageC :UIPageControl?         //小点
    var SCtimer :Timer?               //定时器
    
    override func viewDidLoad() {
        super.viewDidLoad()

        // Do any additional setup after loading the view.
        self.view.backgroundColor = UIColor.orange
        
        SMHotSectionModel.loadData { (models) in
            self.dataSourceArr = models
        }
        
        view.addSubview(tableView)
        tableView.frame = UIScreen.main.bounds
        
        setUpHeaderView()
        setUpAdScrollView()
        
    }

    //MARK : 表头视图
    func setUpHeaderView() {
        let headView = UIImageView()
        
        headView.frame = CGRect(x: 0, y: 64, width: self.view.frame.width, height:250)
        headView.backgroundColor = UIColor.lightGray
        headView.isUserInteractionEnabled = true
        self.tableView.tableHeaderView = headView
    }
    
    func setUpAdScrollView() {
        let adSCView = UIScrollView()
        adSCView.delegate = self
        
        adSCView.frame = (self.tableView.tableHeaderView?.frame)!
        adSCView.contentSize = CGSize(width: 5 * adSCView.frame.width,height: adSCView.frame.height)
        
        /** 添加轮播图片 */
        //创建图片按钮
        for i in 0 ..< 5 {
            
            let adBtn = UIButton()
            adBtn.frame = CGRect(x: CGFloat(Float(i)) * adSCView.frame.width,y: 0,width: adSCView.frame.width,height: adSCView.frame.height )
            
            adBtn.setBackgroundImage(UIImage(named: String(format: "ad%d.jpg",i + 1)), for: UIControlState.normal)
            
            adSCView.addSubview(adBtn)
        }
        /** 补充设置 */
        adSCView.backgroundColor = UIColor.yellow
        //边缘不弹跳 整页滚动 不出现水平提示
        adSCView.bounces = false
        adSCView.isPagingEnabled = true
        adSCView.showsHorizontalScrollIndicator = true
        adSCView.showsVerticalScrollIndicator = true
        adSCView.isPagingEnabled = true
        adSCView.delegate = self
        self.tableView.tableHeaderView?.addSubview(adSCView)
        
        
        //设置小点的位置大小
        pageC = UIPageControl.init(frame: CGRect(x:kScreenWidth-120,y:200,width:100,height:30))        //设置小点背景色
        pageC?.backgroundColor = UIColor.clear
        //设置小点个数
        pageC?.numberOfPages = 5
        //设置小点当前页码颜色
        pageC?.currentPageIndicatorTintColor = UIColor.white
        //设置小点未选中页码颜色
        pageC?.pageIndicatorTintColor = UIColor.gray
        //设置当前选中页
        pageC?.currentPage = 0
        self.tableView.tableHeaderView?.addSubview(pageC!)
        
//        SCtimer = Timer.scheduledTimer(timeInterval: 3.0, target: self, selector: Selector("adSCViewchange:"), userInfo: nil, repeats: true)

    }
    
    
    func numberOfSections(in tableView: UITableView) -> Int{
        return (self.dataSourceArr?.count)!
    }
    
    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        
        return (self.dataSourceArr![section].isExpanded != false) ? self.dataSourceArr![section].cellModels.count : 0

    }

    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        var cell = tableView.dequeueReusableCell(withIdentifier: "SMHotMoreTableCellid") as? SMHotMoreTableCell
        if cell == nil {
            cell = SMHotMoreTableCell.init(style: UITableViewCellStyle.value1, reuseIdentifier: "SMHotMoreTableCellid")
        }
        cell?.contentView.backgroundColor = SM_RGBColor(28,28,43);
         cell?.contentView.layer.borderColor = UIColor(red: 43/255, green: 43/255, blue: 62/255, alpha: 1).cgColor;
         cell?.contentView.layer.borderWidth = 0.5;
        cell?.cellModel = dataSourceArr![indexPath.section].cellModels[indexPath.row]
        cell?.selectionStyle = UITableViewCellSelectionStyle.none;
        return cell!
    }
    
    func tableView(_ tableView: UITableView, viewForHeaderInSection section: Int) -> UIView? {
        
        var headerView = tableView.dequeueReusableHeaderFooterView(withIdentifier: "SMHotTableHeaderid") as? SMHotTableHeader
        if headerView == nil {
            headerView = SMHotTableHeader.init(reuseIdentifier: "SMHotTableHeaderid")
        }
        headerView?.sectionModel = dataSourceArr![section]
        headerView!.HeaderClickedBack = {
            (isExpanded: Bool) -> Void in
            tableView.reloadSections(NSIndexSet.init(index: section) as IndexSet, with: UITableViewRowAnimation.automatic)
        }
        return headerView!
    }
    
    func tableView(_ tableView: UITableView, heightForHeaderInSection section: Int) -> CGFloat {
        return 50
    }
    
    func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat {
        return 50
    }
    
    
    
//    
//    //定时器执行方法
//    func change(timer :Timer) {
//        
//        if pageC?.currentPage == (pageC?.numberOfPages)! - 1 {
//            pageC?.currentPage = 0
//        } else if (pageC?.currentPage)! < (pageC?.numberOfPages)! - 1 {
//            pageC?.currentPage+
//        }
//        ?.setContentOffset(CGPointMake((CGFloat(pageC!.currentPage + 1)) * SCROLL_WIDTH, 0), animated: false)
//    }
//    
//    //开启定时器
//    func addTimer() {
//        timer = NSTimer.scheduledTimerWithTimeInterval(3.0, target: self, selector: "change:", userInfo: nil, repeats: true)
//    }
//    
//    //关闭定时器
//    func removeTimer() {
//        timer?.invalidate()
//    }
//    
//    //开始拖拽时调用
//    func scrollViewWillBeginDragging(scrollView: UIScrollView) {
//        //关闭定时器
//        removeTimer()
//    }
//    
//    //拖拽结束后调用
//    func scrollViewDidEndDragging(scrollView: UIScrollView, willDecelerate decelerate: Bool) {
//        //开启定时器
//        addTimer()
//    }
//    
//    
//    
//    
    
    
    
    
    
    
    /// 懒加载
    private lazy var dataSourceArr: [SMHotSectionModel]? = nil
    
    private lazy var tableView: UITableView = {
        let tableView = UITableView()
        tableView.delegate = self
        tableView.dataSource = self
        tableView.backgroundColor = SM_RGBColor(22,21,33);
        //去除单元格分隔线
        tableView.separatorStyle = .none
        return tableView
    }()
}

Top