自定义cell的左侧滑动

效果如上图,中间那个白线是一个UIview.

如果不添加中间那根白线,用系统的方法就可以实现,方法如下

 1 -(NSArray<UITableViewRowAction*>*)tableView:(UITableView *)tableView editActionsForRowAtIndexPath:(NSIndexPath *)indexPath{
 2     UITableViewRowAction *rowAction = [UITableViewRowAction rowActionWithStyle:UITableViewRowActionStyleDefault
 3                                                                         title:@"删除" handler:^(UITableViewRowAction * _Nonnull action, NSIndexPath * _Nonnull indexPath) {
 4                                                                                                                        [self.datas removeObjectAtIndex:indexPath.row];
 5                                                              [tableView deleteRowsAtIndexPaths:[NSArray arrayWithObjects:indexPath, nil] withRowAnimation:UITableViewRowAnimationFade];
 6                                                                          }];
 7 //置顶
 8  UITableViewRowAction *topRowAction = [UITableViewRowAction rowActionWithStyle:UITableViewRowActionStyleDefault title:@"置顶" handler:^(UITableViewRowAction * _Nonnull action, NSIndexPath * _Nonnull indexPath) {
 9         [self.datas exchangeObjectAtIndex:indexPath.row withObjectAtIndex:0];
10         NSIndexPath *firstIndexPath = [NSIndexPath indexPathForRow:0 inSection:indexPath.section];
11         [tableView moveRowAtIndexPath:indexPath toIndexPath:firstIndexPath];
12     }];
13     topRowAction.backgroundColor = [UIColor blueColor];
14
15
16     
17     UITableViewRowAction *rowActionSec = [UITableViewRowAction rowActionWithStyle:UITableViewRowActionStyleDefault
18                                                                             title:@"编辑"    handler:^(UITableViewRowAction * _Nonnull action, NSIndexPath * _Nonnull indexPath) {
19                                                                                                                                  }];
20     rowActionSec.backgroundColor = [UIColor blueColor];
21     rowAction.backgroundColor = [UIColor blueColor];
22     
23     NSArray *arr = @[rowAction,topRowAction ,rowActionSec];
24     return arr;
25 }

要加上那根白线,或者加其他的子控件,可以在自定义cell的时候,给cell添加一个scrollView,设置scrollView的

contentSize为:CGSizeMake([UIScreen mainScreen].bounds.size.width+101, self.bounds.size.height);

将其他子控件添加到scrollView上.

为什么不将scrollView添加到contenView上呢?在cell上有一个contenView,最右侧还有一个辅助视图,添加到contenView上,有bug,会从辅助视图那里出来.

还有一个bug,就是再用Masonry做布局的时候,不能将布局的代码放在layoutSubviews里面,这个方法子控件的frame有改变的时候,就会调用,用Masonry会重复添加约束.

self.scrollview = [[UIScrollView alloc]initWithFrame:self.bounds];在第一次创建出来scrollview的时候此时scrollview的块为320,在6s上运行同样是320,需要在layoutSubviews方法里面在重新设置下self.scrollview.frame = self.bounds;

实现左滑

1 -(void)scrollViewDidEndDragging:(UIScrollView *)scrollView willDecelerate:(BOOL)decelerate{
2     if (self.scrollview.contentOffset.x>50) {
3         self.scrollview.contentOffset = CGPointMake(101, 0);
4     }else{
5         self.scrollview.contentOffset = CGPointZero;
6     }
7 }

如果想要实现跟系统一样的功能,就是在滑动cell的时候,只允许一行cell向左滑,在点击屏幕任意地方cell都会复位和点击cell的时候做其它的事情,比如push.

因为给cell添加了scrollview,cell监听不到自己的代理方法,包括touchBegan方法

因此需要给scrollview添加一个tap手势,同过block回调,可以实现push.如果scrollview上添加了删除和编辑按钮,可以给两个按钮设置不同的tag值,在通过block回调可以实现按钮点击事件.

 1 - (void)btnClick:(UIButton *)sender{
 2     if (sender.tag == 1) {
 3         
 4         if (self.editblock) {
 5             
 6             self.editblock(self);
 7             
 8         }
 9     }else if (sender.tag == 2){
10             
11             if (self.deleteblock) {
12                 
13                 self.deleteblock(self);
14             }
15     }
16     
17 }
18
19 //编辑按钮
20 - (void)editMyCarsSoucesBlock:(MyCarsSoucesBlock)editBlock {
21
22     self.editblock = editBlock;
23 }
24 //删除按钮
25 - (void)deleteMyCarsSoucesBlock:(MyCarsSoucesBlock)deleteBlock{
26     
27     self.deleteblock = deleteBlock;
28 }

在控制器里面调cell里面的block方法,在block里面写要实现的代码快就可以了.

要实现只有一行cell左滑,在cell里面写个复位的方法,实现这句代码就行 self.scrollview.contentOffset = CGPointZero;

在控制器里面

