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

时间:2017-10-12 07:08:42

标签: ios swift xcode ios11 xcode9

我在导航控制器中嵌入了一个View Controller,希望将大标题选项设置为true;在视图控制器内部有一个滚动视图。

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

我如何存档?

XCode 9,Swift 4,iOS 11

12 个答案:

答案 0 :(得分:42)

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

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

enter image description here

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

答案 1 :(得分: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
        }
    }
}

答案 2 :(得分:4)

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

IB Property Inspector

而是设置在像

这样的代码中
    self.navigationController?.navigationBar.prefersLargeTitles = true

答案 3 :(得分:3)

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

The screenshot of the solution

答案 4 :(得分:1)

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

答案 5 :(得分:1)

如果有人需要在顶部有一些视图,例如菜单,然后是UITableView / UICollectionView,并且滚动时不会隐藏大标题,例如我制作的这张“超赞”图片:

您将需要为UIView和UITableView / UICollectionView设置所有必需的约束,但是最重要的部分是:

make sure your UITableView/UICollectionView is the first subview, and then the UIView or any other views are behind.

这是一个例子:

答案 6 :(得分: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)
    })
}

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

答案 7 :(得分: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)
        })
    }
}

}

答案 8 :(得分: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)
        ])

答案 9 :(得分:0)

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

在presentVC中

试试这个

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

答案 10 :(得分:-1)

我测试了故事板方法,它正在运行。 确保设置scrollView&amp;它是子视图约束

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

答案 11 :(得分:-1)

您需要:

  1. 将顶视图固定到超级视图顶部

  2. 添加

override func viewDidLoad() {
    super.viewDidLoad()

    scrollView?.alwaysBounceVertical = true
  }