iOS实现可以纵向横向滑动的表格实例代码

本文主要给大家介绍了关于iOS实现可以纵向横向滑动的表格的相关内容,分享出来供大家参考学习,下面来一起看看详细的介绍:

效果图

这个效果是今天公司项目里面遇上的,也是第一次遇见这种需求,所以记录下来,效果如上图。需求主要是可以实现上下的滑动,并且同时最左侧的“线路名称”这一列在向左滑动的时候是不能跟随滚动的。这个功能主要是实现用户可以方便查看关于一下难以看全的列表数据。下面说一下思路。

代码大体思路

由上面的GIF图和基本需求描述我们第一个想到的东西就是万能的tableview,没错,这个功能的完成当然离不开tableview,那么tableview应该怎样发挥它的功力呢,左右侧的信息需要对称,所以在这里我使用了两个tableview,也就是最左侧线路名称这一列是一个tableview,右侧的粉红色字体这些行是一个tableview。上下滑动两者关联是使用scrollview完成的。那接下来就结合代码简单说一下,也方便我以后回头看,哈哈哈。

代码解析

1、这是需要的原材料,每个变量都有注释它的功能了,一眼懂。titleTableView是最左侧的线路名称这一列。infoTableView是粉红色字体这些。contentView是titleTableView和最上方(除了“线路名称”)这一列内容的superView。

@property (nonatomic, strong) UITableView *titleTableView;//标题TableView
@property (nonatomic, strong) UITableView *infoTableView;//内容TableView
@property (nonatomic, strong) UIScrollView *contentView;//内容容器
@property (nonatomic, strong) NSArray *infoArr;//数组

@end

@implementation ViewController {
 CGFloat _kOriginX;
 CGFloat _kScreenWidth;
 CGFloat _kScreenHeight;
}

2、这是所需要的数据配置,我把里面所有需要的数据都放在数组李典里面了。我比较懒。哈哈哈哈

- (void)configData {

 _kOriginX = 120;
 _kScreenWidth = self.view.frame.size.width;
 _kScreenHeight = self.view.frame.size.height;
 _infoArr = @[@{@"title":@"出团日期", @"routeName":@"线路名称一", @"time":@"2015/11/21", @"num":@"20", @"price":@"124.0", @"code":@"DAGSDSASA"},
     @{@"title":@"余位", @"routeName":@"线路名称二", @"time":@"2015/11/21", @"num":@"34", @"price":@"234", @"code":@"TAGDFASFAF"},
     @{@"title":@"价格", @"routeName":@"线路名称三", @"time":@"2015/11/21", @"num":@"12", @"price":@"634", @"code":@"GHGASDAS"},
     @{@"title":@"团代号", @"routeName":@"线路名称四", @"time":@"2015/11/56", @"num":@"54", @"price":@"632", @"code":@"DAADSFAD"}];
}

3、分步来看,首先是头部的,这个titleLabel是最左上角的“线路名称”这四个字,contentView的配置,上面说了这个contentView的作用的,从它的frame看出来, _contentView = [[UIScrollView alloc] initWithFrame:CGRectMake(_kOriginX, 0, _kScreenWidth - _kOriginX, _kScreenHeight)];它的x是_kOriginX也就是预留的最左侧的空间。最上面的一列使用for循环创建出来的label。

//MARK:- 头部视图
- (void)configTableHeader {

 UILabel *titleLabel = [self quickCreateLabelWithLeft:0 width:_kOriginX title:@"线路名称"];
 [self.view addSubview:titleLabel];

 _contentView = [[UIScrollView alloc] initWithFrame:CGRectMake(_kOriginX, 0, _kScreenWidth - _kOriginX, _kScreenHeight)];
 _contentView.delegate = self;
 _contentView.showsVerticalScrollIndicator = NO;
 _contentView.showsHorizontalScrollIndicator = NO;
 _contentView.contentSize = CGSizeMake(400, _kScreenHeight);
 _contentView.bounces = NO;
 [self.view addSubview:_contentView];

 for (int i = 0; i < _infoArr.count; i++) {
  CGFloat x = i * 100;
  UILabel *label = [self quickCreateLabelWithLeft:x width:100 title:[[_infoArr objectAtIndex: i] objectForKey:@"title"]];
  label.textAlignment = NSTextAlignmentCenter;
  [_contentView addSubview:label];
 }
}

4、那接下来就是配置最左侧那一栏和左侧粉红色字体那些行。也就这两个tableview创建的。

