web-dev-qa-db-ja.com

スクロール時に大きなタイトルを縮小する(UITableViewControllerではない)iOS 11

Navigation Controllerに埋め込まれたView Controllerを取得しました。大きいタイトルオプションをtrueに設定しています。 View Controller内にはスクロールビューがあります。

スクロールするときにナビゲーションバーを縮小します。

これをアーカイブするにはどうすればよいですか?

XCode 9、Swift 4、iOS 11

12

UIScrollViewを使用して動作することを達成していませんが、UITableViewを最初のビューとして使用する他のViewControllersで動作することをアーカイブしました。

TableViewが最初のビューでない場合、大きなタイトルは自動的に非表示になりません。ほとんどの場合、tableViewがメインビューのsubviews配列の最初の要素であることを確認する必要があります。

enter image description here

これで問題が解決することを願っています。

46

このようなことを試しましたか?コンテンツが上にスクロールされると、大きなタイトル表示モードを変換します。

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
        }
    }
}
6

コードでprefersLargeTitlesを設定すると、スクロールしてNavBarタイトルを縮小および拡大することができました。 InterfaceBuilderを使用してプロパティを設定すると、縮小機能が機能しないことに気付きました。

IB Property Inspector

代わりに次のようなコードで設定します

    self.navigationController?.navigationBar.prefersLargeTitles = true
4
billm

この方法は私のために働いています。私は次の手順を実行しました。1-View ControllerシーンでTableViewをリストの一番上(安全な領域の下)に移動します。 2- FirstViewの作成とFirstViewContollerによるロード。

ソリューションのスクリーンショット

3
user7164304

私は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ベースのビューが原因であり、階層の最初ではなくスクロールしていました。一度だけになると、コード行なしでUIScrollViewWKWebView、またはUITextViewで正常に動作します。

1
avdyushin

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)
    })
}

それはそれほどスムーズではないかもしれませんが、私はまだより良いオプションを見つけていません。

0
dsk1306

ストーリーボードアプローチでテストしましたが、動作しています。 scrollViewとそのサブビューConstraintsを必ず設定してください。

ここに、参照用のテストサンプルXCodeプロジェクトを示します。 https://github.com/DazChong/LargeTitleShrinkOnScrollView

0
DazChong

表示されている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
        }
}
0
vanab

次のようなものを試してください:

    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)
        ])
0
Roman