UITableView基础
//MARK: -属性
var tableView = UITableView()
//MARK: -生命周期
override func viewDidLoad() {
super.viewDidLoad()
self.createTableView()
print(self.view.bounds)
}
//MARK: -创建tableView
func createTableView() {
//UITableView:UIScrollView
//1.创建tableView对象
//参数2:显示风格
//Grouped -> 分组的
//plain -> 简约的
self.tableView = UITableView(frame: self.view.bounds, style: .Plain)
//2.添加到界面上
self.view.addSubview(tableView)
//3.设置代理
//dataSource代理专门负责管理tableView上显示的数据->想要在tableView上显示数据,必须设置这个代理。
self.tableView.dataSource = self
//4.设置行高
self.tableView.rowHeight = 250
}
}
extension ViewController: UITableViewDataSource {
//一个tableView可以有多个分组,每个分组上有多个cell。默认情况下tableView只有一个分组。
//1.设置每一个的分组的tableView的行数(设置tableView上cell的个数)tableView有多少个分组,每次刷新数据的时候这个方法就会调用多少次。
//参数2:当前分组的下表
//返回值:设置当前分组cell的个数
func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return 20
}
//2.创建指定位置的cell。每次刷新数据,之前设置的cell的个数就是这个方法最多调用总的次数。但是一次刷新,一屏能显示多少个cell,就调用多少次。
//!!!cell的复用原理:每次创建cell的时候先去复用池中查找是否有可以复用的cell;如果有就直接使用,没有就创建新的cell。当cell滑出屏幕以外tableView就会自动将这个cell放在复用池中。复用id的作用就是为了区分复用池中不同样式的cell。
//注意:cell的位置是由"第几组的第几行"这样的形式来确定。
//参数2:cell的位置 indexPath.section->第几组 indexPath.row -> 第几行
//返回值:创建的cell
func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
//1.去复用池中查找是否有可以复用的cell,如果找到了就返回可以复用的cell,找不到就返回nil。
var cell = tableView.dequeueReusableCellWithIdentifier("cell")
//2. 判断是否在复用池中找到可以复用的cell,如果没有找到就创建一个新的cell
if cell == nil {
//print(indexPath.section,indexPath.row)
cell = UITableViewCell.init(style: .Subtitle, reuseIdentifier: "cell")
}
//3.刷新数据
cell?.textLabel?.text = "第\(indexPath.section)组"
cell?.detailTextLabel?.text = "第\(indexPath.row)行"
//4.返回cell
return cell!
}
UITableView属性
//MARK: -属性
//1.tableView
var tableView = UITableView()
//2.数据源数组
lazy var dataArray: [String] = {
//创建空的数组
var tempArray = [String]()
for item in 1...15 {
tempArray.append("36_\(item).jpg")
}
return tempArray
}()
var headerImgView: UIImageView!
//MARK: -方法
override func viewDidLoad() {
super.viewDidLoad()
//1.创建tableView
self.tableView = UITableView.init(frame: self.view.bounds, style: .Plain)
//2.添加到界面上
self.view.addSubview(tableView)
//3.设置代理
self.tableView.dataSource = self
tableViewPerpoty()
}
func tableViewPerpoty() {
//MARK: -hearder相关
//1.设置行高
self.tableView.rowHeight = 150
// //2.设置tableView的header
// //样式1:
// let headerView = UIView.init(frame: CGRectMake(0, 0, 0, 200))
//// headerView.backgroundColor = UIColor.greenColor()
// self.tableView.tableHeaderView = headerView
//样式2:
headerImgView = UIImageView.init(frame: CGRectMake(0, 0, 375, 200))
headerImgView.image = UIImage.init(named: "36_3.jpg")
headerImgView.backgroundColor = UIColor.grayColor()
self.view.addSubview(headerImgView)
self.view.sendSubviewToBack(headerImgView)
self.tableView.backgroundColor = UIColor.clearColor()
// tableView.backgroundView = headerImgView
//设置内容的偏移量
// tableView.contentOffset = CGPointMake(0, -200)
tableView.contentInset = UIEdgeInsetsMake(200, 0, 0, 0)
//3.设置代理
tableView.delegate = self
//MARK: -分割线相关
//4.设置每个cell之间的分割线到tableView左右边距(上和下无效)
//参数:上、左、下、右
tableView.separatorInset = UIEdgeInsetsMake(0, 10, 10, 10)
//设置分割线的风格
//None -> 没有分割线
//tableView.separatorStyle = .None
//设置分割线的颜色
tableView.separatorColor = UIColor.yellowColor()
//5.设置背景视图
let bgImageView = UIImageView.init(frame: CGRectMake(0, 0, 0, 0))
bgImageView.image = UIImage.init(named: "36_7.jpg")
tableView.backgroundView = bgImageView
}
}
//MARK: -tableView Delegate
//注:遵守UITableViewDelegate协议的同时,也遵循了UIScrollViewDelegate
extension ViewController: UITableViewDelegate {
//正在滚动的时候实时调用
func scrollViewDidScroll(scrollView: UIScrollView) {
print(scrollView.contentOffset)
if scrollView.contentOffset.y >= -200 {
return
}
//计算放大后的宽度和高度
let h2 = -scrollView.contentOffset.y
let w2 = self.view.bounds.width*self.headerImgView.frame.size.height/200
self.headerImgView.bounds = CGRectMake(0, 0, w2, h2)
self.headerImgView.center = CGPointMake(self.view.center.x, h2/2)
}
}
//MARK: - tableView DataScource
extension ViewController:UITableViewDataSource {
//1.设置每个分组cell的行数(个数)
func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
//通过数据源数组的元素的个数,设置行数。
return dataArray.count
}
//2.创建cell
func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
//1.去复用池找是否有可以复用的cell
var cell = tableView.dequeueReusableCellWithIdentifier("cell")
//2.判断是否找到可以复用的cell
if cell == nil {
cell = UITableViewCell.init(style: .Subtitle, reuseIdentifier: "cell")
//设置cell的背景颜色为透明
cell?.backgroundColor = UIColor.clearColor()
//设置cell的选中效果
cell?.selectionStyle = .None
}
//3.刷新数据
let imageName = self.dataArray[indexPath.row]
let path = NSBundle.mainBundle().pathForResource(imageName, ofType: nil)
cell?.imageView?.image = UIImage.init(contentsOfFile: path!)
cell?.textLabel?.text = imageName
//4.返回cell
return cell!
}
UITableView协议方法和分组
//MARK: -属性
var tableView = UITableView()
//2.数据源数组
//数据源数组是一个大数组,里面有三个小数组,每个小数组的数组元素是String。
lazy var dataArray: [[String]] = {
var tempArray = [[String]]()
//准备数据
var oneArray = [String]()
var twoArray = [String]()
var threeArray = [String]()
for item in 1...15 {
oneArray.append("15_\(item).jpg")
twoArray.append("18_\(item).png")
threeArray.append("34_\(item).jpg")
}
tempArray = [oneArray,twoArray,threeArray]
return tempArray
}()
//MARK: -生命周期
override func viewDidLoad() {
super.viewDidLoad()
//1.创建对象
self.tableView = UITableView.init(frame: self.view.bounds, style: .Plain)
//2.添加到界面上
self.view.addSubview(tableView)
//设置代理
self.tableView.dataSource = self
self.tableView.delegate = self
}
override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
// Dispose of any resources that can be recreated.
}
}
//MARK: -tableView DataSource
extension ViewController:UITableViewDataSource {
//1.设置给一个分组的cell的个数
//每次刷新有多少个分组就调用多少次
func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
// switch section {
// case 0:
// return 5
// case 1:
// return 10
// default:
// return 8
// }
//拿到当前分组对应的小数组
let smallArray = self.dataArray[section]
//让每个分组的每一行和分组对应的小组的数组元素一一对应。
return smallArray.count
}
//2.创建cell
func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
//1. 去复用池中查找是否有可以复用的cell
var cell = tableView.dequeueReusableCellWithIdentifier("cell")
//2.判断是否找到可以复用的cell,如果没有找到就创建新的cell
if cell == nil {
cell = UITableViewCell.init(style: .Subtitle, reuseIdentifier: "cell")
//显示箭头
cell?.accessoryType = .DisclosureIndicator
//设置cell的选中效果
cell?.selectionStyle = .None
}
//3.刷新数据
//取出当前cell的位置对应数据
//a.拿到当前cell所在组对应的小数组
let smallArray = self.dataArray[indexPath.section]
let imageName = smallArray[indexPath.row]
cell?.textLabel?.text = "第\(indexPath.section)组"
cell?.detailTextLabel?.text = "第\(indexPath.row)列"
cell?.imageView?.image = UIImage.init(contentsOfFile: NSBundle.mainBundle().pathForResource(imageName, ofType: nil)!)
//4.返回cell
return cell!
}
//3.设置tableView 的分组数(默认是1)
//每次刷新这个方法只调用一次
func numberOfSectionsInTableView(tableView: UITableView) -> Int {
return self.dataArray.count
}
//4.设置每个分组的header的标题
func tableView(tableView: UITableView, titleForHeaderInSection section: Int) -> String? {
let str = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
let c = str.characters[str.startIndex.advancedBy(section)]
return "\(c)"
}
//5.
func sectionIndexTitlesForTableView(tableView: UITableView) -> [String]? {
return ["A","B","C","D","E"]
}
}
extension ViewController:UITableViewDelegate {
//1.cell被选中的时候调用的方法
//一般在这个方法中跳转到下一页显示详情
//参数2:被选中的cell的位置
func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) {
print("第\(indexPath.section)组的第\(indexPath.row)行被选中")
}
//2.设置每个cell的高度。通过这个方法可以给不同组不同行的cell设置不一样的高度
//参数2:设置高度的cell的位置
func tableView(tableView: UITableView, heightForRowAtIndexPath indexPath: NSIndexPath) -> CGFloat {
//让第0组的cell的高度是150,其他组的高度是100
if indexPath.section == 0 {
return 150
}
return 100
}
//3.设置分组的header和footer的高度
func tableView(tableView: UITableView, heightForFooterInSection section: Int) -> CGFloat {
return 0
}
//4.设置每个分组的headerview
func tableView(tableView: UITableView, viewForHeaderInSection section: Int) -> UIView? {
let headerView = UIView.init(frame: CGRectMake(0, 0, 0, 0))
headerView.backgroundColor = UIColor.yellowColor()
//在header上添加图片
let imageView = UIImageView.init(frame: CGRectMake(10, 5, 40, 40))
imageView.image = UIImage.init(named: "10_\(section).jpg")
headerView.addSubview(imageView)
return headerView
}
}