效果圖

Paste_Image.png
大體說一下思路,此頁面是由頂部的HeadView以及一個(gè)TableView兩部分構(gòu)成,TableView有一個(gè)headView,分別是我的訂單,優(yōu)惠劵以及我的消息,通過閉包的回調(diào)完成點(diǎn)擊的事件
1. 頂部的HeadView - UIImageView
步驟:
1. 定義相關(guān)控件
2. 在init(frame: CGRect)方法中設(shè)置相關(guān)屬性并添加
3. 在layoutSubviews()方法中設(shè)置各個(gè)控件的frame
注意:如果你需要添加其它的參數(shù)(如: 點(diǎn)擊方法),需要使用便利構(gòu)造器,在第1步的時(shí)候,定義一個(gè)方法
便利構(gòu)造器是類的次要構(gòu)造器, 你需要讓便利構(gòu)造器調(diào)用同一個(gè)類中的指定構(gòu)造器, 并將這個(gè)指定構(gòu)造器中的參數(shù)填上你想要的默認(rèn)參數(shù).
關(guān)于構(gòu)造器可以參考我寫的這篇簡(jiǎn)書Swift 類構(gòu)造器的使用
代碼
import UIKit
class MineHeadView: UIImageView {
// 第1步:定義相關(guān)控件
let setUpBtn: UIButton = UIButton(type: .Custom)
let iconView: IconView = IconView()
// 定義方法
var buttonClick:(Void -> Void)?
override init(frame: CGRect) {
super.init(frame: frame)
// 第2步:設(shè)置相關(guān)屬性并添加
image = UIImage(named: "v2_my_avatar_bg")
setUpBtn.setImage(UIImage(named: "v2_my_settings_icon"), forState: .Normal)
setUpBtn.addTarget(self, action: Selector("setUpButtonClick"), forControlEvents: .TouchUpInside)
addSubview(setUpBtn)
addSubview(iconView)
self.userInteractionEnabled = true
}
// 便利構(gòu)造器
convenience init(frame: CGRect, settingButtonClick:(() -> Void)) {
// 調(diào)用同一個(gè)類中的指定構(gòu)造器
self.init(frame: frame)
buttonClick = settingButtonClick
}
required init?(coder aDecoder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}
// 第3步:設(shè)置frame
override func layoutSubviews() {
super.layoutSubviews()
}
func setUpButtonClick() {
buttonClick?()
}
2. TableView - headView
效果圖

Paste_Image.png
TableView有一個(gè)headView,分別是我的訂單,優(yōu)惠劵以及我的消息,這是三個(gè)view,并在view上添加了一個(gè)button,我通過for...in循環(huán)分別給這三個(gè)view添加手勢(shì),實(shí)現(xiàn)點(diǎn)擊事件,同時(shí),定義了一個(gè)枚舉并設(shè)置view的tag值,在點(diǎn)擊事件中通過tap.view!.tag進(jìn)行判斷,實(shí)現(xiàn)相應(yīng)的點(diǎn)擊方法
代碼
import UIKit
enum MineHeadViewButtonType: Int {
case Order = 0
case Coupon = 1
case Message = 2
}
class MineTabeHeadView: UIView {
// 第1步:定義相關(guān)控件和方法
var mineHeadViewClick:((type: MineHeadViewButtonType) -> ())?
override init(frame: CGRect) {
super.init(frame: frame)
backgroundColor = UIColor.whiteColor()
// 第2步:設(shè)置相關(guān)屬性并添加
buildUI()
}
required init?(coder aDecoder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}
override func layoutSubviews() {
super.layoutSubviews()
// 第3步:設(shè)置frame
}
private func buildUI() {
// 設(shè)置了view的tag值
orderView.tag = 0
addSubview(orderView)
couponView.tag = 1
addSubview(couponView)
messageView.tag = 2
addSubview(messageView)
// 通過for...in循環(huán)分別給這三個(gè)view添加手勢(shì),實(shí)現(xiàn)點(diǎn)擊事件
for index in 0...2 {
let tap = UITapGestureRecognizer(target: self, action: Selector("click:"))
let subView = viewWithTag(index)
subView?.addGestureRecognizer(tap)
}
}
func click(tap: UIGestureRecognizer) {
if mineHeadViewClick != nil {
// 在點(diǎn)擊方法中,通過tag值,實(shí)現(xiàn)相應(yīng)的點(diǎn)擊方法
switch tap.view!.tag {
case MineHeadViewButtonType.Order.rawValue:
mineHeadViewClick!(type: MineHeadViewButtonType.Order)
break
case MineHeadViewButtonType.Coupon.rawValue:
mineHeadViewClick!(type: MineHeadViewButtonType.Coupon)
break
case MineHeadViewButtonType.Message.rawValue:
mineHeadViewClick!(type: MineHeadViewButtonType.Message)
break
default: break
}
}
}
}
注意: view上button的圖片和文字位置和button默認(rèn)位置不一樣,需要重寫button的titleLabel和imageView兩個(gè)屬性,具體參考
UpImageDownTextButton這個(gè)類和相關(guān)代碼
3. 自定義Cell
步驟:
1. 模型類 - 這里是從Plist中獲取數(shù)據(jù)
2. 懶加載控件
3. 定義模型屬性,并在didSet{}中進(jìn)行賦值 - 相當(dāng)于OC中的重寫set方法
4. 在init(style: UITableViewCellStyle, reuseIdentifier: String?)方法中設(shè)置相關(guān)屬性并添加
5. 在layoutSubviews()方法中設(shè)置各個(gè)控件的frame
注意:需要將控件添加到contentView上
可以在cell中定義一個(gè)快速創(chuàng)建cell的方法
import UIKit
class MineCell: UITableViewCell {
// 第3步:定義模型屬性,并在didSet{}中進(jìn)行賦值
var mineModel: MineCellModel? {
didSet {
titleLabel.text = mineModel!.title
iconImageView.image = UIImage(named: mineModel!.iconName!)
}
}
static private let identifier = "CellID"
// 快速創(chuàng)建cell的方法
class func cellFor(tableView: UITableView) -> MineCell {
var cell = tableView.dequeueReusableCellWithIdentifier(identifier) as? MineCell
if cell == nil {
cell = MineCell(style: .Default, reuseIdentifier: identifier)
}
return cell!
}
// 第2步:懶加載控件
let bottomLine = UIView()
private lazy var iconImageView = UIImageView()
private lazy var titleLabel = UILabel()
private lazy var arrowView = UIImageView()
// 第4步:設(shè)置相關(guān)屬性并添加
override init(style: UITableViewCellStyle, reuseIdentifier: String?) {
super.init(style: style, reuseIdentifier: reuseIdentifier)
}
required init?(coder aDecoder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}
// 第5步:設(shè)置frame
override func layoutSubviews() {
super.layoutSubviews()
}
}
// 第1步:模型類 - 從Plist中獲取數(shù)據(jù)
class MineCellModel: NSObject {
var title: String?
var iconName: String?
class func loadMineCellModels() -> [MineCellModel] {
var mines = [MineCellModel]()
let path = NSBundle.mainBundle().pathForResource("MinePlist", ofType: "plist")
let arr = NSArray(contentsOfFile: path!)
for dic in arr! {
mines.append(MineCellModel.mineModel(dic as! NSDictionary))
}
return mines
}
// 相當(dāng)于OC中的類方法/對(duì)象方法
class func mineModel(dic: NSDictionary) -> MineCellModel {
let model = MineCellModel()
model.title = dic["title"] as? String
model.iconName = dic["iconName"] as? String
return model
}
}