UIRefreshControl 在带有大标题的 UINavigation 后面呈现

UIRefreshControl renders behind UINavigation w/ Large Titles

我正在尝试创建一个 UITableViewControllerUINavigationBar 使用大标题。

我遇到的问题是,在空 table 视图上使用拉动刷新时,加载指示器位于大标题文本的后面。

如果我第二次拉动刷新就没有这个问题。

我附上了一张显示该行为的 gif。

此时我的视图控制器非常简单

final class FeedSceneViewController: UITableViewController {

  private var loader: FeedLoader?

  convenience init(loader: FeedLoader) {
    self.init()
    self.loader = loader
  }

  override func viewDidLoad() {
    super.viewDidLoad()

    tableView.refreshControl = .init()
    load()

    configureTableView()
    configureUI()
  }

  func load() {
    tableView.refreshControl?.set(isRefreshing: true)
    loader?.load(then: { [weak self] _ in self?.refreshControl?.set(isRefreshing: false) })
  }

}

private extension FeedSceneViewController {

  func configureTableView() {
    tableView.backgroundColor = .usingHex("fafafa")
    tableView.tableFooterView = .init()
  }

  func configureUI() {
    navigationController?.navigationBar.prefersLargeTitles = true
    navigationItem.title = "Latest content"
  }
}

看来你是在设置大导航后设置刷新控件。

试试把顺序改成这样-

  override func viewDidLoad() {
    super.viewDidLoad()

    load()

    configureTableView()
    configureUI()
  }
.......
  func configureTableView() {
    tableView.backgroundColor = .usingHex("fafafa")
    tableView.tableFooterView = .init()
    tableView.contentInsetAdjustmentBehavior = .always
    tableView.refreshControl = .init()
  }

  func configureUI() {
    navigationController?.navigationBar.prefersLargeTitles = true
    navigationItem.title = "Latest content"
  }

也许你可以在你的 viewDidLoad() 中试试这个

self.edgesForExtendedLayout = []

它使您的 table 视图不会与您的导航栏冲突