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

问题描述 投票:11回答:11

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

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

我怎么能存档这个?

XCode 9,Swift 4,iOS 11

ios swift xcode ios11 xcode9
11个回答
43
投票

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

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

enter image description here

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


0
投票

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

在presentVC试试这个

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

-1
投票

你需要:

  1. 将滚动顶视图固定到超级视图顶部
override func viewDidLoad() {
    super.viewDidLoad()

    scrollView?.alwaysBounceVertical = true
  }

6
投票

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

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

4
投票

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

IB Property Inspector

而是在代码中设置

    self.navigationController?.navigationBar.prefersLargeTitles = true

3
投票

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

The screenshot of the solution


1
投票

我有类似的问题,是因为在视图控制器内部有许多基于UIScrollView的视图,而我在层次结构中不首先滚动。一旦它只有一个它与UIScrollViewWKWebViewUITextView没有任何代码行正常工作。


0
投票

我使用的东西类似于Kamil Szostakowski的答案,用UICollectionView查看。

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

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


0
投票

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

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

self.webView.scrollView.delegate = self

extension MyViewController: UIScrollViewDelegate {

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

}

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)
        ])

0
投票

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

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

© www.soinside.com 2019 - 2024. All rights reserved.