我正在尝试制作自己的选择动画。我已经创建了 UITableViewCell 的子类。我在 -setSelected:animated:
方法中制作我的选择动画。当您通过点击选择或取消选择单元格时,它会按预期工作。问题是在滚动期间也会看到动画,因为 -setSelected:animated:
在每个单元格出现之前被调用。这就是重用单元格机制的工作原理,我明白了。我不明白的是,它总是在点击或滚动时使用 animated = NO 调用此方法。这对我来说似乎是一个逻辑错误。我假设它应该在您点击它们时选择带有动画的单元格,而在出现重复使用的单元格时选择没有动画的单元格。除了手动调用之外,animated
参数是否曾在任何地方使用过?这是我的代码:
- (void)setSelected:(BOOL)selected animated:(BOOL)animated {
BOOL alreadySelected = (self.isSelected) && (selected);
BOOL alreadyDeselected = (!self.isSelected) && (!selected);
[super setSelected:selected animated:animated];
if ((alreadySelected) || (alreadyDeselected)) return;
NSLog(@"Animated selection: %@", animated ? @"YES" : @"NO");
NSTimeInterval duration;
if (animated) {
duration = 0.25;
} else {
duration = 0.0;
}
[CATransaction begin];
[CATransaction setAnimationDuration:duration];
if (selected) {
//layer properties are changed here...
} else {
//layer properties are changed here...
}
[CATransaction commit];
}
这总是没有动画。
我想不出任何其他处理自定义选择的简单方法。在 Controller 中实现 -didSelectRow
方法似乎更糟糕,并且在滚动期间不调用它,因此重复使用的单元格将出现在错误状态。知道如何解决这个问题吗?
更新:
我找到了一个临时解决方案:
#pragma mark - Table View Delegate
- (NSIndexPath *)tableView:(UITableView *)tableView willSelectRowAtIndexPath:(NSIndexPath *)indexPath {
UITableViewCell *cell = [tableView cellForRowAtIndexPath:indexPath];
[cell setSelected:YES animated:YES];
return indexPath;
}
- (NSIndexPath *)tableView:(UITableView *)tableView willDeselectRowAtIndexPath:(NSIndexPath *)indexPath {
UITableViewCell *cell = [tableView cellForRowAtIndexPath:indexPath];
[cell setSelected:NO animated:YES];
return indexPath;
}
它确实有效,但我不喜欢它。事实上,TableView 的委托(delegate)必须了解一些关于选择的事情,而且它并没有全部包含在一个地方,这让我很烦恼。并且 -setSelected
在点击一行时被调用两次 - 有和没有动画。
最佳答案
这就是 TableView 设计的工作方式。当您选择它时,它会立即突出显示,因此不需要动画。但是,当您返回到 TableView 时,您将(无论如何应该)看到 TableView 单元格取消选择动画。您可以通过在 -viewWillAppear:override:
[self.tableView deselectRowAtIndexPath:[self.tableView indexPathForSelectedRow] animated:animated]
如果您使用 UITableViewController
并将其 clearsSelectionOnViewWillAppear
属性设置为 YES
,这将自动发生。
如果您想要不同的行为,您需要自己编写代码。如果您在此处发布的代码符合您的喜好,请保留它。您还可以修改单元子类以始终将 YES
传递给 -setSelected:animated:
方法覆盖中的父类(super class)。
关于iOS UITableViewCell setSelected :animated: always has animated = NO,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30734838/