//MARK:- 详细内容
- (void)configInfoView {
 _titleTableView = [[UITableView alloc] initWithFrame:CGRectMake(0, 40, _kOriginX, _kScreenHeight) style:UITableViewStylePlain];
 _titleTableView.dataSource = self;
 _titleTableView.delegate = self;
 _titleTableView.showsVerticalScrollIndicator = NO;
 _titleTableView.showsHorizontalScrollIndicator = NO;
 _titleTableView.separatorStyle = UITableViewCellSeparatorStyleNone;
 [self.view addSubview:_titleTableView];

 _infoTableView = [[UITableView alloc] initWithFrame:CGRectMake(0, 40, 400, _kScreenHeight) style:UITableViewStylePlain];
 _infoTableView.delegate = self;
 _infoTableView.dataSource = self;
 _infoTableView.showsVerticalScrollIndicator = NO;
 _infoTableView.showsHorizontalScrollIndicator = NO;
 _infoTableView.separatorStyle = UITableViewCellSeparatorStyleNone;
 [_contentView addSubview:_infoTableView];
}

5、这是tableview的代理方法实现。在cellForRowAtIndexPath这个代理方法中,将两个tableview的cell分开来写。

//MARK:- UITableViewDataSource
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {

 return _infoArr.count;
}

- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView {
 return 1;
}

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {

 if (tableView == _titleTableView) {
  UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"titleTable"];
  if (!cell) {
   cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:@"titleTable"];
  }
  cell.textLabel.textAlignment = NSTextAlignmentCenter;
  cell.selectionStyle = UITableViewCellSelectionStyleNone;
  cell.textLabel.text = [[_infoArr objectAtIndex:indexPath.row] objectForKey:@"routeName"];
  cell.textLabel.textColor = [UIColor lightGrayColor];
  cell.textLabel.font = [UIFont systemFontOfSize:14];
  if (indexPath.row%2 == 1) {
   cell.backgroundColor = [UIColor colorWithRed:218/255.0 green:218/255.0 blue:218/255.0 alpha:1];
  } else {
   cell.backgroundColor = [UIColor whiteColor];
  }
  return cell;
 } else {
  NSString *ident = @"InfoCell";
  InfoCell *cell = [tableView dequeueReusableCellWithIdentifier:ident];
  if (!cell) {
   cell = [[[NSBundle mainBundle] loadNibNamed:@"InfoCell" owner:nil options:nil] lastObject];
  }
  if (indexPath.row%2 == 1) {
   cell.backgroundColor = [UIColor colorWithRed:218/255.0 green:218/255.0 blue:218/255.0 alpha:1];
  } else {
   cell.backgroundColor = [UIColor whiteColor];
  }
  [cell setDataWithStr:[_infoArr objectAtIndex:indexPath.row]];
  return cell;
 }
}

//MARK:- UITableViewDelegate
- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath {
 return 40;
}

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {

 NSLog(@"选中了%@", [_infoArr[indexPath.row] objectForKey:@"routeName"]);
}

6、这个方法就是实现上下滑动时候,左侧和右侧tableview联动的实现方法。

//MARK:- UIScrollViewDelegate
- (void)scrollViewDidScroll:(UIScrollView *)scrollView {
 if (scrollView == _titleTableView) {
  [_infoTableView setContentOffset:CGPointMake(_infoTableView.contentOffset.x, _titleTableView.contentOffset.y)];
 }
 if (scrollView == _infoTableView) {
  [_titleTableView setContentOffset:CGPointMake(0, _infoTableView.contentOffset.y)];
 }
}

总结

啊,写完感觉也是比较简单,就是基本方法的配合使用,当时想的时候也是没有能一下想出来,还是自己基本功不好的原因吧。把这个效果的实现记录在这里,也是为了提醒自己,也就是这个功能比较简单,但是再怎样的功能都是靠最基本的东西堆砌的。思想很重要,但是最重要的还是去实现,光想没有用,人不是靠嘴活的。与君共勉。

代码地址:https://github.com/irembeu/HorizontalSwipListView.git

本地下载地址:http://xiazai.jb51.net/201706/yuanma/ListTableView(jb51.net).rar

总结

以上就是这篇文章的全部内容了,希望本文的内容对给各位iOS开发者们能带来一定的帮助,如果有疑问大家可以留言交流,谢谢大家对我们的支持。

(0)

