成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

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

移動開發
廢話少說,先介紹一下功能點,下圖是整個Demo的功能點,最上面左邊的TabBarButtonItem是用來減少條目的,比如下圖有三個按鈕,點擊減號會減少一個條目。右邊的為增加一個條目。點擊相應的按鈕是切換到對應的表視圖上,下方紅色的是滑動的指示器,同時支持手勢滑動。運行具體效果如下圖所示。

好長時間沒為大家帶來iOS開發干貨的東西了,今天給大家分享一個頭條新聞客戶端各個類別進行切換的一個示例。在Demo中對所需的組件進行的簡單封裝,在封裝的組件中使用的是純代碼的形式,如果想要在項目中進行使用,稍微進行修改即可。

廢話少說,先介紹一下功能點,下圖是整個Demo的功能點,最上面左邊的TabBarButtonItem是用來減少條目的,比如下圖有三個按鈕,點擊減號會減少一個條目。右邊的為增加一個條目。點擊相應的按鈕是切換到對應的表視圖上,下方紅色的是滑動的指示器,同時支持手勢滑動。運行具體效果如下圖所示。

 

一:實現方案

最上方是一個View, View上面實例化了一些按鈕,平分屏幕的寬度,下方是一個ScrollView, ScrollView上面放了一些表視圖,點擊不同的Button, 滑動到對應的表示圖上。除了點擊按鈕,還可以進行滑動切換,切換時,紅色的指示器也會隨之滑動。

主要的技術點就是通過ScrollView的回調,通過事件的響應來改變ScrollView的ContentOffset的值。在回調中根據ContentOffset的值來計算紅色指示器的偏移量。

二:核心代碼

1.組件中的主要屬性

把上面整個視圖進行了封裝,命名為SlideTabBarView,下面的代碼是主要屬性:
 

  1. @interface SlideTabBarView()///@brife 整個視圖的大小 
  2. @property (assign) CGRect mViewFrame; 
  3. ///@brife 下方的ScrollView 
  4. @property (strong, nonatomic) UIScrollView *scrollView; 
  5. ///@brife 上方的按鈕數組 
  6. @property (strong, nonatomic) NSMutableArray *topViews; 
  7. ///@brife 下方的表格數組 
  8. @property (strong, nonatomic) NSMutableArray *scrollTableViews; 
  9. ///@brife TableViews的數據源 
  10. @property (strong, nonatomic) NSMutableArray *dataSource; 
  11. ///@brife 當前選中頁數 
  12. @property (assign) NSInteger currentPage; 
  13. ///@brife 下面滑動的View 
  14. @property (strong, nonatomic) UIView *slideView; 
  15. @end 

