UITableView
UITableView 在Ios中大量使用,咱們對UITableview中的有關知識進行整理
UITAbleView是表視圖控制器
1 UITableView初始化
2UITableview實現代理
3UITableView必須實現的方法(UITableviewdatasource)
3.1一個組裏有多少cell
3.2 UITableviewcell的內容
4
UIcollectionView
UIcollectionView是集合視圖
1 UIcollectionFlowLayout的初始化
2 UIcollectionView 的初始化
3 UIcollectionView實現代理
4 兩個必須實現的方法
//關於UITableViewCell 和UICollectionViewCell的介紹
UITableview全面解析
在iOS開發中UITableView能夠說是使用最普遍的控件,咱們平時使用的軟件中處處均可以看到它的影子,相似於微信、QQ、新浪微博等軟件基本上隨處都是UITableView。固然它的普遍使用天然離不開它強大的功能,今天這篇文章將針對UITableView重點展開討論。今天的主要內容包括:
UITableView有兩種風格:UITableViewStylePlain和UITableViewStyleGrouped。這二者操做起來其實並無本質區別,只是後者按分組樣式顯示前者按照普通樣式顯示而已。你們先看一下二者的應用
1>分組樣式
2>不分組樣式
你們能夠看到在UITableView中數據只有行的概念,並無列的概念,由於在手機操做系統中顯示多列是不利於操做的。UITableView中每行數據都是一個UITableViewCell,在這個控件中爲了顯示更多的信息,iOS已經在其內部設置好了多個子控件以供開發者使用。若是咱們查看UITableViewCell的聲明文件能夠發如今內部有一個UIView控件(contentView,做爲其餘元素的父控件)、兩個UILable控件(textLabel、detailTextLabel)、一個UIImage控件(imageView),分別用於容器、顯示內容、詳情和圖片。使用效果相似於微信、QQ信息列表:
固然,這些子控件並不必定要所有使用,具體操做時能夠經過UITableViewCellStyle進行設置,具體每一個枚舉表示的意思已經在代碼中進行了註釋:
typedef NS_ENUM(NSInteger, UITableViewCellStyle) {
UITableViewCellStyleDefault, // 左側顯示textLabel(不顯示detailTextLabel),imageView可選(顯示在最左邊)
UITableViewCellStyleValue1, // 左側顯示textLabel,右側顯示detailTextLabel(默認藍色),imageView(顯示在最左邊)
UITableViewCellStyleValue2, // 左側依次顯示textLable(默認藍色)和detailTextLabel,imageView可選(顯示在最左邊)
UITableViewCellStyleSubtitle // 左上方顯示textLabel,左下方顯示detailTextLabel(默認灰色),imageView可選(顯示在最左邊)
};
數據源
因爲ios是遵循MVC模式設計的,不少操做都是經過代理和外界溝通的,但對於數據源控件除了代理還有一個數據源屬性,經過它和外界進行數據交互,對於UITableView設置完dateSource後須要實現UITableViewDataSource協議,在這個協議中定義了多種數據操做方法,下面經過建立一個簡單的聯繫人管理進行演示
運行能夠看到以下效果
你們在使用iPhone通訊錄是會發現右側能夠按字母檢索,使用起來很方便,其實這個功能使用UITableView實現很簡單,只要是實現數據源協議的一個方法,構建一個分組標題的數組便可實現,數組元素的內容和組標題內容未必徹底一致,UITableView是按照數組元素的索引和每組數據索引順序來定位的不是按內容查找
效果以下
須要注意的是上面幾個重點方法的執行順序,請看下圖
值得指出的是生成單元格的方法並非一次所有調用,而是隻會產生當前顯示在界面上的單元格,當用戶滾動操做時,再顯示其餘單元格
注意:隨着咱們的應用愈來愈複雜,可能常常須要調試程序,在ios中默認狀況下不能定位到錯誤代碼行,咱們能夠經過以下設置讓程序定位到出錯代碼行:Show the Breakpoint navigator - AddException breakpoint
代理
上面咱們已經看到通信錄得簡單實現,可是咱們發現單元格高度,分組標題高度以及尾部說明的高度都須要調整,此時就須要使用代理方法。UITalbleView代理方法有不少,例如監聽單元格顯示週期,監聽單元格選擇編輯操做,設置是否高亮顯示單元格,設置行高等
1設置高度
2監聽點擊
在iOS 中點擊某個聯繫人就能夠呼叫這個聯繫人,這時就須要監聽點擊操做,這裏就不演示呼叫聯繫人操做了,咱們演示一下修改人員信息的操做
在上面的代碼中咱們經過修改模型來改變UI顯示,這種方式是經典的MVC應用,在後面的代碼中會常常。固然UI的刷新使用了UITableView的reloadData方法,該方法會從新調用數據源方法,包括計算分組,計算每一個分組的行數,生成單元格等刷新整個UITableView。固然這種方式在實際開發中是不可取的,咱們不能由於修改了一我的的信息就刷新這個UITableView,此時咱們須要採用局部刷新,局部刷新使用起來很簡單,只須要調用UITableView的另外一個方法:
性能優化
前面已經說過UITableView中的單元格cell是在顯示到用戶但是區域後建立的,那麼若是用戶往下滾動就會繼續建立顯示在屏幕上的單元格,若是用戶向下滾動返回到查看過的內容是一樣會從新建立以前已經建立過的單元格。如此一來即便UITableView的內容不是太多。若是用戶反覆的上下滾動,內存也會瞬間飆升,更況且不少時候UITalbleView的內容是不少的(例如微博展現列表,基本向下滾動是沒有底限的)
前面一節中咱們曾經提到過如何優化UIScrollView,當時就是利用有限的UIImageView動態切換其內容來儘量減小資源佔用。一樣的,在UITableView中也能夠採用相似的方式,只是這時咱們不是在滾動到指定位置後更改滾動的位置而是要將當前沒有顯示的Cell從新顯示在將要顯示的Cell的位置而後更新其內容。緣由就是UITableView中的cell結構佈局多是不一樣的,經過從新定位是不可取的,而是須要重用已經不在界面顯示的已建立過的Cell。
固然,聽起來這麼作比較複雜,其實實現起來很簡單,由於UITableView已經爲咱們實現了這中機制。在UITableView內部有一個緩存池,初始化時使用initWithStyle:(UITableViewCellStyle) reuseIdentifier:(NSString*)方法指定一個可重用標識,就能夠將這個cell放到緩存池。而後在使用時使用指定的標識去緩存池中取得對應的cell而後修改cell內容便可
UIScrollView
UIScrollView 是滑動視圖
UIScrollView的初始化(若是是從xib或者故事板拖拽的不用初始化)
//屬性
contentSize // UIScrollView內容大小的設置 (這個是很是重要的)
pagingEnabled //翻頁屬性
[_scrollView addSubview:imageView];//把內容視圖直接添加便可