使用 LargeTitle 和带有表视图的分段控件时遇到问题

Sam*_*ley 4 ios nslayoutconstraint swift ios11

示例项目可以在https://github.com/SRowley90/LargeTitleIssueTestiOS找到

我正在尝试将分段控件放置在 iOS 应用程序中的大标题下方。我有一个 UIToolbar,其中包含分段控件。

向上滚动时title和 的toolbar行为符合预期。

向下滚动时,导航栏是正确的,但它不会向下推动 UITabBar 或 UITableView,这意味着标题位于分段控件上方,如下图所示。

我很确定这与我设置的限制有关,但我不知道是什么。

  • TabBar固定在顶部、左侧和右侧。
  • TableView固定在底部、左侧和右侧。
  • tableView 垂直固定在 TabBar 上

我设置了位置 UITabBarDelegate 方法:

func position(for bar: UIBarPositioning) -> UIBarPosition {
    return .topAttached
}
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

在此输入图像描述

在此输入图像描述

Moj*_*ini 5

采取某处的代表团tableViewtableView.delegate = self

覆盖scrollViewDidScroll并更新toolbar位置外观(因为真实位置不应该根据良好的反弹效果而改变。


extension ViewController: UIScrollViewDelegate {
    override func scrollViewDidScroll(_ scrollView: UIScrollView) {
        var verticalOffset = scrollView.contentOffset.y + defaultNavigationBarHeight

        if scrollView.refreshControl?.isRefreshing ?? false {
            verticalOffset += 60 // After is refreshing changes its value the toolbar goes 60 points down
            print(toolbar.frame.origin.y)
        }

        if verticalOffset >= 0 {
            toolbar.transform = .identity
        } else {
            toolbar.transform = CGAffineTransform(translationX: 0, y: -verticalOffset)
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

您可以在应用转换之前使用以下检查,使其更可靠、更自然地适应默认的 iOS 样式:

if #available(iOS 11.0, *) {
    guard let navigationController = navigationController else { return }
    guard navigationController.navigationBar.prefersLargeTitles else { return }
    guard navigationController.navigationItem.largeTitleDisplayMode != .never else { return }
}
Run Code Online (Sandbox Code Playgroud)