我有一个应用程序,当用户点击该单元格中的按钮时,该应用程序会更改表格视图单元格的内容。如果单元格在屏幕底部部分可见,我有一个动画移动表格视图以显示整个单元格(然后在完成时将其移回)。在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];
}
答案 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];
}