2.初始化方法如下,在調用初始化方法時需要傳入SlideTabBarView的frame和選項卡的個數,初始化函數會調用一系列的初始化方法對組件進行初始化,代碼如下:

  1. -(instancetype)initWithFrame:(CGRect)frame WithCount: (NSInteger) count{ 
  2. self = [super initWithFrame:frame]; 
  3.  
  4. if (self) { 
  5. _mViewFrame = frame; 
  6. _tabCount = count; 
  7. _topViews = [[NSMutableArray alloc] init]; 
  8. _scrollTableViews = [[NSMutableArray alloc] init]; 
  9.  
  10. [self initDataSource]; 
  11.  
  12. [self initScrollView]; 
  13.  
  14. [self initTopTabs]; 
  15.  
  16. [self initDownTables]; 
  17.  
  18. [self initDataSource]; 
  19.  
  20. [self initSlideView]; 
  21.  
  22.  
  23. return self; 

3.initDataSource方法主要負責模擬生成下方TableView要顯示的數據。代碼如下:

  1. #pragma mark -- 初始化表格的數據源 
  2. -(void) initDataSource{ 
  3. _dataSource = [[NSMutableArray alloc] initWithCapacity:_tabCount]; 
  4.  
  5. for (int i = 1; i <= _tabCount; i ++) { 
  6.  
  7. NSMutableArray *tempArray = [[NSMutableArray alloc] initWithCapacity:20]; 
  8.  
  9. for (int j = 1; j <= 20; j ++) { 
  10.  
  11. NSString *tempStr = [NSString stringWithFormat:@"我是第%d個TableView的第%d條數據。", i, j]; 
  12. [tempArray addObject:tempStr]; 
  13.  
  14. [_dataSource addObject:tempArray]; 

4.紅色滑動指示器的初始化代碼如下所示:

  1. #pragma mark -- 初始化滑動的指示View 
  2. -(void) initSlideView{ 
  3. CGFloat width = _mViewFrame.size.width / _tabCount; 
  4. _slideView = [[UIView alloc] initWithFrame:CGRectMake(0, TOPHEIGHT - 5, width, 5)]; 
  5. [_slideView setBackgroundColor:[UIColor redColor]]; 
  6. [self addSubview:_slideView]; 

5.ScrollView的初始化代碼如下, 指定ScrollView的大小位置以及背景顏色,并且設置分頁可用并添加代理。

  1. #pragma mark -- 實例化ScrollView 
  2. -(void) initScrollView{ 
  3. _scrollView = [[UIScrollView alloc] initWithFrame:CGRectMake(0, _mViewFrame.origin.y, _mViewFrame.size.width, _mViewFrame.size.height - TOPHEIGHT)]; 
  4. _scrollView.contentSize = CGSizeMake(_mViewFrame.size.width * _tabCount, _mViewFrame.size.height - 60); 
  5. _scrollView.backgroundColor = [UIColor grayColor]; 
  6.  
  7. _scrollView.pagingEnabled = YES; 
  8.  
  9. _scrollView.delegate = self; 
  10. [self addSubview:_scrollView]; 

6.添加上方的按鈕,根據傳入的個數來實例化多個按鈕。

  1. #pragma mark -- 實例化頂部的tab 
  2. -(void) initTopTabs{ 
  3. CGFloat width = _mViewFrame.size.width / _tabCount; 
  4.  
  5. for (int i = 0; i < _tabCount; i ++) { 
  6.  
  7. UIView *view = [[UIView alloc] initWithFrame:CGRectMake(i * width, 0, width, TOPHEIGHT)]; 
  8.  
  9. view.backgroundColor = [UIColor lightGrayColor]; 
  10.  
  11. if (i % 2) { 
  12. view.backgroundColor = [UIColor grayColor]; 
  13.  
  14. UIButton *button = [[UIButton alloc] initWithFrame:CGRectMake(00, width, TOPHEIGHT)]; 
  15. button.tag = i; 
  16. [button setTitle:[NSString stringWithFormat:@"按鈕%d", i+1] forState:UIControlStateNormal]; 
  17. [button addTarget:self action:@selector(tabButton:) forControlEvents:UIControlEventTouchUpInside]; 
  18. [view addSubview:button]; 
  19.  
  20.  
  21. [_topViews addObject:view]; 
  22. [self addSubview:view]; 

7.點擊按鈕觸發的方法如下:
 

  1. #pragma mark --點擊頂部的按鈕所觸發的方法 
  2. -(void) tabButton: (id) sender{ 
  3. UIButton *button = sender; 
  4. [_scrollView setContentOffset:CGPointMake(button.tag * _mViewFrame.size.width, 0) animated:YES]; 

8.初始化下方的多個表視圖:實例化表視圖,并指定委托回調。

  1. #pragma mark --初始化下方的TableViews 
  2. -(void) initDownTables{ 
  3.  
  4. for (int i = 0; i < _tabCount; 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.  
  10. [_scrollTableViews addObject:tableView]; 
  11. [_scrollView addSubview:tableView]; 

9.ScrollView的回調方法如下,下面***一個代理方法是根據ScrollView的偏移量來計算紅色指示器的偏移量,第二個是滑動到哪個tableView,然后進行哪個TableView的數據加載。

  1. #pragma mark -- scrollView的代理方法 
  2. -(void)scrollViewDidEndScrollingAnimation:(UIScrollView *)scrollView{ 
  3. [self scrollViewDidEndDecelerating:scrollView]; 
  4. - (void)scrollViewDidEndDecelerating:(UIScrollView *)scrollView 
  5. _currentPage = _scrollView.contentOffset.x/_mViewFrame.size.width; 
  6.  
  7. UITableView *currentTable = _scrollTableViews[_currentPage]; 
  8. [currentTable reloadData]; 
  9.  
  10. -(void)scrollViewDidScroll:(UIScrollView *)scrollView{ 
  11. if ([_scrollView isEqual:scrollView]) { 
  12. CGRect frame = _slideView.frame; 
  13. frame.origin.x = scrollView.contentOffset.x/_tabCount; 
  14. _slideView.frame = frame; 

10.TableView的代理方法如下,數據源就是我們剛才做的假數據,Cell是由Xib實現的,使用的時候注冊一下就可用了。

  1. pragma mark -- talbeView的代理方法 
  2. -(NSInteger)numberOfSectionsInTableView:(UITableView *)tableView{ 
  3. return 1
  4. -(NSInteger) tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section{ 
  5. NSMutableArray *tempArray = _dataSource[_currentPage]; 
  6. return tempArray.count; 
  7. -(CGFloat) tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath{ 
  8. return 60
  9. -(UITableViewCell *)tableView:tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{ 
  10.  
  11. BOOL nibsRegistered=NO; 
  12. if (!nibsRegistered) { 
  13. UINib *nib=[UINib nibWithNibName:@"SlideBarCell" bundle:nil]; 
  14. [tableView registerNib:nib forCellReuseIdentifier:@"SlideBarCell"]; 
  15. nibsRegistered=YES; 
  16.  
  17.  
  18. SlideBarCell *cell = [tableView dequeueReusableCellWithIdentifier:@"SlideBarCell"]; 
  19. if ([tableView isEqual:_scrollTableViews[_currentPage]]) { 
  20. cell.tipTitle.text = _dataSource[_currentPage][indexPath.row]; 
  21.  
  22. return cell; 
  23.  
  24. Demo在GitHub上的分享地址:https://github.com/lizelu/SliderTabBar 
責任編輯:chenqingxiang 來源: CocoaChina
相關推薦

2015-07-13 14:05:32

ios開發多表視圖

2015-12-09 11:22:24

高仿今日頭條android源碼

2013-07-22 14:29:35

iOS開發ASIHTTPRequ

2014-08-11 16:35:35

KafkaJava客戶端

2011-06-15 17:28:23

Qt 多視圖 架構

2015-01-09 11:49:26

Android源碼下載

2015-03-30 14:24:06

網易布局

2017-09-12 17:05:02

AndroidLoading客戶端

2009-12-25 15:12:01

WPF平臺

2021-09-22 15:46:29

虛擬桌面瘦客戶端胖客戶端

2011-08-17 10:10:59

2010-05-31 10:11:32

瘦客戶端

2011-03-24 13:00:31

配置nagios客戶端

2011-03-02 14:36:24

Filezilla客戶端

2010-12-21 11:03:15

獲取客戶端證書

2011-10-26 13:17:05

2013-07-04 10:01:04

2014-09-02 10:55:25

iOS開發視圖切換

2022-11-29 17:08:03

開發Web客戶端

2009-03-04 10:27:50

客戶端組件桌面虛擬化Xendesktop
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 午夜精品91 | 1级黄色大片| 精品视频成人 | 激情五月激情综合网 | 欧美一级免费片 | 国产欧美日韩精品在线观看 | 综合五月| 欧美性一区二区三区 | 久久精品国产免费 | 久久久久国产精品www | 中文字幕精品一区二区三区精品 | 国产在线一区观看 | 欧美国产日韩一区 | 狼人伊人影院 | 欧美黄色一区 | 噜久寡妇噜噜久久寡妇 | 精品亚洲国产成av人片传媒 | 国产精品一区网站 | 日本一区二区三区四区 | 高清色视频 | 欧美精品1区| 日本视频一区二区三区 | 国产久 | 久草网址 | 久久国产精品一区二区三区 | 91在线网站| 成人日韩 | 一级午夜aaa免费看三区 | 免费观看成人性生生活片 | 久久久精品一区 | 北条麻妃一区二区三区在线观看 | 精品久久久久一区 | 日日噜噜噜夜夜爽爽狠狠视频97 | 在线欧美一区二区 | 免费观看黄网站 | 国产精品久久久久久二区 | 午夜极品| 青草青草久热精品视频在线观看 | 美女视频h | 久久999 | 国产精品久久久久久久7电影 |