wake-up-neo.com

Verkleinern großer Titel beim Scrollen (nicht UITableViewController) iOS 11

Ich habe einen in einen Navigationscontroller eingebetteten View Controller mit der Option bevorzugt große Titel auf true gesetzt. Im View Controller befindet sich eine Bildlaufansicht.

Ich möchte, dass die Navigationsleiste beim Scrollen kleiner wird. 

Wie könnte ich das archivieren?

XCode 9, Swift 4, iOS 11

8

Ich habe nicht erreicht, dass es mit einem UIScrollView funktioniert, aber ich habe archiviert, dass es mit anderen ViewControllern funktioniert, wobei ein UITableView als erste Ansicht verwendet wird.

Wenn die tableView nicht die erste Ansicht ist, wird der große Titel nicht automatisch ausgeblendet. Sie müssen höchstwahrscheinlich sicherstellen, dass Ihre tableView das erste Element im Subviews-Array der Hauptansicht ist.

 enter image description here

Ich hoffe, dass dies dein Problem löst.

38

Hast du so etwas probiert? Es konvertiert den großen Titelanzeigemodus, wenn der Inhalt nach oben gerollt wird.

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

Durch das Festlegen von prefersLargeTitles im Code hat sich der NavBar-Titel beim Scrollen verkürzen und vergrößern lassen. Wenn Sie die Eigenschaft über InterfaceBuilder festgelegt haben, habe ich festgestellt, dass die Verkleinerungsfunktion nicht funktioniert hat.

 IB Property Inspector

Stattdessen in Code wie gesetzt

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

Dieser Weg ist für mich gearbeitet. Ich habe folgende Schritte ausgeführt: 1- Verschieben der TableView in die View-Controller-Szene (unter dem sicheren Bereich) in den oberen Bereich der Liste 2- Erstellen von FirstView und Laden durch FirstViewContoller.

Der Screenshot der Lösung

2
Rouzbeh

Ich hatte das ähnliche Problem, lag an vielen UIScrollView-basierten View-View-View-Controllern und ich scrollte nicht zuerst in der Hierarchie. Sobald es nur eine ist, funktioniert es gut mit UIScrollView, WKWebView oder UITextView ohne Codezeile.

1
avdyushin

Ich habe etwas verwendet, das der Antwort von Kamil Szostakowski mit UICollectionView ähnelt.

func scrollViewWillEndDragging(_ scrollView: UIScrollView, withVelocity velocity: CGPoint, targetContentOffset: UnsafeMutablePointer<CGPoint>) {
    UIView.animate(withDuration: 0.5, animations: {
        self.navigationController?.navigationBar.prefersLargeTitles = (velocity.y < 0)
    })
}

Es ist vielleicht nicht so glatt, aber ich habe noch keine bessere Option gefunden.

0
dsk1306

Ich habe mit Storyboard-Ansatz getestet, es funktioniert. Stellen Sie sicher, dass Sie die scrollView und ihre Unteransichten-Einschränkungen festlegen .

Hier mit dem Testbeispiel des XCode-Projekts als Referenz: https://github.com/DazChong/LargeTitleShrinkOnScrollView

0
DazChong

Ich habe dsk1306-Lösungen verwendet, siehe oben. In meinem Fall hatte ich jedoch einen WebView im UIViewController mit dem großen Titel.

Also musste ich den UIWebView ScrollView-Delegaten einstellen:

self.webView.scrollView.delegate = self

und

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

}

Wenn Sie Probleme haben, root navigationBar aus der dargestellten ScrollView von VC zu reduzieren, können Sie Folgendes versuchen: Fügen Sie UIScrollView zu RootVC hinzu. Wichtig - UIScrollView muss die Root-Ansicht sein (Index 0) . In PresentVC können Sie scrollViewDidScroll verwenden und den Versatz für unsere Root-UIScrollView . Festlegen. Siehe hier mit gif und Code screenshot (Entschuldigung für den Link, nicht genügend Reputation)

versuchen Sie dies in PresentVC

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

Versuchen Sie etwas so:

    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