2014-01-08 31 views
0

我有一個應用程序,當用戶點擊該單元格中的按鈕時,可以更改表格視圖單元格的內容。如果單元格在屏幕底部部分可見,則我有一個動畫將表格視圖向上移動以顯示整個單元格(然後在完成時將其移回)。在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

我想通了這個問題:

通過動畫轉移的觀點一樣,不透露任何更多的數據。剪切可見數據的行與單元格相同,單元格與視圖位於相同的位置。在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]; 
    }