我有一个自定义按钮,按下时图像会发生变化。此按钮位于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
我搜索过,似乎有一些other posts与此有关但没有一个有正确的答案。
This blog post似乎在这种简单的情况下无效。
答案 0 :(得分: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;
}
}
}
答案 1 :(得分:0)
我能够使用此解决方案进行修复:https://stackoverflow.com/a/29259705/1728552
似乎表视图里面有另一个滚动视图。
答案 2 :(得分:-1)
UITableView子类,并且只实现此方法:
- (BOOL)touchesShouldCancelInContentView:(UIView *)view
{
return YES;
}
然后设置tableView.delaysContentTouches = NO;
答案 3 :(得分:-2)
您需要将触摸事件直接传递给按钮。
[yourTableViewObject setDelaysContentTouches:NO];
这会在触摸按钮时禁用滚动表格视图。你可以通过使用Gesture识别器或子类化tableview来实现
- (BOOL)touchesShouldCancelInContentView:(UIView *)view {
return YES;
}