In der neuen Facebook-App für iOS7 Facebook navigationBar
versteckt sich der Benutzer beim Scrollen nach und nach bis zu einem Punkt, an dem er vollständig verschwindet. Wenn der Benutzer dann navigationBar
nach unten scrollt, zeigt sich das allmählich.
Wie würden Sie dieses Verhalten selbst implementieren? Mir ist die folgende Lösung bekannt, aber sie verschwindet sofort und ist überhaupt nicht an die Geschwindigkeit der Bildlaufgeste des Benutzers gebunden.
[navigationController setNavigationBarHidden: YES animated:YES];
Ich hoffe, dass dies kein Duplikat ist, da ich nicht sicher bin, wie ich das Verhalten beim "Erweitern / Zusammenziehen" am besten beschreiben kann.
ios
iphone
objective-c
ios7
uinavigationbar
El Mocoso
quelle
quelle
Antworten:
Die von @peerless gegebene Lösung ist ein guter Anfang, startet jedoch nur dann eine Animation, wenn das Ziehen beginnt, ohne die Geschwindigkeit des Bildlaufs zu berücksichtigen. Dies führt zu einer abgehackteren Erfahrung als in der Facebook-App. Um dem Verhalten von Facebook zu entsprechen, müssen wir:
Zunächst benötigen Sie die folgende Eigenschaft:
Und hier sind die
UIScrollViewDelegate
Methoden:Sie benötigen außerdem die folgenden Hilfsmethoden:
Ersetzen Sie für ein etwas anderes Verhalten die Zeile, die die Leiste beim Scrollen neu positioniert (den
else
Block inscrollViewDidScroll
), durch diese:Dadurch wird der Balken basierend auf dem letzten Bildlaufprozentsatz anstelle eines absoluten Betrags positioniert, was zu einer langsameren Überblendung führt. Das ursprüngliche Verhalten ist eher Facebook-ähnlich, aber ich mag dieses auch.
Hinweis: Diese Lösung ist nur für iOS 7+ verfügbar. Stellen Sie sicher, dass Sie die erforderlichen Überprüfungen hinzufügen, wenn Sie ältere Versionen von iOS unterstützen.
quelle
customView
.ScrollView
'scontentSize
kleiner als der Rahmen ist, funktioniert die Animation des Gleitens nicht. Stellen Sie außerdem sicher, dass Sie das Alpha aller Navigationselemente auf 1,0 Zoll zurücksetzenviewDidDisappear
.BEARBEITEN: Nur für iOS 8 und höher.
Sie können versuchen, zu verwenden
Funktioniert bei mir.
Wenn Ihre Codierung schnell ist, müssen Sie diese Methode verwenden (von https://stackoverflow.com/a/27662702/2283308 ).
quelle
Hier ist noch eine Implementierung: TLYShyNavBar v1.0.0 veröffentlicht!
Nachdem ich die angebotenen Lösungen ausprobiert hatte, entschloss ich mich, meine eigenen zu machen, und für mich waren sie entweder schlecht, hatten eine hohe Eintrittsbarriere und einen Code für die Kesselplatte oder es fehlte die Erweiterungsansicht unter der Navigationsleiste. Um diese Komponente zu verwenden, müssen Sie lediglich Folgendes tun:
Oh, und es ist kampferprobt in unserer eigenen App.
quelle
extendedLayoutIncludesOpaqueBars
, dassYES
auf meinemUICollectionViewController
Sie können sich meine GTScrollNavigationBar ansehen . Ich habe UINavigationBar in Unterklassen unterteilt, damit es basierend auf dem Scrollen einer UIScrollView einen Bildlauf durchführt.
Hinweis: Wenn Sie eine OPAQUE-Navigationsleiste haben, muss die Bildlaufansicht ERWEITERT werden, wenn die Navigationsleiste ausgeblendet wird. Genau das macht GTScrollNavigationBar. (Genau wie zum Beispiel in Safari unter iOS.)
quelle
iOS8 enthält Eigenschaften, mit denen die Navigationsleiste kostenlos ausgeblendet werden kann. Es gibt ein WWDC-Video, das dies demonstriert. Suchen Sie nach "View Controller Advancements in iOS 8".
Beispiel :
}}
Andere Eigenschaften:
Gefunden über http://natashatherobot.com/navigation-bar-interactions-ios8/
quelle
Ich habe eine schnelle und schmutzige Lösung dafür. Ich habe noch keine eingehenden Tests durchgeführt, aber hier ist die Idee:
Diese Eigenschaft behält alle Elemente in der Navigationsleiste für meine UITableViewController-Klasse bei
In derselben UITableViewController-Klasse habe ich:
Das ist nur für ios> = 7, ich weiß, es ist hässlich, aber ein schneller Weg, dies zu erreichen. Kommentare / Vorschläge sind willkommen :)
quelle
Dies funktioniert für iOS 8 und höher und stellt sicher, dass die Statusleiste ihren Hintergrund beibehält
Und wenn Sie die Navigationsleiste anzeigen möchten, wenn Sie auf die Statusleiste tippen, können Sie dies tun:
quelle
Hier ist meine Implementierung: SherginScrollableNavigationBar .
In meinem Ansatz verwende ich
KVO
zur BeobachtungUIScrollView
des Status, sodass keine Notwendigkeit besteht, einen Delegaten zu verwenden (und Sie können diesen Delegaten für alles verwenden, was Sie sonst noch benötigen).quelle
Bitte versuchen Sie meine Lösung und lassen Sie mich wissen, warum dies nicht so gut ist wie die vorherigen Antworten.
quelle
Eine Möglichkeit, dies zu erreichen, ist die folgende.
Registrieren Sie Ihren View Controller beispielsweise als
UIScrollViewDelegate
IhrenUITableView
.Innerhalb der
UIScrollViewDelegate
Methoden können Sie das neue contentOffset abrufen und IhrUINavigationBar
Up oder Down entsprechend übersetzen.Das Einstellen des Alphas der Unteransichten kann auch basierend auf einigen Schwellenwerten und Faktoren erfolgen, die Sie festlegen und berechnen können.
Ich hoffe es hilft!
quelle
Zusätzlich zu Iwburks Antwort habe ich Folgendes hinzugefügt, um das Alpha-Problem in nicht benutzerdefinierten Navigationsleisten zu beheben und die Navigationsleiste in der viewWillDisappear-Methode zurückzusetzen:
quelle
Ich suchte nach einer Lösung, die jeden Stil und jedes Verhalten zuließ. Sie werden feststellen, dass das Verhalten der Balkenverdichtung in vielen verschiedenen Apps unterschiedlich ist. Und natürlich sieht die Leiste zwischen den Apps völlig anders aus.
Ich habe eine Lösung für dieses Problem mit https://github.com/bryankeller/BLKFlexibleHeightBar/ erstellt.
Sie können Ihre eigenen Verhaltensregeln definieren, um zu steuern, wie und wann der Balken schrumpft und wächst, und Sie können genau definieren, wie die Unteransichten des Balkens auf das Verdichten oder Wachsen des Balkens reagieren sollen.
Schauen Sie sich mein Projekt an, wenn Sie viel Flexibilität wünschen, um jede Art von Kopfzeile zu erstellen, die Sie sich vorstellen können.
quelle
Ich habe versucht, dieses Verhalten in einer Situation zu emulieren, in der ich einen benutzerdefinierten Header für eine UITableView benötigte. Ich habe meine eigene "Navigations" -Leiste gerollt, da sich diese unter einer Reihe anderer Elemente auf der Seite befindet und ich wollte, dass die Abschnittsüberschriften dem Standardverhalten "Andocken" folgen. Ich denke, ich habe eine ziemlich clevere und prägnante Möglichkeit gefunden, ein UITableView / UIScrollView zusammen mit einem anderen Objekt in einem ähnlichen Stil wie Facebook / Instagram / Chrome / etc anzupassen. Apps.
In meiner .xib-Datei habe ich meine Komponenten in eine Freiformansicht geladen: http://imgur.com/0z9yebJ (Entschuldigung, ich habe nicht den Repräsentanten, um Bilder zu inline)
Beachten Sie, dass die Tabelle in der linken Seitenleiste hinter der Hauptkopfansicht angeordnet ist. Sie können es dem Screenshot nicht entnehmen, aber es hat auch die gleiche y-Position wie die Hauptkopfansicht. Da die Eigenschaft contentInset in der UITableView nicht sichtbar ist, wird sie auf 76 festgelegt (die Höhe der Hauptheaderansicht).
Damit die Hauptheaderansicht im Einklang mit UIScrollView nach oben verschoben wird, verwende ich die scrollViewDidScroll-Methoden von UIScrollViewDelegate, um einige Berechnungen durchzuführen und das contentInset von UIScrollView sowie den Frame der Hauptheaderansicht zu ändern.
Die erste if- Anweisung erledigt den größten Teil des schweren Hebens, aber ich musste die beiden anderen einbeziehen, um Situationen zu bewältigen, in denen der Benutzer kräftig zieht und die an scrollViewDidScroll gesendeten anfänglichen contentOffset-Werte außerhalb des Bereichs des ersten if liegen Anweisung liegen.
Letztendlich funktioniert das wirklich gut für mich. Ich hasse es, meine Projekte mit einer Reihe aufgeblähter Unterklassen zu beladen. Ich kann nicht darüber sprechen, ob dies in Bezug auf die Leistung die beste Lösung ist (ich habe immer gezögert, Code in scrollViewDidScroll einzufügen, da er ständig aufgerufen wird), aber der Code-Footprint ist der kleinste, den ich je gesehen habe Lösung für dieses Problem, ohne dass eine UITableView in eine UIScrollView verschachtelt werden muss (Apple rät in der Dokumentation davon ab, und Touch-Ereignisse werden in der UITableView etwas unkonventionell). Hoffe das hilft jemandem!
quelle
HidingNavigationBar ist ein großartiges Projekt, bei dem die Navigationsleiste und die Registerkartenleiste ausgeblendet werden, wenn Sie möchten.
https://github.com/tristanhimmelman/HidingNavigationBar
quelle
Ich habe versucht, GTScrollNavigationBar zu implementieren, aber für meine App musste ich die Einschränkungen für das automatische Layout ändern. Ich habe beschlossen, ein Beispiel für meine Implementierung auf GitHub zu veröffentlichen, falls jemand anderes dies mit automatischem Layout tun muss. Das andere Problem, das ich bei den meisten anderen Implementierungen hatte, ist, dass die Leute die Grenzen der Bildlaufansicht nicht festlegen, um den Parallaxen-Bildlaufeffekt zu vermeiden, den Sie beim Bildlauf erzeugen und gleichzeitig die Größe der Bildlaufansicht anpassen.
Schauen Sie sich JSCollapsingNavBarViewController an, wenn Sie dies mit automatischem Layout tun müssen. Ich habe zwei Versionen hinzugefügt, eine nur mit der Navigationsleiste und eine mit einer Unterleiste unterhalb der Navigationsleiste, die vor dem Reduzieren der Navigationsleiste zusammenfällt.
quelle
Ich habe es auf diese Weise versucht, ich hoffe, es wird helfen. Implementieren Sie einfach den Code in der Delegate-Methode und stellen Sie die gewünschte Ansicht / Unteransicht ein
quelle
Eine Erweiterung von @Iwburks Antwort ... Anstatt den Ursprung der Navigationsleiste zu ändern, musste ich die Größe der Navigationsleiste erweitern / verkleinern.
Es funktioniert noch nicht mit der
stoppedScrolling
Methode, ich werde ein Update posten, wenn ich es habequelle
All diese Ansätze scheinen zu kompliziert ... Also habe ich natürlich meine eigenen gebaut:
quelle
frame
Grundstück?Ich habe alle Antworten in Ziel-C gefunden. Dies ist meine Antwort in Swift 3. Dies ist ein sehr allgemeiner Code, der direkt verwendet werden kann. Es funktioniert sowohl mit UIScrollView als auch mit UITableView.
Die Logik zum Setzen von Alpha auf Navigationselemente wird aus der Antwort von @ WayneBurkett kopiert und in Swift 3 neu geschrieben.
quelle