滚动时收缩大标题(不是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不起作用。
而是在代码中设置
self.navigationController?.navigationBar.prefersLargeTitles = true
这种方式对我有用。 我按照以下步骤操作:1-将TableView移动到视图控制器场景中的列表顶部(在安全区域下)。 2-通过FirstViewContoller进行FirstView和加载。
解决方案的屏幕截图
我有类似的问题,是因为在视图控制器内部有许多基于UIScrollView
的视图,而我在层次结构中不是第一次滚动。 一旦它只有一个它可以使用UIScrollView
, WKWebView
或UITextView
没有任何代码行。
我使用了类似于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