創(chuàng)建UITableViewCell子類

UITableViewCell是UIView的子類。創(chuàng)建UIView子類時,定制界面的方法是覆蓋drawRect:,但是在創(chuàng)建UITableViewCell子類時,定制界面的方法是向UITableViewCell加入子視圖。不過,并不是直接將子視圖加入UITableViewCell,而是加入UITableViewCell的另一個子視圖:contentView。

contentView起容器的作用,用于存放其他子視圖。這些子視圖構成UITableViewCell的布局(見圖192)。要改變UITableViewCell子類的外觀,需要修改contentView所包含的子視圖。


UITableViewCell的視圖層次結構

  必須將子視圖加入contentView而不是UITableViewCell對象自身的原因是,UITableViewCell對象會根據外部條件改變contentView的大小。例如,當UITableView對象進入編輯模式時,UITableViewCell對象會改變contentView的大小,為編輯控件(例如刪除控件和移位控件)留出位置(見圖193)。如果直接將子視圖加入UITableViewCell對象,編輯控件就會遮住這些子視圖。進入編輯模式時,UITableViewCell對象不會改變大?。║ITableViewCell對象的寬度必須和UITableView對象的寬度相等),但是其包含的contentView會改變大小。
  讀者可能已經注意到視圖層次結構中的UIScrollView對象,當UITableView對象進入編輯模式時,UITableViewCell對象會將contentView移動到左側,這個過程需要借助UIScrollView對象。同樣,在UITableViewCell對象中從右向左滑動顯示刪除控件時,也需要借助UIScrollView對象。實際上,contentView是UIScrollView對象的一個子視圖。


UITableViewCell對象的布局(標準模式和編輯模式)

創(chuàng)建UITableViewCell子類界面的最簡單方法就是使用XIB文件。

UITableViewCell的XIB文件不會使用File'sOwner,所以不用為其設置類名,也不用為其創(chuàng)建任何關聯(lián)。與UIViewController的XIB文件不同,UITableViewCell的XIB文件在解固時,不需要使用某個對象代替File'sOwner,也不需要將其中的固化對象關聯(lián)到File'sOwner。為了理解兩種XIB文件的區(qū)別,首先需要知道UITableView加載UITableViewCell的過程。

image.png

注冊NIB文件的原理非常簡單,僅僅是將UINib對象以“BNRItemCell”作為鍵保存到NSDictionary中。UINib對象包含所有保存在其XIB文件中的數(shù)據,當UITableView對象需要使用UITableViewCell對象時,就會使用相應的UINib對象創(chuàng)建新的UITableViewCell對象。
 在UITableView對象中注冊了包含xib的UINib對象之后,UITableView對象就可以通過“BNRItemCell”鍵找到并加載BNRItemCell對象。


image.png

縮略圖

詳細看19.2

iOS SDK提供了多種創(chuàng)建縮略圖的途徑,其中之一是根據原圖在屏外上下文(offscreencontext)中畫出按比率縮小后的版本,然后從上下文取出新創(chuàng)建的圖片。下面通過這種途徑為BNRItem對象的圖片創(chuàng)建縮略圖。

由UITableViewCell對象轉發(fā)動作消息
Block對象的語法

請注意,Block被聲明為copy。系統(tǒng)對Block對象和其他對象的內存管理方式不同,Block對象是在棧中創(chuàng)建的,而其他對象是在堆中創(chuàng)建的。這意味著,即使應用針對新創(chuàng)建的Block對象保留了強引用類型的指針,一旦創(chuàng)建該對象的方法返回,那么與方法內部的其他局部變量相同,新創(chuàng)建的Block對象也會被立即釋放。為了在聲明Block對象的方法返回后仍然保留該對象,必須向其發(fā)送copy消息??截惸硞€Block對象時,應用會在堆中創(chuàng)建該對象的備份。這樣,即使應用釋放了當前方法的棧,堆中的Block對象也不會被釋放。


