亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 學院 > 開發設計 > 正文

iOS開發之多表視圖滑動切換示例(仿"頭條"客戶端)---優化篇

2019-11-14 18:44:38
字體:
來源:轉載
供稿:網友

  前幾天發布了一篇iOS開發之多表視圖滑動切換示例(仿"頭條"客戶端)的博客,之所以寫這篇博客,是因為一位iOS初學者提了一個問題,簡單的寫了個demo做了個示范,讓其在基礎上做擴展和改進。被CocoaChina中iOS模塊所收錄實在出乎我的意料,鏈接地址(http://www.cocoachina.com/ios/20150706/12370.html),在CocoaChina上看了下面的評論,Demo的問題確實有,優化和改進的空間也是蠻大的。首先內存問題是必須考慮的,不能把這么多的TabalView實例化后添加到ScrollView上,只要是做過iOS的小伙伴這個問題應該不難看出。再一個是頭部按鈕多了以后會擠在一起,還有如果添加上網絡請求的話,沒做本地緩存,等一系列的問題。

  在今天的博客中要做兩個優化。第一:多個TableView的內存問題。第二:頭部多個按鈕的顯示問題。今天的博客的內容是在上一篇博客iOS開發之多表視圖滑動切換示例(仿"頭條"客戶端)做的優化和擴展,同時也會在gitHub上更新一下Demo的代碼,廢話不多說,開始今天博客的主題。

  一、多張表視圖的內存問題解決方案

    借鑒TableView中Cell的重用機制,我們就把之前的Demo中ScrollView上的TableView進行復用,在我的博客中用的是兩個TableView進行的交叉復用,當然你也可以用其他個數的TableView進行復用。下面是實例化ScrollView上的TableView的代碼,由下面的代碼可以看出只實例化2個TableView, 并且把初始化后的TableView放在了TableView的初始化的位置上。而在原來的Demo中  -(void) initDownTables 方法會實例化多個TableView, 這也是內存問題的根源。

 1 #PRagma mark --初始化下方的TableViews 2 -(void) initDownTables{ 3      4     for (int i = 0; i < 2; i ++) { 5          6         UITableView *tableView = [[UITableView alloc] initWithFrame:CGRectMake(i * _mViewFrame.size.width, 0, _mViewFrame.size.width, _mViewFrame.size.height - TOPHEIGHT)]; 7         tableView.delegate = self; 8         tableView.dataSource = self; 9         tableView.tag = i;10         11         [_scrollTableViews addObject:tableView];12         [_scrollView addSubview:tableView];13     }14     15 }

  

  上面的代碼減少了TableView的實例化,那么我們如何進行復用呢? 我個人采取的是改變TableView在ScrollView上的Frame, 并且刷新相應的TableView, 下面的代碼是把TableView移動到當前顯示頁數,并且刷新TableView上的數據。代碼如下:

 1 #pragma mark --根據scrollView的滾動位置復用tableView,減少內存開支 2 -(void) updateTableWithPageNumber: (NSUInteger) pageNumber{ 3     int tabviewTag = pageNumber % 2; 4      5     CGRect tableNewFrame = CGRectMake(pageNumber * _mViewFrame.size.width, 0, _mViewFrame.size.width, _mViewFrame.size.height - TOPHEIGHT); 6      7     UITableView *reuseTableView = _scrollTableViews[tabviewTag]; 8     reuseTableView.frame = tableNewFrame; 9     [reuseTableView reloadData];10 }

 

  上面的方法在那調用呢? 我是在ScrollView到達相應的頁數時進行tableView的移動和數據的刷新。具體的調用代理方法如下:

 1 - (void)scrollViewDidEndDecelerating:(UIScrollView *)scrollView 2  3 { 4     if ([scrollView isEqual:_scrollView]) { 5         _currentPage = _scrollView.contentOffset.x/_mViewFrame.size.width; 6          7         _currentPage = _scrollView.contentOffset.x/_mViewFrame.size.width; 8          9         //    UITableView *currentTable = _scrollTableViews[_currentPage];10         //    [currentTable reloadData];11         12         [self updateTableWithPageNumber:_currentPage];13 14         return;15     }16     [self modifyTopScrollViewPositiong:scrollView];17 }

 

  上面的代碼就可以實現TableView的復用了,并且減少了內存開支。如有更好的解決方案,還請提出,會及時的進行修改和改正。不希望大家只是“吐槽"和提出一些問題,我期待和大家交流和學習的是一些問題更好的解決方案。

 

  二、頭部按鈕達到一定數量時,布局的顯示方案。

  也是防新聞頭條的那種,按鈕多到一定個數時回使用ScrollView進行滾動。在本Demo中是超過6個按鈕就可以滑動,而6個以下是平分整個屏幕的寬度的。主要做的修改是把Button放到ScrollView上,找準時機,讓ScorllView進行滑動。下方的代碼是實例化TopScrollView,并把按鈕放到TopScrollView上:

 1 #pragma mark -- 實例化頂部的tab 2 -(void) initTopTabs{ 3     CGFloat width = _mViewFrame.size.width / 6; 4      5     if(self.tabCount <=6){ 6         width = _mViewFrame.size.width / self.tabCount; 7     } 8      9     _topMainView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, _mViewFrame.size.width, TOPHEIGHT)];10     11     _topScrollView = [[UIScrollView alloc] initWithFrame:CGRectMake(0, 0, _mViewFrame.size.width, TOPHEIGHT)];12     13     _topScrollView.showsHorizontalScrollIndicator = NO;14     15     _topScrollView.showsVerticalScrollIndicator = YES;16     17     _topScrollView.bounces = NO;18     19     _topScrollView.delegate = self;20     21     if (_tabCount >= 6) {22         _topScrollView.contentSize = CGSizeMake(width * _tabCount, TOPHEIGHT);23 24     } else {25         _topScrollView.contentSize = CGSizeMake(_mViewFrame.size.width, TOPHEIGHT);26     }27     28     29     [self addSubview:_topMainView];30     31     [_topMainView addSubview:_topScrollView];32     33     34     35     for (int i = 0; i < _tabCount; i ++) {36         37         UIView *view = [[UIView alloc] initWithFrame:CGRectMake(i * width, 0, width, TOPHEIGHT)];38         39         view.backgroundColor = [UIColor lightGrayColor];40         41         if (i % 2) {42             view.backgroundColor = [UIColor grayColor];43         }44         45         UIButton *button = [[UIButton alloc] initWithFrame:CGRectMake(0, 0, width, TOPHEIGHT)];46         button.tag = i;47         [button setTitle:[NSString stringWithFormat:@"按鈕%d", i+1] forState:UIControlStateNormal];48         [button addTarget:self action:@selector(tabButton:) forControlEvents:UIControlEventTouchUpInside];49         [view addSubview:button];50         51         52         [_topViews addObject:view];53         [_topScrollView addSubview:view];54     }55 }

 

  以上內容實在之前的Demo的基礎上做的簡單的修改,Demo還在完善中,后期會加上網絡請求,本地緩存等。發表博客的初衷是與大家進行交流和學習,而不是看一些人進行吐槽。問題是在所難免,希望大家能提出問題所在,給出自己的解決方案,進行交流,共同進步。下方是Demo運行的效果:

 

上面是運行結果截圖,下方是層次截圖:

  

  把新的代碼更新到了GitHub上,優化還在繼續,歡迎大家批評指正。
  Demo在GitHub上的分享地址:https://github.com/lizelu/SliderTabBar


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
yw.139尤物在线精品视频| 久久久久国色av免费观看性色| 日韩有码在线视频| 神马久久桃色视频| 92福利视频午夜1000合集在线观看| 91久久国产精品91久久性色| 久久久久北条麻妃免费看| 中文字幕亚洲国产| 欧美在线欧美在线| 96pao国产成视频永久免费| 韩曰欧美视频免费观看| 懂色av一区二区三区| 九九久久久久久久久激情| 欧美高清视频免费观看| 欧美日韩国产综合视频在线观看中文| 日韩欧美国产黄色| 国产精品久久久久久久app| 欧美一区二区三区免费观看| 亚洲va欧美va国产综合久久| 亚洲国产成人精品久久| 欧美一级视频在线观看| 久久久久久中文字幕| 中文字幕在线日韩| 欧美日韩一区免费| 97久久精品视频| 国产精品久久久久久久久久久久| 欧美大肥婆大肥bbbbb| 伊人久久男人天堂| 在线观看成人黄色| 色综合老司机第九色激情| 日韩av三级在线观看| 国产欧美va欧美va香蕉在线| 日韩精品一区二区三区第95| 日本久久中文字幕| 一区二区三区四区在线观看视频| 久久久久久国产三级电影| 韩剧1988免费观看全集| 色偷偷888欧美精品久久久| 亚洲iv一区二区三区| 国产三级精品网站| 精品激情国产视频| 欧美日韩在线另类| 欧美成人网在线| 曰本色欧美视频在线| 97精品久久久中文字幕免费| 欧美激情精品久久久久久久变态| 亚洲天堂精品在线| 国模gogo一区二区大胆私拍| 欧美亚洲国产日本| 中文字幕久精品免费视频| 91在线观看免费高清完整版在线观看| 亚洲欧美中文日韩在线v日本| 国产在线观看精品一区二区三区| 中文字幕精品一区久久久久| 亚洲成人aaa| 在线观看精品自拍私拍| 成人福利视频网| 2019中文字幕在线| 国产婷婷97碰碰久久人人蜜臀| 亚洲精品视频二区| 欧美国产日韩一区二区在线观看| 在线播放国产一区二区三区| 91精品国产综合久久香蕉922| 97在线视频免费看| 亚洲国内高清视频| 国产成人aa精品一区在线播放| 国产成人精品在线观看| 久久伊人色综合| 欧美性感美女h网站在线观看免费| 亚洲午夜精品视频| 欧美日韩国产页| 国产精品久久久91| www欧美xxxx| 69视频在线播放| 日韩精品视频免费| 中文字幕欧美视频在线| 成人精品视频久久久久| 日韩亚洲综合在线| 中文字幕在线亚洲| 中国日韩欧美久久久久久久久| 69**夜色精品国产69乱| 久久久精品2019中文字幕神马| 96sao精品视频在线观看| 欧美性生交大片免费| 国产亚洲aⅴaaaaaa毛片| 色妞欧美日韩在线| 日韩电影视频免费| 91久久久久久| 成人国内精品久久久久一区| 国产精品va在线播放我和闺蜜| 岛国av一区二区在线在线观看| 91精品视频免费| 国产精品狠色婷| 中文字幕在线看视频国产欧美| 中文字幕亚洲一区| 久久久久这里只有精品| 欧美在线观看网址综合| 91精品国产综合久久男男| 欧美成人精品一区二区三区| 日韩精品在线视频| 在线精品高清中文字幕| 欧美亚洲成人网| 久久伊人精品视频| 日韩亚洲成人av在线| 欧美色另类天堂2015| 成人性生交xxxxx网站| 国产成人精品国内自产拍免费看| 国产精品免费久久久久久| 美女久久久久久久久久久| 日韩中文在线中文网三级| 91精品国产99| 欧美电影免费看| 中文综合在线观看| 久久精品视频中文字幕| 亚洲精品98久久久久久中文字幕| 日韩美女中文字幕| 亚洲天堂av在线播放| 国产精品视频在线播放| 性欧美xxxx交| 日韩在线高清视频| 日韩免费在线电影| 中文字幕在线看视频国产欧美在线看完整| 亚洲国产精品免费| 亚洲**2019国产| 国产精品网站视频| 欧美日韩一区二区免费在线观看| 91中文字幕一区| 精品国产一区二区三区久久久狼| 97国产在线观看| 日韩欧美在线视频| 国产不卡在线观看| 在线播放国产一区中文字幕剧情欧美| 国产欧美最新羞羞视频在线观看| 浅井舞香一区二区| 国产免费一区二区三区在线能观看| 欧美性videos高清精品| 高清一区二区三区四区五区| 亚洲精品按摩视频| 欧美在线视频观看| 久久影院资源网| 久久久女女女女999久久| 成人有码视频在线播放| 欧美激情手机在线视频| 欧美激情国内偷拍| 久久久99久久精品女同性| 欧美激情一级欧美精品| 国产成人精品亚洲精品| 日韩中文字幕视频| 亚洲视频在线观看免费| 久热精品视频在线观看一区| 日韩精品在线第一页| 在线免费看av不卡| 亚洲人成电影网站色xx| 久久福利网址导航| xxxx欧美18另类的高清| 欧美激情亚洲另类| 78色国产精品| 亚洲片在线资源| 国产精品999999| 精品国产一区二区三区在线观看| 亚洲欧美日韩第一区| 久久久亚洲国产天美传媒修理工| 欧美激情久久久久久| 国产在线视频一区|