Ios 如何从UITableViewCell中的自定义UIButton中删除触摸延迟
我有一个自定义按钮,按下后图像会发生变化。此按钮位于UITableView中UITableView单元格的contentView中 在图像更改之前,按下按钮会有明显的延迟。将按钮从单元格中取出,进入UIView,按下按钮时图像的变化是即时的 如何消除这种延迟 值得一提的是,我曾尝试在UITableView上设置DelaysContentTouchs,但我看不出有什么不同 这里有一些测试代码可以证明这个问题。创建新项目并将UITableView添加到情节提要Ios 如何从UITableViewCell中的自定义UIButton中删除触摸延迟,ios,objective-c,uitableview,uibutton,Ios,Objective C,Uitableview,Uibutton,我有一个自定义按钮,按下后图像会发生变化。此按钮位于UITableView中UITableView单元格的contentView中 在图像更改之前,按下按钮会有明显的延迟。将按钮从单元格中取出,进入UIView,按下按钮时图像的变化是即时的 如何消除这种延迟 值得一提的是,我曾尝试在UITableView上设置DelaysContentTouchs,但我看不出有什么不同 这里有一些测试代码可以证明这个问题。创建新项目并将UITableView添加到情节提要 #导入“JWViewControlle
#导入“JWViewController.h”
@JWViewController的实现
-(无效)viewDidLoad
{
[超级视图下载];
self.tableView.delegate=self;
self.tableView.dataSource=self;
self.tableView.delaysContentTouches=否;
}
-(NSInteger)numberOfSectionsInTableView:(UITableView*)tableView{return 1;}
-(NSInteger)tableView:(UITableView*)tableView行数section:(NSInteger)section{return 1;}
-(CGFloat)tableView:(UITableView*)tableView rowatinexpath的高度:(nsindepath*)indepath{return 65.0f;}
-(UITableViewCell*)tableView:(UITableView*)tableView cellForRowAtIndexPath:(NSIndexPath*)indexPath
{
UITableViewCell*单元格=[[UITableViewCell alloc]init];
UIButton*button=[UIButton button类型:UIButtonTypeCustom];
[按钮设置图像:[UIImage ImageName:@“apple”]用于状态:UIControlStateNormal];
[按钮设置图像:[UIImage ImageName:@“apple_selected”]用于状态:UIControlStateHighlighted];
button.frame=CGRectMake(0,0,65,65);
[cell.contentView addSubview:按钮];
返回单元;
}
@结束
我已经搜索过了,似乎有一些与此相关,但没有一个有效的答案
在这种简单的情况下似乎也不起作用。您需要将触摸事件直接传递给按钮
[yourTableViewObject setDelaysContentTouches:NO];
这将在触摸按钮时禁用表格视图的滚动。您可以通过使用手势识别器或子类化tableview来实现
- (BOOL)touchesShouldCancelInContentView:(UIView *)view {
return YES;
}
子类UITableView,并仅实现此方法:
- (BOOL)touchesShouldCancelInContentView:(UIView *)view
{
return YES;
}
然后设置
tableView.delaysContentTouches=NO代码>最终解决了您的问题
试试这个,它会很好用的。
在现有代码中添加步骤:-
1.)设置内容视图中按钮的标签。
2.)在该按钮上添加目标
- (void)viewDidLoad
{
[super viewDidLoad];
self.tableView.delegate = self;
self.tableView.dataSource = self;
self.tableView.delaysContentTouches = NO;
}
- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView { return 1; }
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section { return 1; }
-(CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath { return 65.0f; }
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
UITableViewCell *cell = [[UITableViewCell alloc] init];
UIButton *button = [UIButton buttonWithType:UIButtonTypeCustom];
[button setImage:[UIImage imageNamed:@"apple.jpg"] forState:UIControlStateNormal];
[button setImage:[UIImage imageNamed:@"apple_selected.png"] forState:UIControlStateHighlighted];
button.frame = CGRectMake(0, 0, 65, 65);
button.tag = indexPath.row;
[button addTarget:self action:@selector(buttonPressed:) forControlEvents:UIControlEventAllTouchEvents];
[cell.contentView addSubview:button];
return cell;
}
- (void)buttonPressed:(UIButton *)sender
{
UITableViewCell *cell = [self.tableView cellForRowAtIndexPath:[NSIndexPath indexPathForRow:sender.tag inSection:0]];
for (UIView *currentView in cell.subviews)
{
if ([NSStringFromClass([currentView class]) isEqualToString:@"UITableViewCellScrollView"])
{
UIScrollView *svTemp = (UIScrollView *) currentView;
[svTemp setDelaysContentTouches:NO];
break;
}
}
}
我能够使用此解决方案修复:
表视图中似乎有另一个滚动视图。它在iOS 6上工作吗?当我写这篇文章时,iOS 7并不存在o) 我来看看……我编译了6个测试应用程序,但仍然得到了延迟。您是否尝试记录了didSelectRowAtIndexPath
和touchshouldcanceincontentview
的时间?也许这会给你一个线索,告诉你事情可能在哪里被耽搁了。@JMWhittaker:我在一个类似的网站上发过帖子question@staticVoidMan谢谢,让我们来看看这段代码是多么奇怪和多余。您的按钮按下:
方法将被调用很多次,因为您正在使用UIControlEventAllTouchEvents
控制事件。最好在tableView:cellforrowatinexpath:
中遍历子视图。我可以以此为起点,将以下内容添加到我的UITableViewCell
子类(在设置方法中):if([self.superview respondsToSelector:@selector(setDelaysContentTouches:)]{UIScrollView*svTemp=(UIScrollView*)self.superview;[svTemp setDelaysContentTouches:NO];}