相关推荐

  • iOS自动生成表格效果的实现代码

    一.效果图 二.工程图 三.代码. RootViewController.h #import <UIKit/UIKit.h> #import "LabelOnBackImage.h" @interface RootViewController : UIViewController { LabelOnBackImage *labelFirst; } @end RootViewController.m #import "RootViewController.h&quo

  • iOS实现可以纵向横向滑动的表格实例代码

    本文主要给大家介绍了关于iOS实现可以纵向横向滑动的表格的相关内容,分享出来供大家参考学习,下面来一起看看详细的介绍: 效果图 这个效果是今天公司项目里面遇上的,也是第一次遇见这种需求,所以记录下来,效果如上图.需求主要是可以实现上下的滑动,并且同时最左侧的"线路名称"这一列在向左滑动的时候是不能跟随滚动的.这个功能主要是实现用户可以方便查看关于一下难以看全的列表数据.下面说一下思路. 代码大体思路 由上面的GIF图和基本需求描述我们第一个想到的东西就是万能的tableview,没错,

  • jsp中实现带滚动条的table表格实例代码

    如下所示: <div style="width:700px; height:225px; overflow:auto;"> <table border="1" width="100%" cellpadding="0" cellspacing="0"> <tr> <td width="3%">0</td> <td width

  • BootStrap数据表格实例代码

    首先初始化页面 $(function(){ $('#archives-table').bootstrapTable({ url: "/coinSend/list",//数据源 dataField: "rows",//服务端返回数据键值 就是说记录放的键值是rows,分页时使用总记录数的键值为total search: true,//是否搜索 cache: false, striped: true, pagination: true,//是否分页 sortable:

  • iOS开发中Swift 指纹验证功能模块实例代码

    iOS调用TouchID代码: override func viewDidLoad() { super.viewDidLoad() let context = LAContext() var error: NSError? = nil let canEvaluatePolicy = context.canEvaluatePolicy(LAPolicy.deviceOwnerAuthenticationWithBiometrics, error: &error) as Bool if error

  • 使用jquery datatable和bootsrap创建表格实例代码

    使用jquery-datatable插件 bootstrap前端框架 json 一.创建demo.html 代码块 代码块语法遵循标准markdown代码,例如: <%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%> <%@ taglib uri="http://java.sun.com/jsp/jstl/core" pref

  • Android 从底部弹出Dialog(横向满屏)的实例代码

    项目中经常需要底部弹出框,这里我整理一下其中我用的比较顺手的一个方式(底部弹出一个横向满屏的dialog). 效果图如下所示(只显示关键部分): 步骤如下所示: 1.定义一个dialog的布局(lay_share.xml) <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/androi

  • IOS NSUserDefault 记住用户名及密码功能的实例代码

    一般的登录界面都会有一个记住密码的选项,要实现这个功能可以使用NSUserDefault,这里只是讲解明文的处理方式,虽然这样是有一定的风险性的但是目前只是了解如何实现这个功能: 首先声明一个NSUserDefault对象: let userDefaults = NSUserDefaults.standardUserDefaults() //本地操作所需 然后根据是否记住密码按钮的状态来判断是否要为用户名和密码设置值,如果是记住密码,那么需要取出需要记住的密码,并且为这两个TextField赋值

  • matplotlib作图添加表格实例代码

    本文所示代码主要是通过Python+matplotlib实现作图,并且在图中添加表格的功能,具体如下. 代码 import matplotlib.pyplot as plt import numpy as np plt.figure() ax = plt.gca() y = np.random.randn(9) col_labels = ['col1','col2','col3'] row_labels = ['row1','row2','row3'] table_vals = [[11,12,

  • 仿ios状态栏颜色和标题栏颜色一致的实例代码

    首先创建一个工具类 import android.annotation.TargetApi; import android.app.Activity; import android.content.Context; import android.os.Build; import android.support.v4.content.ContextCompat; import android.view.View; import android.view.ViewGroup; public clas

  • Android中View跟随手指滑动效果的实例代码

    本文讲述了Android中View跟随手指滑动效果的实例代码.分享给大家供大家参考,具体如下: 1.android View 主要6种滑动方法,分别是 layout() offsetLeftAndRight()和offsetTopAndBottom() LayoutParams scrollBy()和 scrollTo() Scroller 动画 2.实现效果图 3.自定义中使用layout()方法实习view的滑动 public class MoveView extends View { pr

随机推荐