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

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

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

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

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

blob.png

一:實現方案

最上方是一個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.       
  24.     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.           
  15.         [_dataSource addObject:tempArray]; 
  16.     } 
  17.  
  18.               

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
  4. _mViewFrame.origin.y, _mViewFrame.size.width, _mViewFrame.size.height - TOPHEIGHT)]; 
  5.     _scrollView.contentSize = CGSizeMake(_mViewFrame.size.width * _tabCount,
  6.  _mViewFrame.size.height - 60); 
  7.     _scrollView.backgroundColor = [UIColor grayColor]; 
  8.       
  9.     _scrollView.pagingEnabled = YES; 
  10.       
  11.     _scrollView.delegate = self; 
  12.     [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.           
  15.         UIButton *button = [[UIButton alloc] initWithFrame:CGRectMake(00, width, TOPHEIGHT)]; 
  16.         button.tag = i; 
  17.         [button setTitle:[NSString stringWithFormat:@"按鈕%d", i+1] forState:UIControlStateNormal]; 
  18.         [button addTarget:self action:@selector(tabButton:) forControlEvents:UIControlEventTouchUpInside]; 
  19.         [view addSubview:button]; 
  20.           
  21.           
  22.         [_topViews addObject:view]; 
  23.         [self addSubview:view]; 
  24.     } 

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]; 
  12.     } 

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; 
  15.     } 

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.       
  19.     SlideBarCell *cell = [tableView dequeueReusableCellWithIdentifier:@"SlideBarCell"]; 
  20.     if ([tableView isEqual:_scrollTableViews[_currentPage]]) { 
  21.          cell.tipTitle.text = _dataSource[_currentPage][indexPath.row]; 
  22.     } 
  23.      
  24.     return cell; 

Demo在GitHub上的分享地址:https://github.com/lizelu/SliderTabBar

責任編輯:倪明 來源: 青玉伏案的博客
相關推薦

2015-07-06 10:48:56

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

網易布局

2009-12-25 15:12:01

WPF平臺

2017-09-12 17:05:02

AndroidLoading客戶端

2021-09-22 15:46:29

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

2011-08-17 10:10:59

2011-03-24 13:00:31

配置nagios客戶端

2011-03-02 14:36:24

Filezilla客戶端

2010-12-21 11:03:15

獲取客戶端證書

2013-07-04 10:01:04

2014-09-02 10:55:25

iOS開發視圖切換

2011-10-26 13:17:05

2010-05-31 10:11:32

瘦客戶端

2022-11-29 17:08:03

開發Web客戶端

2009-03-04 10:27:50

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

51CTO技術棧公眾號

主站蜘蛛池模板: 九九久久国产 | 日日夜夜天天久久 | 亚洲精品国产第一综合99久久 | 国产电影精品久久 | 自拍偷拍亚洲视频 | 国产精品精品 | 在线伊人网 | 婷婷激情在线 | 国产精品国产成人国产三级 | 最新中文字幕 | 亚洲444kkkk在线观看最新 | 99资源| 国产精品一区二区久久久久 | 国产精品久久久久影院色老大 | h片在线免费观看 | 国产午夜精品一区二区三区四区 | 日日艹夜夜艹 | 午夜免费av | 国产精品区二区三区日本 | 久久午夜精品 | 亚洲成人免费观看 | 亚洲精品粉嫩美女一区 | 盗摄精品av一区二区三区 | 久操伊人| 欧美一级精品片在线看 | 91精品国产91久久综合桃花 | 国产精品日日做人人爱 | 免费h在线 | 亚洲欧美一区二区三区视频 | 99久久久99久久国产片鸭王 | www成人免费 | 国产欧美精品区一区二区三区 | 91精品国产综合久久香蕉922 | 日韩精品一区二区三区免费视频 | 免费观看av网站 | 日本一区二区在线视频 | 日韩欧美中文字幕在线观看 | 久久久久无码国产精品一区 | 在线中文字幕视频 | 国产精品久久久久久久久久久久久 | 欧美国产日韩精品 |