Navigation Controllerに埋め込まれたView Controllerを取得しました。大きいタイトルオプションをtrueに設定しています。 View Controller内にはスクロールビューがあります。
スクロールするときにナビゲーションバーを縮小します。
これをアーカイブするにはどうすればよいですか?
XCode 9、Swift 4、iOS 11
このようなことを試しましたか?コンテンツが上にスクロールされると、大きなタイトル表示モードを変換します。
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-View ControllerシーンでTableViewをリストの一番上(安全な領域の下)に移動します。 2- FirstViewの作成とFirstViewContollerによるロード。
私は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)
})
}
}
}
私は同様の問題を抱えていました。これは、View Controller内の多くのUIScrollView
ベースのビューが原因であり、階層の最初ではなくスクロールしていました。一度だけになると、コード行なしでUIScrollView
、WKWebView
、またはUITextView
で正常に動作します。
UICollectionViewでのビューに対する Kamil Szostakowski の答えに似たものを使用しました。
func scrollViewWillEndDragging(_ scrollView: UIScrollView, withVelocity velocity: CGPoint, targetContentOffset: UnsafeMutablePointer<CGPoint>) {
UIView.animate(withDuration: 0.5, animations: {
self.navigationController?.navigationBar.prefersLargeTitles = (velocity.y < 0)
})
}
それはそれほどスムーズではないかもしれませんが、私はまだより良いオプションを見つけていません。
ストーリーボードアプローチでテストしましたが、動作しています。 scrollViewとそのサブビューConstraintsを必ず設定してください。
ここに、参照用のテストサンプルXCodeプロジェクトを示します。 https://github.com/DazChong/LargeTitleShrinkOnScrollView
表示されているVCのscrollViewからルートナビゲーションバーを折りたたむ問題がある場合は、これを試すことができます:UIScrollViewをRootVCに追加します。重要-UIScrollViewはルートビュー(インデックス0)である必要があります。 presentVCでは、scrollViewDidScrollを使用して、ルートUIScrollViewにオフセットを設定できます。 here gifおよびコードRootVCビュー階層を使用してください: screenshot (リンクが申し訳ありませんが、評判が不十分です)
presentVCでこれを試してください
func scrollViewDidScroll(_ scrollView: UIScrollView) {
if #available(iOS 11.0, *) {
let offset = scrollView.contentOffset
rootVC.scrollView.contentOffset = offset
}
}
次のようなものを試してください:
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)
])