19

我有一个自定义按钮,按下时图像会发生变化。此按钮位于 UITableView 内的 UITableViewCell 的 contentView 中。

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

如何消除这种延迟?

值得指出的是,我已经尝试在 UITableView 上设置delaysContentTouches,但我可以看到它没有任何区别。

这是一些证明该问题的测试代码。创建新项目并将 UITableView 添加到情节提要。

#import "JWViewController.h"

@implementation JWViewController

- (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 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"] forState:UIControlStateNormal];
    [button setImage:[UIImage imageNamed:@"apple_selected"] forState:UIControlStateHighlighted];
    button.frame = CGRectMake(0, 0, 65, 65);
    [cell.contentView addSubview:button];
    return cell;
}

@end

我已经搜索过,似乎还有许多与此相关的其他 帖子,但没有一个有工作答案。

在这种简单的情况下,这篇博文似乎也不起作用。

4

4 回答 4

1

终于解决了你的问题。

试试这个,它会正常工作的。在现有代码中添加步骤:- 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;
            }
        }
    }
于 2014-07-23T15:03:59.823 回答
0

我能够使用此解决方案进行修复:https ://stackoverflow.com/a/29259705/1728552

似乎表格视图里面有另一个滚动视图。

于 2015-03-25T15:24:36.903 回答
-1

子类 UITableView,并且只实现这个方法:

- (BOOL)touchesShouldCancelInContentView:(UIView *)view
{
    return YES;
}

然后设置tableView.delaysContentTouches = NO;

于 2014-02-28T18:56:51.517 回答
-2

您需要将触摸事件直接传递给按钮。

 [yourTableViewObject setDelaysContentTouches:NO];

当按钮被触摸时,这将禁用表格视图的滚动。您可以通过使用手势识别器或子类化 tableview 来实现

- (BOOL)touchesShouldCancelInContentView:(UIView *)view {
return YES;
}
于 2014-02-28T15:20:38.347 回答