4

我有UITableViewControllerUITableViewController

似乎,如果表格有很多行(我的大约有 20 行,每行有 60 点高度,比屏幕大),当我返回时,它总是会闪烁一次垂直滚动条以显示它在表格中的位置。但是,我不希望这种情况发生,但我确实想保留滚动条,以便它在用户滚动时显示。因此,完全禁用它不是一种选择。

这是默认行为吗?我可以暂时禁用它吗?

4

3 回答 3

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并在代码中启用它,如上所示。tableViewUIViewController

于 2014-03-12T16:33:42.920 回答
3

为了让Cezar 的答案适用于 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
    }
}
于 2017-08-24T07:02:13.940 回答
2

更新:请看下面Cezar 的回答,它提供了一个很好的解决方法,没有我的建议的任何缺点。


根据文档,这是一种行为UITableViewController

当表格视图出现时,控制器会闪烁表格视图的滚动指示器。该类UITableViewController在超类方法中实现了这一点viewDidAppear:

所以我认为你有两个选择:

  1. 您可以避免使用UITableViewController并开始使用裸UIViewController. 重建UITableViewControllerfrom的功能UIViewController并不难(您可以参考这篇旧文章)。
  2. 覆盖viewDidAppear:而不调用[super viewDidAppear:animated]. 这里的问题是你不知道UITableViewControllerviewDidAppear:被调用时会做什么,所以你可能会破坏一些东西。
于 2013-07-12T16:13:10.473 回答