我有一个UITableViewController
,当我从其中一个单元格上的推动动作segue返回时,我想让它不闪现垂直滚动条(弹出视图控制器并返回到UITableViewController
)。
看起来,如果桌子有很多行(我的桌子有20个左右,每个都有60个点,比屏幕还大),当我回去时,它总是闪烁一次垂直滚动条以显示它在哪里桌子。但是,我不希望这种情况发生,但我确实希望保持滚动条,以便在用户滚动时显示。因此,完全禁用它不是一种选择。
这是默认行为吗?我可以暂时禁用它吗?
答案 0 :(得分:11)
有一个更简单的解决方案,不需要避免使用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;
}
如果您正在使用Interface Builder,则可以为Shows Vertical Indicator
上的tableView
停用UIViewController
选项,并在代码中启用它,如上所示。
答案 1 :(得分:3)
更新:请查看下面的Cezar’s answer,这提供了一个很好的解决方法,没有我的提案的任何缺点。
根据文档,这是UITableViewController
的行为:
出现表格视图时,控制器会闪烁表格视图的滚动指示。
UITableViewController
类在超类方法viewDidAppear:
中实现了这一点。
所以我认为你有两个选择:
UITableViewController
并开始使用裸UIViewController
。从UITableViewController
重建UIViewController
的功能并不难(您可以按照此old article作为参考)。viewDidAppear:
,不要致电[super viewDidAppear:animated]
。这里的问题是你不知道调用UITableViewController
时viewDidAppear:
做了什么,所以你可能会破坏某些东西。答案 2 :(得分:1)
要使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
}
}