2013-07-12 62 views
2

我有一個UITableViewController,我希望當它從其中一個單元格上的推動動作繼續返回時(不再閃爍垂直滾動條)(彈出視圖控制器並返回到UITableViewController)。禁用UITableViewController的閃動滾動條?

看起來,如果表格有許多行(我的大約20個,每個高度爲60點,比屏幕大),當我回去時,它總是閃爍一次垂直滾動條以顯示它的位置在桌子裏。但是,我不希望發生這種情況,但我確實希望保持滾動條的位置,以便在用戶滾動時顯示。因此,完全禁用它不是一種選擇。

這是默認行爲,我可以暫時禁用它嗎?

+1

你爲什麼不想要閃爍的?這是用戶期望看到的標準行爲。 – rmaddy

回答

3

更新:請看下面的Cezar’s answer,這給出了一個很好的解決方法,沒有任何我的提議的缺點。


根據文檔它是UITableViewController行爲:

當表視圖已經出現,控制器閃爍表視圖的滾動指標。 UITableViewController類在超類方法viewDidAppear:中執行此操作。

所以我認爲你有兩個選擇:

  1. 你能避免使用UITableViewController,並開始使用裸UIViewController。從UIViewController重建UITableViewController的功能並不難(您可以按照此old article作爲參考)。
  2. 覆蓋viewDidAppear:並且不要呼叫[super viewDidAppear:animated]。這裏的問題是你不知道UITableViewController在調用viewDidAppear:時會做什麼,所以你可能會破壞一些東西。
+0

執行#1的簡單方法是創建所述視圖控制器,添加表視圖,然後在創建自定義類文件時選擇UITableViewController,然後在.h文件的界面行上將UITableViewController修改爲UIViewController。 。然後你將有你的委託協議和你的骨架委託方法。只要不要忘記在Interface Builder中將委託屬性設置爲UITableView的文件所有者就可以了。 –

10

有一個更簡單的解決方案,不需要避免使用UITableViewController子類。

如http://stackoverflow.com/users/2445863/yonosoytu所述,您可以覆蓋viewDidAppear:,但不需要不要致電[super viewDidAppear:animated]。在此之前,只需禁用垂直滾動指示器,然後再啓用它。

- (void)viewDidAppear:(BOOL)animated { 
    self.tableView.showsVerticalScrollIndicator = NO; 
    [super viewDidAppear:animated]; 
    self.tableView.showsVerticalScrollIndicator = YES; 
} 

如果您使用界面生成器,你可以禁用的tableViewShows Vertical Indicator選項爲您UIViewController,並使其能夠在代碼如上圖所示。

+2

巧妙..... – Terminus

+1

應該是公認的答案 – galambalazs

+0

這適用於iOS 9,但不阻止在iOS 10上閃爍。 –

0

爲了讓Cezar's answer適用於iOS10,我必須在重新啓用滾動指示器之前包含一個(相當大的)延遲。如果有人在第二秒鐘之前嘗試滾動,這看起來有點奇怪,所以只要有人滾動,就可以重新啓用滾動指示器。

override func viewDidAppear(_ animated: Bool) { 
    tableView.showsVerticalScrollIndicator = false 
    super.viewDidAppear(animated) 
    DispatchQueue.main.asyncAfter(deadline: .now() + 1) { 
     self.tableView.showsVerticalScrollIndicator = true 
    } 
} 

override func scrollViewDidScroll(_ scrollView: UIScrollView) { 
    if !tableView.showsVerticalScrollIndicator { 
     tableView.showsVerticalScrollIndicator = true 
    } 
} 

事實上,在考慮這件事,你甚至不需要延遲,只是這樣做:

override func viewDidAppear(_ animated: Bool) { 
    tableView.showsVerticalScrollIndicator = false 
    super.viewDidAppear(animated) 
} 

override func scrollViewDidScroll(_ scrollView: UIScrollView) { 
    if !tableView.showsVerticalScrollIndicator { 
     tableView.showsVerticalScrollIndicator = true 
    } 
}