[iOS] horizontally scrollable UITableViewCell

可以水平捲動的UITableViewCell。本篇文章並非給初學者享用,但會說明所有關鍵的地方,請自己補上程式碼。

軟體版本:iOS 8.2+,Xcode 6+。

最近為了這個功能有點頭痛,可是默默的做出來後,發現也不是說非常的複雜,主要的功能是說,有些row的內容會比較多,所以必須呈現一個以上的cell(此cell的客製的,之後講到的cell全都是指客製化的cell,有自己的nib和.h.m檔案),所以這樣的可捲動cell裡面必須裝一個scroll view去裝這些cell,實作起來略有點複雜。

首先,我們會有三個物件:
  1. Cell
  2. ScrollCell:裡面放一個scroll view,用來放Cell,並且有一個委任方法(delegate method)
  3. ViewController:裡面裝一個table view,此view controller遵守scroll cell的protocol
由於Cell和Scroll cell都由nib拉好介面樣子,所以他們由nib去初始化,注意ScrollCell,他插入的Cell是寫在程式內(ScrollCell.m)去執行的。

ScrollCell的實作

ScrollCell的委任方法是什麼呢?這跟ViewController裡面的didSelectRowAtIndexPath:有關。由於didSelectRowAtIndexPath:處理的是點選Cell,但是ScrollCell裡面插入的Cell並不是真正ViewController的tableView接受的cell,所以點選是無效的,因此將ScrollCell內含的Cell點選的邏輯用UITapGestureRecognizer寫,然後處理的邏輯交給ViewController完成。

ViewController的實作

他要注意的地方比較多一點:
  • Table View Delagate方法:
    • cellForRowAtIndexPath:cell實作
    • didSelectRowAtIndexPath:點選ell後要執行的邏輯
    • heightForRowAtIndexPath:每row的cell的高度
    • willSelectRowAtIndexPath:處理ScrollCell的效果,讓你點選ScrollCell空白處不會有反應
  • Table相關方法:
    • initTableView:註冊你的Cell和ScrollCell
  • ScollCell委任方法:處理點選ScrollCell內個別Cell的事件
首先你要先註冊你使用的客製化cell的重用識別符(reuse identifier)和他們的nib檔,這讓你的table view知道他要初始化的cell是哪些nib製作的:

registerNib: forCellReuseIdentifier:

也可以使用registerClass:forCellReuseIdentifier:

cellForRowAtIndexPath 

然後在cellForRowAtIndexPath裡面去設定Cell和ScrollCell的內容(接口們,然後是用if去個別處理兩者的),注意,我原本是在 cellForRowAtIndexPath 裡面對ScrollCell插入Cell,但這會造成無法reuse ScrollCell而讓記憶體激增,所以我才會改在ScrollCell.m裡面處理(awakeFromNib裡面去addSubview:,因為是從nib喚醒)。然後cellForRowAtIndexPath裡面把ScrollCell裡面已經插入的Cell一個個拿出來去設定。

didSelectRowAtIndexPath 和 willSelectRowAtIndexPath

didSelectRowAtIndexPath是沒啥好講的,就是點了之後會進去Cell的內容,這可能是一個新的頁面或是其他的效果,重點是 willSelectRowAtIndexPath ,因為ScollCell空白的地方點下去後會呼叫didSelectRowAtIndexPath,但我們要的是點選ScollCell內的Cell,所以在willSelectRowAtIndexPath裡面取消它,作法是判斷出特定的indexPath後回傳nil而不是該indexPath。

heightForRowAtIndexPath

這就是分別去設定兩種Cell的Row高度,沒什麼特別好講的。

ScollCell委任方法

這就是會執行本來是在didSelectRowAtIndexPath裡面執行的邏輯。

留言