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
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.
Ich hoffe, dass dies dein Problem löst.
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
}
}
}
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.
Stattdessen in Code wie gesetzt
self.navigationController?.navigationBar.prefersLargeTitles = true
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.
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.
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.
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
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
}
}
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)
])