swift點選Tableviewcell展開下拉選單內容

On_looker發表於2017-12-21

閒了一段時間了,第一次在簡書上寫文章,試試自己的功底!

之前專案中有用到點選tableviewcell展開下拉選單內容的功能,剛開始在網上找了好了(本人菜鳥一枚,有寫的不好的地方請指出,謝謝),感覺不太適合自己的專案,而且大多程式碼量都挺大的不是很實用。不過終於在網上找到了一個(現在忘了是哪位大神些的呢,莫怪我!),根據他的思路,我仿照寫了一個簡單易懂的且實用的展開選單功能!適合新手學習

cwpgif1.gif

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

相關文章