在UITableViewCell子视图中动画帧更改的最佳方法,无需重新加载

时间:2013-09-25 22:24:57

标签: ios objective-c animation uitableview subview

是否有在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上的图形扭结;迭代所有细胞似乎有点矫枉过正。

有关最佳方法的任何建议吗?

1 个答案:

答案 0 :(得分: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];