2013-09-24 91 views
5

在iOS 6中,我在我的應用程序中使用QuickDialog創建了UITableView。它正常滾動。當我切換到iOS 7時,相同的UITableView不能正確滾動。我可以拖動到底部(滾動壓縮),但是當我釋放時,它會彈回到頂部。我一直在玩viewDidAppear來嘗試和診斷問題。請參閱下面的代碼塊。切換到iOS後UITableView不滾動7

-(void)viewDidAppear:(BOOL)animated { 
    [super viewDidAppear:animated]; 
    NSLog(@"Content height: %f",self.quickDialogTableView.contentSize.height); 
    [self.quickDialogTableView reloadData]; 
    NSLog(@"Content height: %f",self.quickDialogTableView.contentSize.height); 
    [self.quickDialogTableView layoutIfNeeded]; 
    NSLog(@"Content height: %f",self.quickDialogTableView.contentSize.height); 
} 

該塊在IOS 7的輸出是

Content height: 0.000000 
Content height: 836.000000 
Content height: 0.000000 

同時,在IOS 6(仿真器)這個塊的輸出被

Content height: 836.000000 
Content height: 836.000000 
Content height: 836.000000 

另外嘗試和診斷問題,我設置了一個觸發[self.quickDialogTableView reloadData]的按鈕。只要按下該按鈕,滾動行爲就會開始正常工作。然後,當我離開視圖並回來時,滾動再次失敗(直到按下按鈕)。爲了清楚起見,我試圖單獨將reloadData放入viewWillAppear(即刪除上面代碼塊中的最後兩行)並且它不糾正滾動。

我正在尋找線索,以瞭解我可能想要糾正的問題。預先感謝您的幫助。

回答

7

好的,所以我找不出問題的根源,但我確實找到了一種解決方法,希望能幫助別人。或者至少,也許可以幫助別人指出真正的錯誤。

我創建了一個名爲trueContentSize的屬性,我在那裏存儲了正確的大小。

-(void)viewDidAppear:(BOOL)animated { 
    [super viewDidAppear:animated]; 
    [self.quickDialogTableView reloadData]; // Calculates correct contentSize 
    self.trueContentSize = self.quickDialogTableView.contentSize; 
} 

然後,在-viewDidLayoutSubviews我糾正手動contentSize

-(void)viewDidLayoutSubviews { 
    [super viewDidLayoutSubviews]; 
    self.quickDialogTableView.contentSize = self.trueContentSize; 
} 
+0

這看起來並不像它會工作,果然,它不適合我。然而,我面臨同樣的問題,在您的解決方案中,您只需從viewDidAppear中的quickDialogTableView中獲取contentSize,然後將其重新分配給viewDidLayoutSubviews中的quickDialogTableView的contentSize ...我無法理解這將如何解決問題。 – Jamornh

+1

@Jamornh同意。這沒有任何意義。然而,如果我在'self.quickDialogTableView.contentSize = self.trueContentSize'之前將'self.quickDialogTableView.contentSize'記錄在'-viewDidLayoutSubviews'中,結果爲零。因此,在'-viewDidAppear'和'viewDidLayoutSubviews'之間發生了什麼,它將'contentSize'設置爲零。我不知道是什麼。 對不起聽說我的黑客沒有爲你工作。您是否在使用它之前檢查確定您的自定義'self.trueContentSize'屬性是否返回了您的預期大小? –

+0

我設法通過手動重置tableView的superview的框架和邊界,然後重新設置tableView的框架來適應它,使tableView的contentSize大於框架。顯然,滾動不起作用,因爲tableView的框架由於某種原因比contentSize大。感謝您的答覆! – Jamornh

0

面對同樣的問題,找到的唯一解決方案是重新加載表中的數據。希望有所幫助。

1

這是我目前的臨時修復。任何人都找出真正的修復?

@interface UITableView (Extension) 
@end 

@implementation UITableView (Extension) 

- (void)setContentSize:(CGSize)contentSize { 
    if (contentSize.height != 0) { 
    [super setContentSize:contentSize]; 
    NSLog(@"set content height %f", contentSize.height); 
    } else { 
    NSLog(@"set content size zero"); 
    } 
} 

@end 
3

只是想我會在我這裏的兩分錢扔..

同樣的問題發生在我身上。表首先加載好,但導航到不同的屏幕,回來,表視圖的contentSize0,0和不可滾動。福斯托的解決方法也不可靠。

結果是我的情況只是在-viewWillLayoutSubviews中引用topLayoutGuide的行爲。這樣做會導致所有上述症狀。在一個新項目中試用:

  1. 在選項卡控制器中設置表格視圖控制器。
  2. 給它30行只有靜態內容。
  3. 運行,你可以滾動。切換標籤,然後返回,您可以滾動。
  4. 添加NSLog(@"%@", self.topLayoutGuide);-viewWillLayoutSubviews
  5. 再次運行,您可以滾動,但切換選項卡,不再滾動。

奇怪。聽起來像一個iOS錯誤,或者你不應該在該方法中引用topLayoutGuide。刪除對該屬性的任何引用將解決該問題。

編輯:截至今年早些時候,蘋果公司通過雷達報告證實,我發現這是一個iOS錯誤。在解決問題之前不要參考topLayoutGuide(無論何時何地,嘿)。 :)

+0

同樣的問題!只是註釋掉topLayoutGuide調用使得表格滾動工作正常... – Cemen

+0

找到了解決方法:用普通的自定義'UIViewController'替換'UITableViewController'。這裏: http://stackoverflow.com/questions/19595479/calling-toplayoutguide-breaks-scrolling-altogether – Cemen

0

我有一個類似的問題。我的問題是,我爲故事板中的表格視圖設置了明確的高度。更新我的表格視圖以通過設置上方/下方視圖的距離來使用自動佈局使其適用於我。