2013-07-12 37 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 
    } 
}