UITableView
繼承自UIScrollview有滾動視圖的特性
1.創(chuàng)建一個UITableView的對象
2.添加到視圖上
3.設(shè)置dataSource的代理,這個空間必須要通過代理才能使用
在代理里面必須要調(diào)用兩個方法
(1).numberOfRowsInSection->設(shè)置當(dāng)前組有多少個cell
(2).cellForRowAtIndexPath->創(chuàng)建cell要調(diào)用的方法
創(chuàng)建cell的步驟
一:去復(fù)用池找是否有可以復(fù)用的對象
var cell = tableView.dequeueReusableCellWithIdentifier("cell")
關(guān)于復(fù)用池芽唇,當(dāng)前屏幕能顯示的個數(shù)加一個就是所需要自己創(chuàng)建的顾画,在滑動時從屏幕消失的都進(jìn)入復(fù)用池回收,所以內(nèi)存的消耗比較小
二:如果在復(fù)用池找不到可復(fù)用的對象匆笤,我們就需要自己創(chuàng)建cell
if cell == nil {
print("\(indexPath.section),\(indexPath.row)")
cell = UITableViewCell.init(style: .Subtitle, reuseIdentifier: "cell")
}
三:去刷新數(shù)據(jù)
四:返回cell
代理的完整代碼
extension ViewController:UITableViewDataSource{
//一個tableView可以有多個分組研侣,每個分組上有多個cell。默認(rèn)情況下tableView只有一個分組
//1.設(shè)置tableView每一個分組的的行數(shù)(設(shè)置tableView上cell的個數(shù))炮捧。tableView有多少個分組庶诡,每次刷新數(shù)據(jù)的時候這個方法就會調(diào)用多少次
//參數(shù)2:當(dāng)前分組的下標(biāo)
//返回值:設(shè)置的當(dāng)前分組的cell的個數(shù)
func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int{
return 20000
}
//2.創(chuàng)建指定位置的cell。每次刷新數(shù)據(jù)咆课,之前設(shè)置的cell的總個數(shù)就是這個方法最多調(diào)用總的次數(shù)末誓。但是一次刷新,一屏能顯示多少個cell书蚪,就調(diào)用多少次
//!!!!cell的復(fù)用原理:每次創(chuàng)建cell的時候先去復(fù)用池中查找是否有可以復(fù)用的cell基显;如果有就直接使用,沒有就創(chuàng)建新的cell善炫。當(dāng)cell滑出屏幕以外tableView就會自動將這個cell放到復(fù)用池中撩幽。復(fù)用id作用就是區(qū)分復(fù)用池中不同樣式的cell
//注:cell的位置是由“第幾組的第幾行”這樣的形式來確定
//參數(shù)2:cell的位置 indexPath.section->第幾組 indexPath.row->第幾行
//返回值:創(chuàng)建的cell
func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell{
//1.去復(fù)用池中查找是否有可以復(fù)用的cell.如果找到了就返回可以復(fù)用的cell,找不到就返回nil
var cell = tableView.dequeueReusableCellWithIdentifier("cell")
//2.判斷是否在復(fù)用池中找到可以復(fù)用的cell,如果沒有找到就創(chuàng)建一個新的cell
if cell == nil {
print("\(indexPath.section),\(indexPath.row)")
cell = UITableViewCell.init(style: .Subtitle, reuseIdentifier: "cell")
}
//3.刷新數(shù)據(jù)
cell?.textLabel?.text = "第\(indexPath.section)組"
cell?.detailTextLabel?.text = "第\(indexPath.row)行"
//4.返回cell
return cell!
}
tableView的一些常用屬性
//1.設(shè)置行高
self.tableView.rowHeight = 150
//MARK: - header相關(guān)
//2.設(shè)置tableView的header
//樣式1:
let headerView = UIView.init(frame: CGRectMake(0, 0, 0, 200))
headerView.backgroundColor = UIColor.yellowColor()
let imageView = UIImageView.init(frame:CGRectMake(0, 0, 0, 200))
imageView.image = UIImage.init(named: "2_9.jpg")
//self.tableView.tableHeaderView = imageView
//樣式2:
headerImageView = UIImageView.init(frame: CGRectMake(0, 0, self.view.bounds.width, 200))
headerImageView.backgroundColor = UIColor.redColor()
headerImageView.image = UIImage.init(named: "2_3.jpg")
self.view.addSubview(headerImageView)
self.view.sendSubviewToBack(headerImageView)
self.tableView.backgroundColor = UIColor.clearColor()
//設(shè)置內(nèi)容偏移量
tableView.contentInset = UIEdgeInsetsMake(200, 0, 0, 0)
//3.設(shè)置代理
tableView.delegate = self
//MARK: - 分割線相關(guān)
//4.設(shè)置每次cell之間的分割線到tableView左右邊距(上和下無效)
//參數(shù):上、左箩艺、下窜醉、右
tableView.separatorInset = UIEdgeInsetsMake(0, 10, 0, 10)
//設(shè)置分割線的風(fēng)格
//None -> 沒有分割線
tableView.separatorStyle = .SingleLine
//設(shè)置分割線的顏色
tableView.separatorColor = UIColor.redColor()
//5.設(shè)置背景視圖
let bgImageView = UIImageView.init(frame: CGRectMake(0, 0, 0, 0))
bgImageView.image = UIImage.init(named: "2_5.jpg")
tableView.backgroundView = bgImageView
================delegate代理===========
//注:遵守UITableViewDelegate協(xié)議的同時,也遵守了UIScrollViewDelegate
extension ViewController:UITableViewDelegate{
//正在滾動的時候?qū)崟r調(diào)用
func scrollViewDidScroll(scrollView: UIScrollView) {
if scrollView.contentOffset.y >= -200 {
return
}
//計算放大后的寬度和高度
let h2 = -scrollView.contentOffset.y
let w2 = self.view.bounds.width*self.headerImageView.frame.size.height/200
self.headerImageView.frame = CGRectMake(0, 0, w2, h2)
self.headerImageView.center = CGPointMake(self.view.center.x, h2/2)
}
}
===========cell的屬性==========
//設(shè)置cell的背景顏色為透明
cell?.backgroundColor = UIColor.clearColor()
//設(shè)置cell的選中效果
cell?.selectionStyle = .None
//顯示箭頭
cell?.accessoryType = .DisclosureIndicator
tableView的協(xié)議方法和分組
==============分組======
//3.設(shè)置tableView的分組數(shù)(默認(rèn)是1)
//每次刷新這個方法只調(diào)用一次
func numberOfSectionsInTableView(tableView: UITableView) -> Int{
//數(shù)據(jù)源數(shù)組中有幾個小數(shù)組就有幾個分組
return self.dataArray.count
}
//4.設(shè)置每個分組的header的標(biāo)題
func tableView(tableView: UITableView, titleForHeaderInSection section: Int) -> String? {
let str = "ABCDEFGH"
let c = str.characters[str.startIndex.advancedBy(section)]
return "\(c)"
}
//5.右邊顯示的組名(不常用)
func sectionIndexTitlesForTableView(tableView: UITableView) -> [String]?{
return ["A","B","C","D","E"]
}
========delegete=====協(xié)議========
//1.cell被選中的時候調(diào)用的方法
//一般在這個方法中跳轉(zhuǎn)到下一頁顯示詳情
//參數(shù)2:被選中的cell的位置
func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath){
print("第\(indexPath.section)組的第\(indexPath.row)行被選中")
}
//2.設(shè)置每個cell的高度.通過這個方法可以給不同組不同行的cell設(shè)置不一樣的高度
//參數(shù)2:設(shè)置高度的cell的位置
func tableView(tableView: UITableView, heightForRowAtIndexPath indexPath: NSIndexPath) -> CGFloat {
//讓第0組的cell的高度是150艺谆,其他組的高度是100
if indexPath.section == 0 {
return 150
}
return 100
}
//3.設(shè)置分組的header和footer的高度
func tableView(tableView: UITableView, heightForHeaderInSection section: Int) -> CGFloat {
return 50
}
func tableView(tableView: UITableView, heightForFooterInSection section: Int) -> CGFloat {
return 0
}
//4.設(shè)置每個分組的headerView
func tableView(tableView: UITableView, viewForHeaderInSection section: Int) -> UIView?{
//創(chuàng)建headerView
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
}
//注:遵守UITableViewDelegate協(xié)議的同時榨惰,也遵守了UIScrollViewDelegate
extension ViewController:UITableViewDelegate{
//正在滾動的時候?qū)崟r調(diào)用
func scrollViewDidScroll(scrollView: UIScrollView) {
if scrollView.contentOffset.y >= -200 {
return
}
//計算放大后的寬度和高度
let h2 = -scrollView.contentOffset.y
let w2 = self.view.bounds.width*self.headerImageView.frame.size.height/200
self.headerImageView.frame = CGRectMake(0, 0, w2, h2)
self.headerImageView.center = CGPointMake(self.view.center.x, h2/2)
}
UITbleViewcell的定制
有三種方式
1.手寫
2.通過創(chuàng)建一個繼承UITbleViewcell的類并且創(chuàng)建XIB文件的方式定制cell
3.通過storyBoard方式來定制
手寫定制cell
//定制cell的步驟:
//1.創(chuàng)建一個類繼承自UITableViewCell
//2.聲明cell上所有的子視圖對應(yīng)的屬性
//3.在構(gòu)造方法中去添加子視圖(不需要設(shè)置frame)。注意:如果想要將子視圖直接添加到cell上静汤,不能通過cell去調(diào)用addSubView方法琅催,而是用cell的contentView去調(diào)用addSubView方法
//4.在layoutSubViews方法中去設(shè)置子視圖的frame
//1.封面
//2.頭像
//3.作者名
//4.標(biāo)題
//5.透明層
class ManTableViewCell: UITableViewCell {
//MARK: - 第二步,聲明屬性
//1.封面
let coverImageView = UIImageView()
//2.頭像
let iconButton = UIButton()
//3.作者名
let authorNameLabel = UILabel()
//4.標(biāo)題
let titleLabel = UILabel()
//5.透明層
let alphaView = UIView()
//MARK: - 第三步,重寫構(gòu)造方法,添加子視圖
override init(style: UITableViewCellStyle, reuseIdentifier: String?) {
super.init(style: style, reuseIdentifier: reuseIdentifier)
//1.封面
self.contentView.addSubview(coverImageView)
//2.頭像
self.contentView.addSubview(iconButton)
//3.作者名
self.contentView.addSubview(authorNameLabel)
self.authorNameLabel.textColor = UIColor.whiteColor()
//4.標(biāo)題
self.contentView.addSubview(titleLabel)
self.titleLabel.textColor = UIColor.whiteColor()
//5.透明層
self.contentView.addSubview(alphaView)
self.alphaView.backgroundColor = UIColor.init(red: 0, green: 0, blue: 0, alpha: 0.5)
}
required init?(coder aDecoder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}
}
extension ManTableViewCell{
//MARK: - 第四步虫给,計算子視圖的frame
override func layoutSubviews() {
super.layoutSubviews()
//通用
let cellW = self.frame.size.width
let cellH = self.frame.size.height
let margin:CGFloat = 20
//1.封面
let coverX: CGFloat = 0
let coverY: CGFloat = 0
let coverW = cellW
let coverH = cellH
self.coverImageView.frame = CGRectMake(coverX, coverY, coverW, coverH)
//2.頭像
let iconX = margin
let iconY = margin
let iconW: CGFloat = 80
let iconH: CGFloat = 80
self.iconButton.frame = CGRectMake(iconX, iconY, iconW, iconH)
//切圓
iconButton.layer.masksToBounds = true
iconButton.layer.cornerRadius = 40
//3.作者名
let authorX = iconX + iconW + margin
let authorH: CGFloat = 20
let authorY = iconY + iconH/2 - authorH/2
let authorW = cellW - authorX - margin
authorNameLabel.frame = CGRectMake(authorX, authorY, authorW, authorH)
//4.標(biāo)題
let titleX = margin
let titleH: CGFloat = 20
let titleY = cellH - margin - titleH
let titleW = cellW - margin*2
titleLabel.frame = CGRectMake(titleX, titleY, titleW, titleH)
//5.透明層
let alphaX:CGFloat = 0
let alphaH = margin + titleH + margin
let alphaY = cellH - alphaH
let alphaW = cellW
alphaView.frame = CGRectMake(alphaX,alphaY, alphaW, alphaH)
}
}
XIB方式定制
比較特別的代碼就是創(chuàng)建cell的時候必須先拿到xib文件
注意:要把XIB上的要變的子視圖和繼承UITableViewcell的類連接
//2.判斷是否找到可以復(fù)用的cell
if cell == nil {
//拿到xib文件
//第一個參數(shù)是xib文件的文件名
let nib = UINib.init(nibName: "XibTableViewCell", bundle: nil)
//通過xib文件創(chuàng)建cell
cell = nib.instantiateWithOwner(self, options: nil).first as? XibTableViewCell
}
storyBoard定制cell
1.首先在界面上添加一個TableView和viewController連接
2.在試圖控制器的屬性欄最后一欄最右邊那個箭頭哪里去把dataSourse和delegate和viewController連接起來藤抡,相當(dāng)于設(shè)置代理
3.到viewController實現(xiàn)協(xié)議創(chuàng)建cell(暫時的)
4.到storyBoard里面去添加一個Table view cell
5.把Table view cell屬性欄的identifier設(shè)置為cell
6.去創(chuàng)建一個繼承UITableViewCell的類,把視圖控制器上的cell和這個類關(guān)聯(lián)起來抹估,在屬性里面卡片那一欄class寫上這個類名
7.在cell上添加子視圖缠黍,就是拉控件,布局药蜻,然后控件和cell的類連接
8.去更改先前創(chuàng)建cell的類 變?yōu)樽远x的類
9.更新自己需要的數(shù)據(jù)
讓cell的大小隨著內(nèi)容的大小變化而變化
這個有點煩瓷式!