3

是否有在 UITableViewCell 子视图中为帧更改设置动画的最佳实践,但不重新加载单元格(通过reloadData或通过重新加载特定单元格和部分)。

示例:我有一个简单UIView的自定义子视图UITableViewCell,其中子视图占总行宽的百分比。我想对这个宽度的变化进行动画处理UIView(而容器视图 UITableViewCell 内容视图保持不变),但不重新加载,因为重新加载动画选项不会显示子视图的框架平滑地改变大小我想要。

我最初的解决方案是遍历可见单元格,并使用UIView动画块手动更改每一帧,例如

for (CustomCell *cell in [self.tableView visibleCells]])
{
    CGRect newFrame = CGRectMake(0.0,0.0,10.0,0.0); // different frame width
    [UIView animateWithDuration:0.5 animations:^{
        cell.block.frame = updatedFrame; // where block is the custom subview
     }];
}

但是虽然这似乎在 iOS7 上有效,但在 iOS6 上导致了一些时髦且难以解决的图形扭结;遍历所有单元格似乎过大了。

任何建议最好的方法来做到这一点?

4

1 回答 1

4

您可以使用 NSNotificationCenter 发布通知以通知每个单元格更改该特定视图的宽度。

创建单元格后,您可以将其注册到特定通知:

[[NSNotificationCenter defaultCenter] addObserver:self
    selector:@selector(receiveNotification:) 
    name:@"Notification"
    object:nil];

然后您可以在每个单元格中处理通知并进行所需的更改:

- (void) receiveNotification:(NSNotification *) notification
{
    CGRect newFrame = CGRectMake(0.0,0.0,10.0,0.0); // different frame width
[UIView animateWithDuration:0.5 animations:^{
    self.block.frame = updatedFrame; // where block is the custom subview
 }];
}

当您想更改宽度时,您只需要发布事件。

[[NSNotificationCenter defaultCenter] 
        postNotificationName:@"Notification" 
        object:self];

不要忘记重用每个单元格,当单元格被释放时,请确保取消注册该事件。

[[NSNotificationCenter defaultCenter] removeObserver:self]; 
于 2013-09-25T23:23:40.700 回答