創(chuàng)建UITableViewCell子類

UITableViewCell是UIView的子類。創(chuàng)建UIView子類時(shí)况鸣,定制界面的方法是覆蓋drawRect:,但是在創(chuàng)建UITableViewCell子類時(shí),定制界面的方法是向UITableViewCell加入子視圖树叽。不過(guò),并不是直接將子視圖加入U(xiǎn)ITableViewCell谦絮,而是加入U(xiǎn)ITableViewCell的另一個(gè)子視圖:contentView题诵。

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


UITableViewCell的視圖層次結(jié)構(gòu)

  必須將子視圖加入contentView而不是UITableViewCell對(duì)象自身的原因是草冈,UITableViewCell對(duì)象會(huì)根據(jù)外部條件改變contentView的大小。例如,當(dāng)UITableView對(duì)象進(jìn)入編輯模式時(shí)怎棱,UITableViewCell對(duì)象會(huì)改變contentView的大小哩俭,為編輯控件(例如刪除控件和移位控件)留出位置(見圖193)。如果直接將子視圖加入U(xiǎn)ITableViewCell對(duì)象拳恋,編輯控件就會(huì)遮住這些子視圖凡资。進(jìn)入編輯模式時(shí),UITableViewCell對(duì)象不會(huì)改變大忻恕(UITableViewCell對(duì)象的寬度必須和UITableView對(duì)象的寬度相等)讳苦,但是其包含的contentView會(huì)改變大小。
  讀者可能已經(jīng)注意到視圖層次結(jié)構(gòu)中的UIScrollView對(duì)象吩谦,當(dāng)UITableView對(duì)象進(jìn)入編輯模式時(shí)鸳谜,UITableViewCell對(duì)象會(huì)將contentView移動(dòng)到左側(cè),這個(gè)過(guò)程需要借助UIScrollView對(duì)象式廷。同樣咐扭,在UITableViewCell對(duì)象中從右向左滑動(dòng)顯示刪除控件時(shí),也需要借助UIScrollView對(duì)象滑废。實(shí)際上蝗肪,contentView是UIScrollView對(duì)象的一個(gè)子視圖。


UITableViewCell對(duì)象的布局(標(biāo)準(zhǔn)模式和編輯模式)

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

UITableViewCell的XIB文件不會(huì)使用File'sOwner薛闪,所以不用為其設(shè)置類名,也不用為其創(chuàng)建任何關(guān)聯(lián)俺陋。與UIViewController的XIB文件不同豁延,UITableViewCell的XIB文件在解固時(shí),不需要使用某個(gè)對(duì)象代替File'sOwner腊状,也不需要將其中的固化對(duì)象關(guān)聯(lián)到File'sOwner诱咏。為了理解兩種XIB文件的區(qū)別,首先需要知道UITableView加載UITableViewCell的過(guò)程缴挖。

image.png

注冊(cè)NIB文件的原理非常簡(jiǎn)單袋狞,僅僅是將UINib對(duì)象以“BNRItemCell”作為鍵保存到NSDictionary中。UINib對(duì)象包含所有保存在其XIB文件中的數(shù)據(jù)映屋,當(dāng)UITableView對(duì)象需要使用UITableViewCell對(duì)象時(shí)苟鸯,就會(huì)使用相應(yīng)的UINib對(duì)象創(chuàng)建新的UITableViewCell對(duì)象。
 在UITableView對(duì)象中注冊(cè)了包含xib的UINib對(duì)象之后棚点,UITableView對(duì)象就可以通過(guò)“BNRItemCell”鍵找到并加載BNRItemCell對(duì)象早处。


image.png

縮略圖

詳細(xì)看19.2

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

由UITableViewCell對(duì)象轉(zhuǎn)發(fā)動(dòng)作消息
Block對(duì)象的語(yǔ)法

請(qǐng)注意,Block被聲明為copy么库。系統(tǒng)對(duì)Block對(duì)象和其他對(duì)象的內(nèi)存管理方式不同傻丝,Block對(duì)象是在棧中創(chuàng)建的,而其他對(duì)象是在堆中創(chuàng)建的诉儒。這意味著葡缰,即使應(yīng)用針對(duì)新創(chuàng)建的Block對(duì)象保留了強(qiáng)引用類型的指針,一旦創(chuàng)建該對(duì)象的方法返回忱反,那么與方法內(nèi)部的其他局部變量相同泛释,新創(chuàng)建的Block對(duì)象也會(huì)被立即釋放。為了在聲明Block對(duì)象的方法返回后仍然保留該對(duì)象温算,必須向其發(fā)送copy消息怜校。拷貝某個(gè)Block對(duì)象時(shí)注竿,應(yīng)用會(huì)在堆中創(chuàng)建該對(duì)象的備份茄茁。這樣,即使應(yīng)用釋放了當(dāng)前方法的棧巩割,堆中的Block對(duì)象也不會(huì)被釋放裙顽。


image.png
捕獲變量

Block對(duì)象可以使用其封閉作用域(enclosingscope)內(nèi)的所有變量。對(duì)聲明了某個(gè)Block對(duì)象的方法宣谈,該方法的作用域就是這個(gè)Block對(duì)象的封閉作用域愈犹。因此,這個(gè)Block對(duì)象可以訪問(wèn)該方法的所有局部變量闻丑、傳入該方法的實(shí)參以及所屬對(duì)象的實(shí)例變量漩怎。如果捕獲變量是ObjectiveC對(duì)象俊啼,那么Block對(duì)象對(duì)捕獲變量具有強(qiáng)引用杏愤。如果捕獲變量也對(duì)Block對(duì)象具有強(qiáng)引用,就會(huì)導(dǎo)致強(qiáng)引用循環(huán)。


解決問(wèn)題的方法是:將actionBlock對(duì)cell的引用改為弱引用酸钦。

image.png

在Block對(duì)象執(zhí)行過(guò)程中,必須保證Block對(duì)象始終可以訪問(wèn)cell咱枉。因此卑硫,以上代碼在actionBlock內(nèi)部創(chuàng)建了strongCell,以保持對(duì)cell的強(qiáng)引用蚕断。這與Block對(duì)象對(duì)捕獲變量的強(qiáng)引用不同欢伏,strongCell只是在Block對(duì)象執(zhí)行過(guò)程中對(duì)cell保持強(qiáng)引用。

UICollectionView

UICollectionView與UITableView非常相似:
  ?UICollectionView是UIScrollView的子類亿乳。
  ?與UITableViewCell類似硝拧,UICollectionView對(duì)象顯示一組UICollectionViewCell或其子類径筏。
  ?UICollectionView具有數(shù)據(jù)源,負(fù)責(zé)提供UICollectionViewCell障陶∽烫瘢  ?UICollectionView具有委托,可以在委托方法中處理相關(guān)回調(diào)事件抱究,例如選擇了某一個(gè)UICollectionViewCell恢氯。
  ?UICollectionViewController與UITableViewController類似,UICollectionViewController也是UIViewController的子類鼓寺,其view是UICollectionView勋拟。
  UICollectionView與UITableView的區(qū)別是,UITableView只能顯示一列UITableViewCell妈候,在大屏幕設(shè)備(如iPad)中有很大的局限性敢靡。UICollectionView則可以將UICollectionViewCell按任意方式布局,其中最常見的是網(wǎng)格布局


image.png
UICollectionView對(duì)象圖示例

UICollectionView是如何布局UICollectionViewCell的苦银?UICollectionView含有一個(gè)布局對(duì)象醋安,負(fù)責(zé)控制每一個(gè)UICollectionViewCell的屬性,包括位置和大小墓毒。UICollectionView的布局對(duì)象繼承自一個(gè)名為UICollectionViewLayout的抽象類吓揪。如果需要將UICollectionViewCell按網(wǎng)格布局,則可以使用系統(tǒng)提供的UICollectionViewFlowLayout所计。但是柠辞,如果需要實(shí)現(xiàn)其他的布局方式,就必須創(chuàng)建UICollectionViewLayout的自定義子類主胧。

UICollectionViewCell也有contentView叭首,但是與UITableViewCell不同,UICollectionViewCell的contentView在默認(rèn)情況下沒(méi)有任何子視圖(UITableView默認(rèn)是有Cell踪栋,不一定要自主創(chuàng)建)焙格。因此,如果需要使用UICollectionView夷都,通常還需要?jiǎng)?chuàng)建一個(gè)UICollectionViewCell子類眷唉。

