Ios 如何从UITableViewCell中的自定义UIButton中删除触摸延迟

Ios 如何从UITableViewCell中的自定义UIButton中删除触摸延迟,ios,objective-c,uitableview,uibutton,Ios,Objective C,Uitableview,Uibutton,我有一个自定义按钮,按下后图像会发生变化。此按钮位于UITableView中UITableView单元格的contentView中 在图像更改之前,按下按钮会有明显的延迟。将按钮从单元格中取出,进入UIView,按下按钮时图像的变化是即时的 如何消除这种延迟 值得一提的是,我曾尝试在UITableView上设置DelaysContentTouchs,但我看不出有什么不同 这里有一些测试代码可以证明这个问题。创建新项目并将UITableView添加到情节提要 #导入“JWViewControlle

我有一个自定义按钮,按下后图像会发生变化。此按钮位于UITableView中UITableView单元格的contentView中

在图像更改之前,按下按钮会有明显的延迟。将按钮从单元格中取出,进入UIView,按下按钮时图像的变化是即时的

如何消除这种延迟

值得一提的是,我曾尝试在UITableView上设置DelaysContentTouchs,但我看不出有什么不同

这里有一些测试代码可以证明这个问题。创建新项目并将UITableView添加到情节提要

#导入“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];}