iOS開發之多表視圖滑動切換樣本(仿"頭條"用戶端)---最佳化篇(一),ios樣本

來源:互聯網
上載者:User

iOS開發之多表視圖滑動切換樣本(仿"頭條"用戶端)---最佳化篇(一),ios樣本

  前幾天發布了一篇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

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.