-(void)viewWillAppear:(BOOL)animated{

[super viewWillAppear:animated];

for (NSInteger i = 0; i < self.carDatas.count; i++) {

@autoreleasepool {

GCMyCarsSoucesCell *cell = [self.tableView cellForRowAtIndexPath:[NSIndexPath indexPathForItem:i inSection:0]];

[cell resetScrollerOffset];//重置的方法resetScrollerOffset

}

}

}

在此方法中

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

实现

[cell selectCellBlock:^(GCMyCarsSoucesCell *cell) {

for (NSInteger i = 0; i < self.carDatas.count; i++) {

@autoreleasepool {

cell = [self.tableView cellForRowAtIndexPath:[NSIndexPath indexPathForItem:i inSection:0]];

[cell resetScrollerOffset];

}

}

}];

还有bug,目前我只能写到这里,真希望能得到大神的指点!

时间: 2024-10-24 14:33:57

自定义cell的左侧滑动的相关文章

ios-表视图-demo-自定义cell和心得

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { static NSString *cellindentifier=@"cell"; if (self.celltype==KTableViewCellContenview) {//第一种自定义cell UITableViewCell *cell = [tableView dequ

百思不得姐之自定义cell(八)

一 运行图和解析顺序 1 运行图: 2 解析顺序: --> 2.1 新增的刷新功能(点击各自标题刷新和点击tabBar中的按钮刷新对应的内容) --> 2.2 论cell的2种做法 --> 2.3 自定义cell --> 2.4 设置cell的数据 --> 2.5 计算cell的高度 --> 2.6 处理热门评论 二 新增的数据刷新功能(接上一篇) 1 新增原因: 目前市面上很多app都有一样的功能,就是当程序启动进入主界面的时候,数据会刷新.当用户点击该页面对应的ti

IOS xib在tableview上的简单应用(通过xib自定义cell)

UITableView是一种常用的UI控件,在实际开发中,由于原生api的局限,自定义UITableViewCell十分重要,自定义cell可以通过代码,也可以通过xib. 这篇随笔介绍的是通过xib自定义cell. 首先通过gif介绍如何创建xib. 然后实现代码部分,要注意的是实现代码的同时要使代码与xib相关联.-如图 下面便是代码,一些解释我在代码中注释了. ViewController.m // // ViewController.m // CX-Xib在tableView中的简单应用

iOS 获取自定义cell上按钮所对应cell的indexPath.row的方法

在UITableView或UICollectionView的自定义cell中创建一button,在点击该按钮时知道该按钮所在的cell在UITableView或UICollectionView中的行数.就是cell的 indexPath.row,下面以UITableView为例: 有两种方法: -(IBAction):(id)sender { 1. 第一种方法,这个方便一点点,不用设置tag. NSLog(@"MyRow:%d",[self.table indexPathForCell

蓝懿教育 自定义cell

自定义cell的三种方式: 1.纯代码创建(布局内容经常改变的) 2.通过storyboard(显示固定,不涉及复用) 3.通过Xib(显示固定,但涉及复用) // dequeueRe...方法 如果是纯代码创建 就是一个参数 如果是storyboard创建 就是两个参数 通过Xib创建 - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{ M

iOS 代码自定义cell示例

底色标黄为代码自定义cell重点处,入手从这几点即可. MyCell.h #import <UIKit/UIKit.h> @interface MyCell :UITableViewCell @property(nonatomic,strong)UILabel *ageLabel; @property(nonatomic,strong)UILabel *nameLabel; @property(nonatomic,strong)UILabel *additionLabel; - (instan

猫猫学IOS(十六)UI之XIB自定义Cell实现团购UI

猫猫分享,必须精品 素材代码地址:http://blog.csdn.net/u013357243/article/details/44926809 原文地址:http://blog.csdn.net/u013357243?viewmode=contents 先看效果图 自定义Cell 本次主要是自定义Cell的学习 实现自定义Cell主要有三种方法:按照使用的频繁度排序: XIB > 纯代码 > StoryBoard XIB的定义步骤 1> 新建HMTgCell.xib 2> 拽一

(素材源码)猫猫学IOS(十六)UI之XIB自定义Cell实现团购UI

猫猫分享,必须精品 素材代码地址:http://download.csdn.net/detail/u013357243/8572001 原文地址:http://blog.csdn.net/u013357243?viewmode=contents 先看效果图 自定义Cell 本次主要是自定义Cell的学习 实现自定义Cell主要有三种方法:按照使用的频繁度排序: XIB > 纯代码 > StoryBoard XIB的定义步骤 1> 新建HMTgCell.xib 2> 拽一个需要自定义

iOS开发UI篇—以微博界面为例使用纯代码自定义cell程序编码全过程(一)

iOS开发UI篇-以微博界面为例使用纯代码自定义cell程序编码全过程(一) 一.storyboard的处理 直接让控制器继承uitableview controller,然后在storyboard中把继承自uiviewcontroller的控制器干掉,重新拖一个tableview controller,和主控制器进行连线. 项目结构和plist文件 二.程序逻辑业务的处理 第一步,把配图和plist中拿到项目中,加载plist数据(非png的图片放到spooding files中) 第二步,字