效果图
4513D4C3-04EA-40BD-ADCC-37B7C45681DC.pngMVC
8C6B8192-E02A-4489-8516-51D66751F77A.png- 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.pngSMHotMoreViewController
//
// 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
}()
}