iOS UITableViewCell setSelected:animated:总是动画= NO

NKo*_*kov 6 animation objective-c uitableview ios

我正在尝试制作自己的选择动画.我已经创建了UITableViewCell的子类.我在-setSelected:animated:方法中做我的选择动画.当您通过点击它们来选择或取消选择单元格时,它可以按预期工作.问题是在滚动期间也会看到动画,因为-setSelected: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];


}
Run Code Online (Sandbox Code Playgroud)

这总是没有动画.我想不出任何其他如此简单的方法来处理自定义选择.-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;      
}
Run Code Online (Sandbox Code Playgroud)

它确实有效,但我不喜欢它.TableView的代表必须知道一些关于选择的事实并且它不是全部包含在一个地方这一事实让我感到很烦恼.并-setSelected有和没有动画-录音行时被调用了两次.

Dav*_*ton 4

这就是表视图的设计原理。当您选择它时,它会立即突出显示,因此不需要动画。但是,当您弹回到表视图时,您将(无论如何您应该)看到表视图单元格取消选择并带有动画。您可以看到,通过在-viewWillAppear:override:

[self.tableView deselectRowAtIndexPath:[self.tableView indexPathForSelectedRow] animated:animated]
Run Code Online (Sandbox Code Playgroud)

如果您使用 aUITableViewController并且其clearsSelectionOnViewWillAppear属性为,那么这种情况会自动发生YES

如果您想要不同的行为,您需要自己编写代码。如果您在此处发布的代码符合您的喜好,请保留它。您还可以修改单元子类以始终YES在方法重写中传递给超类-setSelected:animated: