滚动时收缩大标题(不是UITableViewController)iOS 11

我有一个嵌入在导航控制器中的视图控制器,喜欢将大标题选项设置为true; 在View Controller里面有一个Scroll View。

我想在滚动时缩小导航栏。

我该如何存档?

XCode 9,Swift 4,iOS 11

我没有实现它使用UIScrollView,但我存档它与其他ViewControllers一起使用UITableView作为第一个视图。

如果tableView不是第一个视图,则大标题无法自动隐藏。 您很可能需要确保tableView是主视图的子视图数组中的第一个元素。

在此处输入图像描述

我希望这能解决你的问题。

你尝试过这样的事吗? 当内容向上滚动时,它会转换大标题显示模式。

 class P1ViewController: UIViewController, UIScrollViewDelegate { var canTransitionToLarge = false var canTransitionToSmall = true func scrollViewDidScroll(_ scrollView: UIScrollView) { if canTransitionToLarge && scrollView.contentOffset.y <= 0 { UIView.animate(withDuration: 0.5) { self.navigationItem.largeTitleDisplayMode = .always } canTransitionToLarge = false canTransitionToSmall = true } else if canTransitionToSmall && scrollView.contentOffset.y > 0 { UIView.animate(withDuration: 0.5) { self.navigationItem.largeTitleDisplayMode = .never } canTransitionToLarge = true canTransitionToSmall = false } } } 

在代码中设置prefersLargeTitles确实对我有效,使NavBar标题缩小并在滚动时增长。 我注意到如果你通过InterfaceBuilder设置属性,缩小的function不起作用。

IB物业检查员

而是在代码中设置

  self.navigationController?.navigationBar.prefersLargeTitles = true 

这种方式对我有用。 我按照以下步骤操作:1-将TableView移动到视图控制器场景中的列表顶部(在安全区域下)。 2-通过FirstViewContoller进行FirstView和加载。

解决方案的屏幕截图

我有类似的问题,是因为在视图控制器内部有许多基于UIScrollView的视图,而我在层次结构中不是第一次滚动。 一旦它只有一个它可以使用UIScrollViewWKWebViewUITextView没有任何代码行。

我使用了类似于Kamil Szostakowski的回答来查看UICollectionView的内容。

 func scrollViewWillEndDragging(_ scrollView: UIScrollView, withVelocity velocity: CGPoint, targetContentOffset: UnsafeMutablePointer) { UIView.animate(withDuration: 0.5, animations: { self.navigationController?.navigationBar.prefersLargeTitles = (velocity.y < 0) }) } 

它可能不是那么顺利,但我还没有找到更好的选择。

我使用了dsk1306解决方案,见上文。 但在我的情况下,我在UIViewController中有一个带有大标题的WebView。

所以我不得不设置UIWebView ScrollView委托:

 self.webView.scrollView.delegate = self 

 extension MyViewController: UIScrollViewDelegate { func scrollViewWillEndDragging(_ scrollView: UIScrollView, withVelocity velocity: CGPoint, targetContentOffset: UnsafeMutablePointer) { if #available(iOS 11.0, *) { UIView.animate(withDuration: 0.5, animations: { self.navigationController?.navigationBar.prefersLargeTitles = (velocity.y < 0) }) } } } 

尝试这样的事情:

  extendedLayoutIncludesOpaqueBars = true scrollView.translatesAutoresizingMaskIntoConstraints = false view.addSubview(scrollView) NSLayoutConstraint.activate([ scrollView.topAnchor.constraint(equalTo: view.topAnchor), scrollView.leftAnchor.constraint(equalTo: view.leftAnchor), scrollView.bottomAnchor.constraint(equalTo: view.bottomAnchor), scrollView.rightAnchor.constraint(equalTo: view.rightAnchor) ]) 

如果你有问题从提交的VC的scrollView崩溃root navigationBar,可以试试这个:将UIScrollView添加到RootVC。 重要 – UIScrollView必须是根视图(在索引0处)。 在presentVC中,我们可以使用scrollViewDidScroll并在我们的根UIScrollView上设置offset。 看到这里用gif和代码RootVC视图层次结构: 截图 (对不起链接,信誉不足)

在presentVC试试这个

 func scrollViewDidScroll(_ scrollView: UIScrollView) { if #available(iOS 11.0, *) { let offset = scrollView.contentOffset rootVC.scrollView.contentOffset = offset } } 

我用故事板方法测试,它正在工作。 确保设置scrollView及其子视图Constraints

这里有测试样本XCode项目供参考: https : //github.com/DazChong/LargeTitleShrinkOnScrollView