UITableViewCellAccessoryDetailDisclosureButton
是否可以通过触摸更改图像?
我想让我在 tableView 中的行有一个空圆圈来代替详细信息披露按钮。当我点击这个空圆圈按钮时,我想用另一个包含复选标记的图像更改空圆圈的图像。然后在大约半秒的延迟后,我想用-accessoryButtonTappedForRowWithIndexPath
.
我怎样才能做到这一点?
UITableViewCellAccessoryDetailDisclosureButton
是否可以通过触摸更改图像?
我想让我在 tableView 中的行有一个空圆圈来代替详细信息披露按钮。当我点击这个空圆圈按钮时,我想用另一个包含复选标记的图像更改空圆圈的图像。然后在大约半秒的延迟后,我想用-accessoryButtonTappedForRowWithIndexPath
.
我怎样才能做到这一点?
那么首先你必须将你的单元格的accessoriesView设置为一个自定义的UIView,可能是一个UIButton......
UIImage *uncheckedImage = [UIImage imageNamed:@"Unchecked.png"];
UIImage *checkedImage = [UIImage imageNamed:@"Checked.png"];
UIButton *button = [UIButton buttonWithType:UIButtonTypeCustom];
button.frame = CGRectMake(44.0, 44.0, image.size.width, image.size.height);
[button addTarget:self action:@selector(tapButton:) forControlEvents:UIControlEventTouchUpInside];
[button setImage:uncheckedImage forState:UIControlStateNormal];
[button setImage:checkedImage forState:UIControlStateSelected];
cell.accessoryView = button;
在您的 tapButton: 方法中,您希望对图像应用必要的更改并执行附件ButtonTappedAtIndexPath。我会避免延迟,或者您可以使用调度计时器...
- (void)tapButton:(UIButton *)button {
[button setSelected:!button.selected];
UITableViewCell *cell = [button superview];
NSIndexPath *indexPath = [tableView indexPathForCell:cell];
[self tableView:tableView accessoryButtonTappedForRowWithIndexPath:indexPath];
}
根据您的评论,您已经在创建自己的按钮并将其设置为单元格的accessoryView
.
创建按钮时,将其选定状态的图像设置为您的复选标记图像:
[button setImage:checkmarkImage forState:UIControlStateSelected];
点击按钮时,将其状态设置为选中,以便显示复选标记:
- (IBAction)buttonWasTapped:(id)sender event:(UIEvent *)event {
UIButton *button = sender;
button.selected = YES;
然后,禁用用户交互,以便用户在延迟期间不能做任何其他事情:
[[UIApplication sharedApplication] beginIgnoringInteractionEvents];
获取包含被触摸按钮的单元格的索引路径:
UITouch *touch = [[event touchesForView:button] anyObject];
NSIndexPath *indexPath = [tableView indexPathForRowAtPoint:
[touch locationInView:tableView]];
最后,安排一个块在延迟后运行。在该块中,重新启用用户交互并向自己发送一条包含索引路径的消息:
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, 0.5 * NSEC_PER_SEC),
dispatch_get_main_queue(),
^{
[[UIApplication sharedApplication] endIgnoringInteractionEvents];
[self accessoryButtonTappedForRowAtIndexPath:indexPath];
});
}