最后,UICollectionViewCell也具有背景視圖和選中狀態(tài)下的背景視圖(當(dāng)UICollectionViewCell處于選中狀態(tài)時(shí)囤官,該視圖會(huì)覆蓋在背景視圖上方)冬阳。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市党饮,隨后出現(xiàn)的幾起案子肝陪,更是在濱河造成了極大的恐慌,老刑警劉巖刑顺,帶你破解...
    沈念sama閱讀 218,284評(píng)論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件氯窍,死亡現(xiàn)場(chǎng)離奇詭異饲常,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)狼讨,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,115評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門不皆,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人熊楼,你說(shuō)我怎么就攤上這事霹娄。” “怎么了鲫骗?”我有些...
    開封第一講書人閱讀 164,614評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵犬耻,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我执泰,道長(zhǎng)枕磁,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,671評(píng)論 1 293
  • 正文 為了忘掉前任术吝,我火速辦了婚禮计济,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘排苍。我一直安慰自己沦寂,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,699評(píng)論 6 392
  • 文/花漫 我一把揭開白布淘衙。 她就那樣靜靜地躺著传藏,像睡著了一般。 火紅的嫁衣襯著肌膚如雪彤守。 梳的紋絲不亂的頭發(fā)上毯侦,一...
    開封第一講書人閱讀 51,562評(píng)論 1 305
  • 那天,我揣著相機(jī)與錄音具垫,去河邊找鬼侈离。 笑死,一個(gè)胖子當(dāng)著我的面吹牛筝蚕,可吹牛的內(nèi)容都是我干的卦碾。 我是一名探鬼主播,決...
    沈念sama閱讀 40,309評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼饰及,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼蔗坯!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起燎含,我...
    開封第一講書人閱讀 39,223評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎腿短,沒(méi)想到半個(gè)月后屏箍,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體绘梦,經(jīng)...
    沈念sama閱讀 45,668評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,859評(píng)論 3 336
  • 正文 我和宋清朗相戀三年赴魁,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了卸奉。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,981評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡颖御,死狀恐怖榄棵,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情潘拱,我是刑警寧澤疹鳄,帶...
    沈念sama閱讀 35,705評(píng)論 5 347
  • 正文 年R本政府宣布,位于F島的核電站芦岂,受9級(jí)特大地震影響瘪弓,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜禽最,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,310評(píng)論 3 330
  • 文/蒙蒙 一腺怯、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧川无,春花似錦呛占、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,904評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至愕够,卻和暖如春走贪,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背惑芭。 一陣腳步聲響...
    開封第一講書人閱讀 33,023評(píng)論 1 270
  • 我被黑心中介騙來(lái)泰國(guó)打工坠狡, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人遂跟。 一個(gè)月前我還...
    沈念sama閱讀 48,146評(píng)論 3 370
  • 正文 我出身青樓逃沿,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親幻锁。 傳聞我的和親對(duì)象是個(gè)殘疾皇子凯亮,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,933評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容

  • Swift1> Swift和OC的區(qū)別1.1> Swift沒(méi)有地址/指針的概念1.2> 泛型1.3> 類型嚴(yán)謹(jǐn) 對(duì)...
    cosWriter閱讀 11,101評(píng)論 1 32
  • 代碼創(chuàng)建UIWindow對(duì)象 Xcode7之后使用代碼創(chuàng)建UIWindow對(duì)象: //創(chuàng)建UIWindow對(duì)象 s...
    云之君兮鵬閱讀 1,317評(píng)論 0 2
  • { 24、Sqlite數(shù)據(jù)庫(kù) 1哄尔、存儲(chǔ)大數(shù)據(jù)量假消,增刪改查,常見管理系統(tǒng):Oracle岭接、MSSQLServer富拗、DB...
    CYC666閱讀 938評(píng)論 0 1
  • 一臼予、UICollectionView介紹 UICollectionView和UICollectionViewCon...
    無(wú)灃閱讀 4,487評(píng)論 4 18
  • 長(zhǎng)投21天理財(cái)訓(xùn)練營(yíng)到達(dá)尾聲了,學(xué)完這些的零基礎(chǔ)課程后啃沪,心態(tài)和認(rèn)知有了很大的改變粘拾,回想起這兩個(gè)星期的忙碌學(xué)...
    方方_e2a5閱讀 320評(píng)論 1 2