iOS UITableViewCell setSelected :animated: always has animated = NO

标签 ios objective-c uitableview animation

我正在尝试制作自己的选择动画。我已经创建了 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/

相关文章:

ios - Twitter iOS 配置文件页面配置

ios - 删除核心数据中的记录后无法删除索引处的表行

Swift: fatal error :从 TableView 中删除项目时数组索引超出范围

iphone - 即使将 NSZombiesEnabled 设置为 YES,EXEC BAD ACCESS 也不会显示跟踪/日志

ios - 应用内购买不适用于所有模拟器

objective-c - 尝试使用 NSMutableString 访问可变数组时出现错误访问

iphone - 突破多个循环

ios - 为什么我们需要将 Swift 类标记为 `public` 或 `open` 以使其在 Objective-C 框架项目中可访问?

ios - 如何解析 IOS 中的小块 JSON 数据?

ios - 核心数据将相同的对象添加到对多关系