我在导航控制器中嵌入了一个View Controller,希望将大标题选项设置为true;在视图控制器内部有一个滚动视图。
我想在滚动时缩小导航栏。
我如何存档?
XCode 9,Swift 4,iOS 11
答案 0 :(得分:42)
我还没有实现它使用UIScrollView,但我存档它可以使用UITableView作为第一个视图与其他ViewControllers一起使用。
如果tableView不是第一个视图,则大标题无法自动隐藏。您很可能需要确保tableView是主视图的子视图数组中的第一个元素。
我希望这能解决你的问题。
答案 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设置了属性,缩小的功能并没有起作用。
而是设置在像
这样的代码中 self.navigationController?.navigationBar.prefersLargeTitles = true
答案 3 :(得分:3)
这种方式对我有用。 我按照这些步骤: 1-将TableView移动到视图控制器场景中的列表顶部(在安全区域下)。 2-通过FirstViewContoller进行FirstView和加载。
答案 4 :(得分:1)
我有类似的问题,是因为在视图控制器内有很多基于UIScrollView
的视图,而我在层次结构中不是第一次滚动。一旦它只有一个,它可以与UIScrollView
,WKWebView
或UITextView
一起使用,而不需要任何代码。
答案 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)
您需要:
将顶视图固定到超级视图顶部
添加
override func viewDidLoad() {
super.viewDidLoad()
scrollView?.alwaysBounceVertical = true
}