以前看到Apple store裏面有橫向的tableview,固然也有多是collectionview啦。git
尤爲是項目中只有一條那麼須要橫向滑動的東西,就沒有必要使用龐大的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,就不解釋爲何是這個值了,由於我不知道言語怎麼表達,我也找不到合適的畫圖工具。本身體驗一下就能體會到。spa
因此此時的橫向tableview向右向上都偏移 ABS(self.bounds.size.width - self.bounds.size.height) / 2 這個距離就行了。.net
剩下的就是封裝的時候,實現UITableView的回調了,UITableView的必須實現的回調就必須實現了,而後非必需的也能夠二次封裝,此時還能夠給一個默認的的值,以便不實現改回調時該輪子能給出默認的值,以下面的這個樣子:code
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 }
必須實現的回調也貼出來一下吧:blog
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的連接,能夠去下載源碼看看get
由於UITableView的回調,太多了,我就封裝了幾個,若是你須要更多的,能夠另行的仿照實現。源碼
說了這麼多,再說說這個輪子的弱點吧,由於在使用xib或者storyboard拖約束佈局的時候會產生問題,因此代碼中,默認的註釋掉了- (instancetype)initWithCoder:(NSCoder *)coder。推薦直接代碼寫frame。it
由於cell已經被旋轉,因此直接正常的frame的佈局就能夠了。
代碼:https://coding.net/u/ysk/p/HorizontalTableView/git
就寫到這吧,有什麼不妥或者感受我寫的有什麼不對的地方,歡迎指正啊。