閒了一段時間了,第一次在簡書上寫文章,試試自己的功底!
之前專案中有用到點選tableviewcell展開下拉選單內容的功能,剛開始在網上找了好了(本人菜鳥一枚,有寫的不好的地方請指出,謝謝),感覺不太適合自己的專案,而且大多程式碼量都挺大的不是很實用。不過終於在網上找到了一個(現在忘了是哪位大神些的呢,莫怪我!),根據他的思路,我仿照寫了一個簡單易懂的且實用的展開選單功能!適合新手學習
class ViewController: UIViewController,UITableViewDelegate,UITableViewDataSource {
var tableView : UITableView!
let cellIDstr : String = "cell"
var Arr = NSMutableArray() //存放列表上的顯示資料
//點選cell出發方法,彈出下拉框(原作者中將我這裡的NSIndexPath寫成的是Int型別,我這裡實用的tableview的row來寫的)
var selectedCellIndexPaths:[NSIndexPath] = [] //這裡是設定點選展開cell下面選單的關鍵
//我的下拉展開內容是用的label寫的,因為每一個lable的高度都可能會不一樣,所有我這裡需要獲取單獨的label的高度,這裡我只給的5個
var textl1 = CGFloat()
var textl2 = CGFloat()
var textl3 = CGFloat()
var textl4 = CGFloat()
var textl0 = CGFloat()
//下面這裡的textlArr將5個lable的高度裝入陣列,方便取出
var textlArr : [CGFloat] = NSArray() as! [CGFloat]
//方向指示箭頭
let ico_expand = UIImage(named: "icon_mr")!
let ico_expand1 = UIImage(named: "icon_xl")!
複製程式碼
然後例項化UITableView
//這裡的cwpCell是我自定義的UItableviewcell,所有的控制元件,如label都在這裡面例項化的
tableView.registerClass(cwpCell.self, forCellReuseIdentifier: cellIDstr)
複製程式碼
然後就是cellForRowAtIndexPath裡面
func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
var cell = tableView.dequeueReusableCellWithIdentifier(cellIDstr) as? cwpCell
//防止檢視載入重疊,刪除上一次的控制元件
for cell in cell!.contentView.subviews {
cell.removeFromSuperview()
}
if(cell == nil){
cell = cwpCell(style: .Default, reuseIdentifier: cellIDstr)
}
cell!.selectionStyle = UITableViewCellSelectionStyle.None
//呼叫cwpCell 裡面的方法 例項化控制元件(這裡的Arr裡面的資料,我放在一個plist檔案裡面,通過key來取值cell的標題和label的內容)
cell?.setinitlabel((Arr[indexPath.row]["Title"] as? String)!)
cell?.setUILabelinit((Arr[indexPath.row]["Titlesub"] as? String)!)
textlArr[indexPath.row] = (cell?.textlabel.frame.height)!
//點選展開和收縮改變文字顏色 圖片(重點)
if selectedCellIndexPaths.contains(indexPath) {
cell!.labelc.textColor = UIColor(red: 0.0000, green: 0.6824, blue: 0.4627, alpha: 1.0000)
cell!.setinitimage(ico_expand1)
}else{
cell!.labelc.textColor = UIColor(red: 0.3961, green: 0.3961, blue: 0.3961, alpha: 1.0000)
cell!.setinitimage(ico_expand)
}
cell!.layer.masksToBounds = true
return cell!
}
複製程式碼
再然後就是點選cell展開下面lable的內容(高度)
func tableView(tableView: UITableView, heightForRowAtIndexPath indexPath: NSIndexPath) -> CGFloat {
var sdwsa = CGFloat()
//根據類容lable的高度 改變cell的高度
if(selectedCellIndexPaths.contains(indexPath)){
sdwsa = textlArr[indexPath.row] + 50
}else{
//這裡cell的高度我預設設定是40
sdwsa = 40
}
return sdwsa
}
//根據點選的cell的來進行展開或收縮
func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) {
//點選展開或收縮
if let index = selectedCellIndexPaths.indexOf(indexPath) {
selectedCellIndexPaths.removeAtIndex(index)
}else{
selectedCellIndexPaths.append(indexPath)
}
//別忘了還要重新重新整理cell
tableView.reloadRowsAtIndexPaths([indexPath], withRowAnimation: .Automatic)
}
複製程式碼
展開的lable的例項化我這裡是在我的自定義cell裡面寫的方法
func setUILabelinit(str : String) -> NSMutableAttributedString{
textlabel = UILabel()
textlabel.frame = CGRectMake(48, 40, Screen_W - 48 - 20, 0)
textlabel.font = UIFont.systemFontOfSize(15)
textlabel.numberOfLines = 0
//用NSMutableAttributedString來給label設定行間距
let attributedString = NSMutableAttributedString(string: str)
let paragraphStyle = NSMutableParagraphStyle()
paragraphStyle.lineSpacing = 3
attributedString.addAttribute(NSParagraphStyleAttributeName, value: paragraphStyle, range: NSMakeRange(0, str.characters.count))
textlabel.attributedText = attributedString
self.contentView.addSubview(textlabel)
textlabel.sizeToFit()
return attributedString
}
複製程式碼
初次在簡書上寫程式碼文章,談談自己的經驗,寫的不好的地方,還望給位多多見諒、多多指點! 程式碼下載地址:http://code.cocoachina.com/view/133825