image.png
捕獲變量

Block對象可以使用其封閉作用域(enclosingscope)內的所有變量。對聲明了某個Block對象的方法,該方法的作用域就是這個Block對象的封閉作用域。因此,這個Block對象可以訪問該方法的所有局部變量、傳入該方法的實參以及所屬對象的實例變量。如果捕獲變量是ObjectiveC對象,那么Block對象對捕獲變量具有強引用。如果捕獲變量也對Block對象具有強引用,就會導致強引用循環(huán)。


解決問題的方法是:將actionBlock對cell的引用改為弱引用。

image.png

在Block對象執(zhí)行過程中,必須保證Block對象始終可以訪問cell。因此,以上代碼在actionBlock內部創(chuàng)建了strongCell,以保持對cell的強引用。這與Block對象對捕獲變量的強引用不同,strongCell只是在Block對象執(zhí)行過程中對cell保持強引用。

UICollectionView

UICollectionView與UITableView非常相似:
  ?UICollectionView是UIScrollView的子類。
  ?與UITableViewCell類似,UICollectionView對象顯示一組UICollectionViewCell或其子類。
  ?UICollectionView具有數(shù)據源,負責提供UICollectionViewCell?! ?UICollectionView具有委托,可以在委托方法中處理相關回調事件,例如選擇了某一個UICollectionViewCell。
  ?UICollectionViewController與UITableViewController類似,UICollectionViewController也是UIViewController的子類,其view是UICollectionView。
  UICollectionView與UITableView的區(qū)別是,UITableView只能顯示一列UITableViewCell,在大屏幕設備(如iPad)中有很大的局限性。UICollectionView則可以將UICollectionViewCell按任意方式布局,其中最常見的是網格布局


image.png
UICollectionView對象圖示例

UICollectionView是如何布局UICollectionViewCell的?UICollectionView含有一個布局對象,負責控制每一個UICollectionViewCell的屬性,包括位置和大小。UICollectionView的布局對象繼承自一個名為UICollectionViewLayout的抽象類。如果需要將UICollectionViewCell按網格布局,則可以使用系統(tǒng)提供的UICollectionViewFlowLayout。但是,如果需要實現(xiàn)其他的布局方式,就必須創(chuàng)建UICollectionViewLayout的自定義子類。

UICollectionViewCell也有contentView,但是與UITableViewCell不同,UICollectionViewCell的contentView在默認情況下沒有任何子視圖(UITableView默認是有Cell,不一定要自主創(chuàng)建)。因此,如果需要使用UICollectionView,通常還需要創(chuàng)建一個UICollectionViewCell子類。

最后,UICollectionViewCell也具有背景視圖和選中狀態(tài)下的背景視圖(當UICollectionViewCell處于選中狀態(tài)時,該視圖會覆蓋在背景視圖上方)。

?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內容

  • Swift1> Swift和OC的區(qū)別1.1> Swift沒有地址/指針的概念1.2> 泛型1.3> 類型嚴謹 對...
    cosWriter閱讀 11,618評論 1 32
  • 代碼創(chuàng)建UIWindow對象 Xcode7之后使用代碼創(chuàng)建UIWindow對象: //創(chuàng)建UIWindow對象 s...
    云之君兮鵬閱讀 1,492評論 0 2
  • { 24、Sqlite數(shù)據庫 1、存儲大數(shù)據量,增刪改查,常見管理系統(tǒng):Oracle、MSSQLServer、DB...
    CYC666閱讀 1,047評論 0 1
  • 一、UICollectionView介紹 UICollectionView和UICollectionViewCon...
    無灃閱讀 4,752評論 4 18
  • 長投21天理財訓練營到達尾聲了,學完這些的零基礎課程后,心態(tài)和認知有了很大的改變,回想起這兩個星期的忙碌學...
    方方_e2a5閱讀 374評論 1 2

友情鏈接更多精彩內容