动画移动后重绘表格

时间:2014-01-08 19:58:24

标签: ios6 uitableview

我有一个应用程序,当用户点击该单元格中的按钮时,该应用程序会更改表格视图单元格的内容。如果单元格在屏幕底部部分可见,我有一个动画移动表格视图以显示整个单元格(然后在完成时将其移回)。在iOS 7上,一切都很好。但是在iOS 6上,移位的单元格仅包括移位前可见的内容;标签栏后面隐藏的任何东西都是空白的。我尝试过调用[self.view setNeedsDisplay],甚至是[self.view performSelector: @selector(setNeedsDisplay) withObject: nil afterDelay: 0.5],但它仍然无法正确重绘。

我在表视图单元类中覆盖-drawRect:,调用[super drawRect: rect]并在那里设置断点,并在动画发生之前运行。

如何在动画后进行重绘?

在自定义UITableViewController中:

- (void) shiftTable: (CGFloat) distance
{
    [UIView beginAnimations: @"TableShift" context: nil];
    [UIView setAnimationBeginsFromCurrentState: YES];
    [UIView setAnimationDuration: 0.35];
    self.view.frame = CGRectOffset(self.view.frame, 0, distance);
    [UIView commitAnimations];
}

1 个答案:

答案 0 :(得分:0)

我想出了这个问题:

通过类似动画移动视图不会再显示任何数据。剪切可见数据的行位于相对于单元格的相同位置,并且单元格相对于视图处于相同位置。在iOS 7上,它绘制了半透明标签栏后面的表格视图,数据已经存在(但是模糊不清),因此当它移动时,它会显示数据。在iOS 6中,标签栏不是半透明的,因此表格视图停留在标签栏的顶部边缘。当动画移动视图时,它会向上移动剪切的视图。

解决方案是滚动表格视图,而不是仅移动视图:

    CGRect cellRect = [self.tableView convertRect: cell.frame toView: self.tableView.superview];
    CGRect tableRect = self.tableView.frame;
    if (cellRect.origin.y < tableRect.origin.y)
    {
        [self.tableView scrollToRowAtIndexPath: cell.indexPath
                              atScrollPosition: UITableViewScrollPositionTop animated: YES];
    }
    else if (cellRect.origin.y + cellRect.size.height >
             tableRect.origin.y + tableRect.size.height)
    {
        [self.tableView scrollToRowAtIndexPath: cell.indexPath
                              atScrollPosition: UITableViewScrollPositionBottom animated: YES];
    }