之前看到Apple store里面有橫向的tableview,當然也有可能是collectionview啦。
尤其是項目中只有一條那么需要橫向滑動的東西,就沒有必要使用龐大的collectionview了,點綴的使用一下橫向的tableview反而更方便和靈活。當然此處大部分的情況可能是在父tableview的cell中使用個橫向的tableview。
下面就簡單的介紹一下,基於系統原生的UITableView封裝橫向tableview的要點。
我封裝tableview的時候主要使用了一種比較流行的方法,tableview旋轉-PI/2個單位的弧度(即逆時針旋轉90度),cell旋轉PI/2個單位弧度(即順時針旋轉90度)。這樣的最終結果就是tableview成為了橫向的。封裝的過程中有一個地方比較難以理解的,就是橫向的tableview的point問題,因為旋轉,默認的是以tableview的中心點旋轉,這樣就造成了旋轉后“看起來”的位置或者說Frame發生了改變,所以要修復這個因為旋轉造成的“Frame偏差”。此處,你可以拿着你的手機,豎着放在一張豎着的A4紙上面,手機的左上角與A4紙左上角重合,意味着point為(0,0),然后你把手機逆時針旋轉90度,看看有什么結果,結果應該是,手機左面突出了A4紙一部分,上面也距離紙的頂邊一定的距離。那么這個距離是多少呢,應該就是長的二分之一減去寬的二分之一,具體的代碼就是這樣寫的ABS(self.bounds.size.width - self.bounds.size.height) / 2,就不解釋為什么是這個值了,因為我不知道言語怎么表達,我也找不到合適的畫圖工具。自己體驗一下就能體會到。
所以此時的橫向tableview向右向上都偏移 ABS(self.bounds.size.width - self.bounds.size.height) / 2 這個距離就好了。
剩下的就是封裝的時候,實現UITableView的回調了,UITableView的必須實現的回調就必須實現了,然后非必需的也可以二次封裝,此時還可以給一個默認的的值,以便不實現改回調時該輪子能給出默認的值,如下面的這個樣子:
1 - (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath { 2 if ([self.delegate_Y respondsToSelector:@selector(h_tableView:heightForRowAtIndexPath:)]) { 3 return [self.delegate_Y h_tableView:self heightForRowAtIndexPath:indexPath]; 4 } 5 return 100; 6 }
必須實現的回調也貼出來一下吧:
1 #pragma mark - UITableViewDataSource 2 - (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section { 3 if ([self.dataSource_Y respondsToSelector:@selector(h_tableView:numberOfRowsInSection:)]) { 4 return [self.dataSource_Y h_tableView:self numberOfRowsInSection:section]; 5 } 6 return 0; 7 } 8 9 - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { 10 if ([self.dataSource_Y respondsToSelector:@selector(h_tableView:cellForRowAtIndexPath:)]) { 11 return [self.dataSource_Y h_tableView:self cellForRowAtIndexPath:indexPath]; 12 } 13 return nil; 14 }
不用仔細看代碼也沒問題,最后我會貼出coding的鏈接,可以去下載源碼看看
因為UITableView的回調,太多了,我就封裝了幾個,如果你需要更多的,可以另行的仿照實現。
說了這么多,再說說這個輪子的弱點吧,因為在使用xib或者storyboard拖約束布局的時候會產生問題,所以代碼中,默認的注釋掉了- (instancetype)initWithCoder:(NSCoder *)coder。推薦直接代碼寫frame。
因為cell已經被旋轉,所以直接正常的frame的布局就可以了。
代碼:https://coding.net/u/ysk/p/HorizontalTableView/git
就寫到這吧,有什么不妥或者感覺我寫的有什么不對的地方,歡迎指正啊。
