iOS中tableview 兩級cell的展開與收回(一)
阿新 • • 發佈:2019-02-16
在我們的很多專案實現過程中,都需要資料的展開與收回,就像騰訊QQ中的聯絡人,也是一個cell的收回操作。上一篇博文講述瞭如何展開一個兩級的資料來源,那麼我們就接著改例城講解一下資料的展開與收回。在這裡主要是為了講解兩個知識點,在tableview中插入資料與刪除資料。
首先呢,我們要思考一下,如何設定自己的演算法,能夠做到邏輯清楚,程式碼簡介,功能完善呢!在這裡教大家一個比較簡單的方法:仍然用一個數據源,在資料來源裡面給每一個section新增是否展開標誌位,我們來通過判斷這個標誌位確定改section的返回行數與插入或者刪除資料。
using System; using Foundation; using System.Collections.Generic; namespace Expland { public class Data { public Data () { } //一級標題 public string Title{ get; set;} //是否展開標誌位 public bool ExplandFlag{ get; set;} //二級標題 public List<string> SecondTitle = new List<string> (); } }
一般來說,資料的展開與收回都是由於出發一個事件來進行操作的,這裡呢,我們在每一個section的尾部添加了一個小圖示,點選該圖示的時候,圖示旋轉,二級資料展開,再次點選的時候,圖示回到原來位置,資料收回。那麼這裡我們就重新定義了一個繼承UITableViewHeaderFooterView的類,來自定義了section 的樣式。每一個section上面都會又一個來顯示文字的label,一個放置圖片的button,該button上面放置了一個圖片。圖片的旋轉程式碼如下:
/// <summary> /// sectiond 的按鈕點選,順時針旋轉 /// </summary> /// <param name="btn">Button.</param> void Rotate(UIButton btn) { CABasicAnimation ro = CABasicAnimation.FromKeyPath ("transform.rotation.z"); ro.To =new NSNumber (1.57f); ro.From =new NSNumber (0); ro.Duration = 0.1d; ro.Cumulative = false; ro.RepeatCount = 1; ro.RemovedOnCompletion = false; ro.FillMode = CAFillMode.Forwards.ToString(); btn.Layer.AddAnimation (ro, "Rotation"); } /// <summary> /// sectiond 的按鈕點選,逆時針旋轉 /// </summary> /// <param name="btn">Button.</param> void ReturnRotate(UIButton btn) { CABasicAnimation ro = CABasicAnimation.FromKeyPath ("transform.rotation.z"); ro.To =new NSNumber (0); ro.From =new NSNumber (1.57f); ro.Duration = 0.1d; ro.Cumulative = false; ro.RepeatCount = 1; ro.RemovedOnCompletion = false; ro.FillMode = CAFillMode.Forwards.ToString(); btn.Layer.AddAnimation (ro, "Rotation"); }
當我們點選圖片的時候,都會出發一個事件,該事件裡面要處理標誌位的處理,圖片的旋轉,資料的插入和刪除。
//展開按鈕的狀態 ExplandButton.AddTarget(delegate(object sender, EventArgs e) { //判斷狀態 if(!Title[(int)section].ExplandFlag){ //標誌位改變 Title[(int)section].ExplandFlag=true; //圖示的旋轉 UIButton explandButton=(UIButton)sender; myTabViSource.Rotate(explandButton); //資料插入 int length=Title[(int)section].SecondTitle.Count; NSIndexPath[] arrayIndexPath=new NSIndexPath[length]; for(int i=0;i<length;i++) { arrayIndexPath[i]=NSIndexPath.FromRowSection((nint)i,section); } tableview.InsertRows(arrayIndexPath,UITableViewRowAnimation.Automatic); }else{ //標誌位改變 Title[(int)section].ExplandFlag=false; //圖示的復位 UIButton explandButton=(UIButton)sender; myTabViSource.ReturnRotate(explandButton); //資料插入 int length=Title[(int)section].SecondTitle.Count; NSIndexPath[] arrayIndexPath=new NSIndexPath[length]; for(int i=0;i<length;i++) { arrayIndexPath[i]=NSIndexPath.FromRowSection((nint)i,section); } tableview.DeleteRows(arrayIndexPath,UITableViewRowAnimation.Automatic); } },UIControlEvent.TouchUpInside);