2012-12-09 142 views
2

我在UITableView上使用setContentOffset,因爲我想最初隱藏我的tableHeaderView的搜索字段。UITableView setContentOffset但不滾動tableView?

[self.tableView setContentOffset:CGPointMake(0, 56)]; // No scroll please! 

每次我推新viewController我想隱藏與contentOffset搜索欄。但是當我彈出一個viewController偏移由於某種原因不再有效,並顯示搜索欄。爲什麼是這樣?

+1

我不明白的問題,setContentOffset的目的是設置滾動條的位置。 – combinatorial

+0

當我的意思是,每次我推一個新的'viewController'我想隱藏搜索欄與contentOffset。但是當我彈出一個'viewController'時,由於某種原因偏移量不再有效。爲什麼是這樣? –

+0

我會認爲@nizx的答案會起作用。每次顯示視圖時重置contentOffset。 – combinatorial

回答

0

你可以嘗試並實施以下

- (void)viewWillAppear:(BOOL)animated { 
    [self.tableView setContentOffset:CGPointMake(0, 56)]; 
} 

,將放在桌子在正確的位置顯示在屏幕上之前,我假設你的意思是沒有動畫而設置的位置。

+0

對不起,更新的問題。 –

+0

這會起作用,但是,在VC1中它們會滾動到底部,然後通過觸摸單元來推動新的VC。然後當它們彈出時,如果我調用'setContentOffset',它將把tableView滾動到頂部,即使它真的應該保持滾動到用戶所在的位置。 –

0

我猜你想停止用戶能夠滾動到屏幕的最頂部。如果這樣你就可以實現以下的UITableView委託(在iOS5中及以上):

scrollViewWillEndDragging:withVelocity:targetContentOffset:

它允許你修改的最終目標在contentOffset的變化。在實現你做:

- (void)scrollViewWillEndDragging:(UIScrollView *)theScrollView withVelocity:(CGPoint)velocity targetContentOffset:(inout CGPoint *)targetContentOffset 
{ 
    if(targetContentOffset->y < 56) { 
     targetContentOffset->y=56; 
    } 
} 
0

如果你想在失去它的操作過程中保留的東西的價值,自然的解決方案是守住它自己(「保持/恢復」):

  1. 「保留」:將內容偏移量獲取到字段或局部變量。 Apple doc
  2. ..做你想做的。
  3. 「還原」:將內容偏移量設置爲您上面得到的值。

(對不起,我不寫Objective C的代碼,因此無法提供確切的代碼。一個編輯添加的代碼,將受到歡迎。)


在不同的情況下,以持有你在該行可能需要,然後回滾動到該行:
(摘自:https://stackoverflow.com/a/34270078/199364

(SWIFT)
1.保持當前行。

let holdIndexPath = tableView.indexPathForSelectedRow() 
  • ..做任何(可能以 「reloadData」 結尾)。

  • 恢復舉行行:

  • // The next line is to make sure the row object exists. 
    tableView.reloadRowsAtIndexPaths([holdIndexPath], withRowAnimation: .None) 
    tableView.scrollToRowAtIndexPath(holdIndexPath, atScrollPosition: atScrollPosition, animated: true)