最新下载
热门教程
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
解决iOS 加在UIScrollView上的UITableView滑动手势冲突问题办法
时间:2022-06-25 23:33:08 编辑:袖梨 来源:一聚教程网
在UITableView里面实现cell的左滑删除功能是挺简单的,一般大家都会做。但是,如果把UITableView加在UIScrollView上的时候,就会产生一系列的问题。
首先阐明是因为UITableView列表太宽,超出了屏幕的宽度,所以只好加在UIScrollView上,控制UIScrollView的contentSize实现列表的左右滑动。
一般我们的用户体验都是希望表格是紧贴屏幕边框,不让用户看到屏幕多余出来的部分,这时候就要把UIScrollView的属性bounces给关闭,设置为NO,也就是所谓的弹簧效果。
下面我们来说说把UITableView加在UIScrollView上的时候,产生的问题:
有些项目要求给UITableView做左滑删除功能,但是这个UITableView列表是加在UIScrollView上的,这时候如果你向左滑动,你会发现没法看到左滑出来的删除按钮,但是也有时候会出来,我想可能是这时候的手势滑动响应在了UITableView身上,这就是滑动手势冲突的问题。经过一番查阅资料,终于找到了解决办法,办法就是重写UIScrollView类,继承UIScrollView。
MyScrollview.h文件
#import
@interface MyScrollview : UIScrollView
-(BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldRecognizeSimultaneouslyWithGestureRecognizer:(UIGestureRecognizer *)otherGestureRecognizer;
@end
MyScrollview.m文件
#import "MyScrollview.h"
@implementation MyScrollview
-(BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldRecognizeSimultaneouslyWithGestureRecognizer:(UIGestureRecognizer *)otherGestureRecognizer {
if (gestureRecognizer.state != 0) {
return YES;
} else {
return NO;
}
}
@end
接下来就可以在主界面ViewController里导入#import “MyScrollview.h”,使用MyScrollview代替UIScrollView。
附上我写的一个小demo代码:
#import "ViewController.h"
#import "sideslipTableViewCell.h"
#import "MyScrollview.h"
@interface ViewController ()
UITableView *sideslipTableView;
NSMutableArray *dataArray;
MyScrollview *mainScrollView;
}
@end
@implementation ViewController
- (void)viewDidLoad {
[super viewDidLoad];
[self initUI];
dataArray = [NSMutableArray arrayWithArray: @[@"1111",@"2222",@"3333",@"4444",@"5555",@"6666",@"7777",@"8888",@"9999"]];
}
#pragma mark - 初始化UI
- (void)initUI{
self.view.backgroundColor = RGB(242, 242, 247);
self.automaticallyAdjustsScrollViewInsets = NO;
mainScrollView = [[MyScrollview alloc] initWithFrame:CGRectMake(0, 44 + 10, kScreenWidth, kScreenHeight - 44 - 10)];
mainScrollView.bounces = NO;
mainScrollView.delegate = self;
[mainScrollView setDelaysContentTouches:NO];
[mainScrollView setCanCancelContentTouches:NO];
[self.view addSubview:mainScrollView];
sideslipTableView = [[UITableView alloc] initWithFrame:CGRectMake(0, 60, 440, kScreenHeight - 60) style:UITableViewStylePlain];
sideslipTableView.backgroundColor = [UIColor clearColor];
sideslipTableView.delegate = self;
sideslipTableView.dataSource = self;
sideslipTableView.separatorStyle = UITableViewCellSeparatorStyleNone;
[mainScrollView addSubview:sideslipTableView];
mainScrollView.contentSize = CGSizeMake(440, 0);
}
#pragma mark - 行
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section{
return dataArray.count;
}
#pragma mark - 行高
- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath{
return 46;
}
#pragma mark - cell内容
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{
static NSString *indefier = @"cell";
sideslipTableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:indefier];
if (!cell) {
cell = [[sideslipTableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:indefier];
}
cell.selectionStyle = UITableViewCellSelectionStyleNone;
cell.lable.text = dataArray[indexPath.row];
return cell;
}
//先要设Cell可编辑
- (BOOL)tableView:(UITableView *)tableView canEditRowAtIndexPath:(NSIndexPath *)indexPath
{
return YES;
}
//定义编辑样式
- (UITableViewCellEditingStyle)tableView:(UITableView *)tableView editingStyleForRowAtIndexPath:(NSIndexPath *)indexPath
{
return UITableViewCellEditingStyleDelete;
}
//进入编辑模式,按下出现的编辑按钮后,进行删除操作
- (void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath
{
if (editingStyle == UITableViewCellEditingStyleDelete) {
[dataArray removeObjectAtIndex:indexPath.row];
// Delete the row from the data source.
[sideslipTableView deleteRowsAtIndexPaths:[NSArray arrayWithObject:indexPath] withRowAnimation:UITableViewRowAnimationFade];
}
}
//修改编辑按钮文字
- (NSString *)tableView:(UITableView *)tableView titleForDeleteConfirmationButtonForRowAtIndexPath:(NSIndexPath *)indexPath
{
return @"删除";
}
- (void)didReceiveMemoryWarning {
[super didReceiveMemoryWarning];
// Dispose of any resources that can be recreated.
}
@end
这里实现的是左滑删除的功能,如果你需要实现左滑出现多个按钮,如:删除和关闭,将上面的方法- (NSString *)tableView:(UITableView *)tableView titleForDeleteConfirmationButtonForRowAtIndexPath:(NSIndexPath *)indexPath 注释掉,然后实现下面的方法:
- (NSArray *)tableView:(UITableView *)tableView editActionsForRowAtIndexPath:(NSIndexPath *)indexPath {
UITableViewRowAction *deleteRoWAction = [UITableViewRowAction rowActionWithStyle:UITableViewRowActionStyleDestructive title:@"删除" handler:^(UITableViewRowAction *action, NSIndexPath *indexPath) {//title可自已定义
NSLog(@"点击删除");
}];
deleteRoWAction.backgroundColor = RGB(210, 207, 209);
//此处是iOS8.0以后苹果最新推出的api,UITableViewRowAction,Style是划出的标签颜色等状态的定义,这里也可自行定义
UITableViewRowAction *editRowAction = [UITableViewRowAction rowActionWithStyle:UITableViewRowActionStyleNormal title:@"关闭" handler:^(UITableViewRowAction *action, NSIndexPath *indexPath) {
NSLog(@"点击关闭");
}];
editRowAction.backgroundColor = [UIColor redColor];//可以定义RowAction的颜色
return @[editRowAction,deleteRoWAction];//最后返回这俩个RowAction 的数组
}
注意:下面这两个属性必须加上:
[mainScrollView setDelaysContentTouches:NO];
[mainScrollView setCanCancelContentTouches:NO];
// 当前屏幕宽度
#define kScreenWidth [UIScreen mainScreen].bounds.size.width
// 当前屏幕高度
#define kScreenHeight [UIScreen mainScreen].bounds.size.height
相关文章
- 逆水寒手游流派首席竞选怎么玩 11-07
- 宝可梦大集结新手宝可梦怎么选 11-07
- 光遇11.7每日任务怎么做 11-07
- 英雄联盟双城之战2主题曲怎么样 11-07
- 《怪物猎人荒野》锁头机制介绍 11-07
- 逆水寒手游流派首席竞选怎么玩 逆水寒手游流派首席竞选玩法介绍 11-07