我有一个嵌入在导航控制器中的视图控制器,希望将大标题选项设置为true;在View Controller里面有一个Scroll View。
我想在滚动时缩小导航栏。
我怎么能存档这个?
XCode 9,Swift 4,iOS 11
如果你有问题从提出的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
}
}
你需要:
override func viewDidLoad() {
super.viewDidLoad()
scrollView?.alwaysBounceVertical = true
}
你尝试过这样的事吗?当内容向上滚动时,它会转换大标题显示模式。
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
}
}
}
这种方式对我有用。我按照以下步骤操作:1-将TableView移动到视图控制器场景中的列表顶部(在安全区域下)。 2-通过FirstViewContoller进行FirstView和加载。
我有类似的问题,是因为在视图控制器内部有许多基于UIScrollView
的视图,而我在层次结构中不首先滚动。一旦它只有一个它与UIScrollView
,WKWebView
或UITextView
没有任何代码行正常工作。
我使用的东西类似于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)
})
}
它可能不是那么顺利,但我还没有找到更好的选择。
我使用了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)
})
}
}
}
尝试这样的事情:
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)
])
我用故事板方法测试,它正在工作。确保设置scrollView及其子视图Constraints。
这里有测试样本XCode项目供参考:https://github.com/DazChong/LargeTitleShrinkOnScrollView