2017-10-12 103 views
4

我在导航控制器中嵌入了一个View Controller,并且偏好大标题选项设置为true;在视图控制器里面有一个滚动视图。滚动时缩小标题(不是UITableViewController)iOS 11

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

我该如何归档?

的XCode 9,斯威夫特4,iOS的11

+0

你的意思是隐藏或正常大小? – user3589771

+0

@ user3589771我的意思是正常大小 –

+0

我不知道。但[请检查此之前](https://medium.com/@PavelGnatyuk/large-title-and-search-in-ios-11-514d5e020cee)尝试使用'UIView'动画和撤消更大的标题? – user3589771

回答

3

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

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

这可以工作,但不是那么顺利,不像使用tableviewcontrollers那样原生 –

2

在代码中设置prefersLargeTitles对我来说很有用,可以使NavBar标题在您滚动时缩小和增大。我注意到如果通过InterfaceBuilder设置属性,缩小的功能不起作用。

IB Property Inspector

的代码,而不是像设置

self.navigationController?.navigationBar.prefersLargeTitles = true 
+0

您能展示故事板元素层次结构的方式吗? –

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的滚动型代表:

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

我还没有达到它的工作原理使用UIScrollView,但我存档,它与其他ViewControllers使用UITableView作为第一视图。

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

enter image description here

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

+1

omg ...有史以来最愚蠢的逻辑..非常感谢你解释得非常好。 –

-1

我用故事板方法测试,它工作。 确保设置scrollView &它的子视图约束条件

这里与参考测试样品XCode项目:https://github.com/DazChong/LargeTitleShrinkOnScrollView

+0

您的示例项目根本不起作用 –

+0

https://www.dropbox.com/s/ylsz4uiyvkf8knr/Untitled.mov?dl=0 –

+0

@HabibAli,在您downvote之前,您是否使用过最新的iOS 11.2进行过测试?我在各种设备上进行了测试,确实可以使用新的git clone。 – DazChong

0

这种方式为我工作。 我遵循这些步骤: 1-将TableView移动到视图控制器场景中的列表顶部(在安全区域下)。 2 - 由FirstViewContoller制作FirstView并加载。

The screenshot of the solution

0

我有类似的问题,则是因为视图控制器内许多UIScrollView为基础的观点,我是在第一层次不滚动。一旦它只有一个,它可以与UIScrollViewWKWebViewUITextView无任何代码行一起正常工作。

0

如果你有问题崩溃根目录导航条从提出的VC的scrollView,可以试试这个: 添加UIScrollView到RootVC。重要 - UIScrollView必须是根视图(在索引0处)。 在呈现的VC中,我们可以使用scrollViewDidScroll并在我们的根UIScrollView上设置偏移量。 看到here与GIF和代码 RootVC视图层次: screenshot(对不起,链接,没有足够的声誉)

在presentedVC试试这个

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