禁用UITableViewController的闪烁滚动条?

时间:2013-07-12 16:08:07

标签: ios objective-c scroll uitableview

我有一个UITableViewController,当我从其中一个单元格上的推动动作segue返回时,我想让它不闪现垂直滚动条(弹出视图控制器并返回到UITableViewController)。

看起来,如果桌子有很多行(我的桌子有20个左右,每个都有60个点,比屏幕还大),当我回去时,它总是闪烁一次垂直滚动条以显示它在哪里桌子。但是,我不希望这种情况发生,但我确实希望保持滚动条,以便在用户滚动时显示。因此,完全禁用它不是一种选择。

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

3 个答案:

答案 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:中实现了这一点。

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

  1. 您可以避免使用UITableViewController并开始使用裸UIViewController。从UITableViewController重建UIViewController的功能并不难(您可以按照此old article作为参考)。
  2. 覆盖viewDidAppear:,不要致电[super viewDidAppear:animated]。这里的问题是你不知道调用UITableViewControllerviewDidAppear:做了什么,所以你可能会破坏某些东西。

答案 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
    }
}