Wie kann ich imitieren, das untere Blatt aus der Karten-app?
Kann mir jemand sagen wie ich vortäuschen kann das untere Blatt in der neuen Karten-app in iOS 10?
In Android, die Sie verwenden können, eine BottomSheet
imitiert dieses Verhalten, aber ich konnte nicht finden, etwas ähnliches für iOS.
Ist, dass eine einfache scroll-view mit einem Gehalt eingelassen, so dass die search-bar ist an der Unterseite?
Ich bin ziemlich neu in der iOS-Programmierung, damit, wenn jemand könnte mir helfen, erstellen das layout, das würde sehr geschätzt werden.
Dies ist, was ich meine "untere Blatt":
Sie müssen es selbst bauen, fürchte ich. Es ist eine Ansicht, die mit unscharfen hintergrund, Blick und einige gesten recognisers.
ja, ich weiß, ich habe zu bauen es selbst, aber was ich Frage ist, welche Ansichten verwendet werden, um erreichen diesen Effekt und wie Sie bestellt werden und so weiter
Es ist die visuelle Wirkung anzeigen mit blur-Effekt. Finden Sie diese SO Frage
Ich denke, Sie können eine pan-Geste recogniser die Ansicht von unten und verschieben Sie die Ansicht entsprechend (durch das beobachten der änderungen durch die Speicherung der y-Koordinaten zwischen gestik recogniser die Ereignisse, und berechnen Sie den Unterschied).
Ich mag Ihre Fragen. Ich bin der Planung und Implementierung von so etwas wie dieses. Wenn jemand schreiben könnte einige Beispiel wäre schön.
ja, ich weiß, ich habe zu bauen es selbst, aber was ich Frage ist, welche Ansichten verwendet werden, um erreichen diesen Effekt und wie Sie bestellt werden und so weiter
Es ist die visuelle Wirkung anzeigen mit blur-Effekt. Finden Sie diese SO Frage
Ich denke, Sie können eine pan-Geste recogniser die Ansicht von unten und verschieben Sie die Ansicht entsprechend (durch das beobachten der änderungen durch die Speicherung der y-Koordinaten zwischen gestik recogniser die Ereignisse, und berechnen Sie den Unterschied).
Ich mag Ihre Fragen. Ich bin der Planung und Implementierung von so etwas wie dieses. Wenn jemand schreiben könnte einige Beispiel wäre schön.
InformationsquelleAutor qwertz | 2016-06-22
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ich weiß nicht, wie genau das untere Blatt der neuen Karten-app, reagiert auf Benutzer-Interaktionen. Aber Sie können eine benutzerdefinierte Ansicht erstellen, die aussieht wie in den screenshots und fügen Sie es in die Hauptansicht.
Ich nehme an, Sie wissen, wie:
1 - create view-Controller entweder durch storyboards oder Verwendung von xib-Dateien.
2 - verwenden Sie googleMaps oder Apple MapKit.
Beispiel
1 - 2 view-Controller e.g, MapViewController und BottomSheetViewController. Die ersten controller als host für die Karte und die zweite ist das untere Blatt selbst.
Konfigurieren MapViewController
Erstellen Sie eine Methode hinzufügen, um das Unterste Blatt anzeigen.
Und rufen Sie in der Methode viewDidAppear:
Konfigurieren BottomSheetViewController
1) Vorbereitung der hintergrund
Erstellen Sie eine Methode zum hinzufügen von Unschärfe und Dynamik-Effekte
rufen Sie diese Methode in der viewWillAppear
Stellen Sie sicher, dass der controller die view die Hintergrundfarbe ist clearColor.
2) Animieren bottomSheet Aussehen
3) Ändern Sie Ihre xib, wie Sie wollen.
4) Pan Gesture Recognizer zur Ansicht.
In Ihrem viewDidLoad-Methode hinzufügen UIPanGestureRecognizer.
Und setzen Sie Ihre gestik Verhalten:
Scrollbaren Unteren Blatt:
Wenn Sie Ihre benutzerdefinierte Ansicht ein scroll-Ansicht oder eine andere Ansicht erbt, so haben Sie zwei Möglichkeiten:
Erste:
Design-Ansicht mit einer header-Ansicht und fügen Sie den panGesture in die Kopfzeile. (schlechte Benutzerführung).
Zweite:
1 - Fügen Sie die panGesture, um das Unterste Blatt anzeigen.
2 - Umsetzung der UIGestureRecognizerDelegate und legen Sie die panGesture delegieren an den controller.
3 - Umsetzung shouldRecognizeSimultaneouslyWith delegieren Funktion und deaktivieren der scrollView isScrollEnabled Eigenschaft, die in zwei Fall:
Sonst Bildlauf aktivieren.
HINWEIS
Wenn du .allowUserInteraction als eine animation-option, wie in dem Beispiel-Projekt, so müssen Sie zum aktivieren scrollen auf der animation Fertigstellung Schließung, wenn der Benutzer einen Bildlauf nach oben.
Beispielprojekt
Erstellte ich ein Beispiel-Projekt mit mehr Optionen auf diese repo, die Ihnen möglicherweise bessere Einsichten darüber, wie die entsprechende Anpassung des Blutflusses.
In der demo, addBottomSheetView () - Funktion steuert, welche Ansicht verwendet werden soll, wie ein Laken.
Beispielprojekt Screenshots
- Teilansicht
- FullView
- Scrollbare Ansicht -
wie kann ich tableview in xib-und laden Sie als Unterste Blatt ?wenn Sie helfen könnte wäre toll, Danke im Voraus!
Ich habe gerade aktualisiert die repo mit einem anderen viewController "ScrollableBottomSheetViewController.swift", die enthält einen tableView. Ich werde zu aktualisieren, die Antwort so bald wie möglich. Überprüfen Sie, dies zu github.com/AhmedElassuty/IOS-BottomSheet/issues/1
Ich habe bemerkt, dass die Apple-Maps untere Blatt behandelt den übergang von der Platte ziehen-Geste zum Blättern Ansicht scroll-Geste mit einer sanften Bewegung, D. H. der Benutzer muss nicht zu stoppen, eine Geste und ein neues beginnen, um zu starten, scrollen Sie die Ansicht. Dein Beispiel tut dies nicht. Haben Sie irgendwelche Gedanken auf, wie das bewerkstelligt werden könnte? Danke, und Dank eine Tonne für die Buchung der Beispiel in einem repo!
Ich bin wirklich froh, dass Sie fand meine Antwort hilfreich! Danke!!!
InformationsquelleAutor Ahmad Elassuty
Update 4. Dezember 2018
Ich veröffentlicht eine Bibliothek basierend auf dieser Lösung https://github.com/applidium/ADOverlayContainer.
Imitiert es die Shortcuts app-overlay. Sehen dieser Artikel für details.
Den Hauptbestandteil der Bibliothek ist die
OverlayContainerViewController
. Es definiert einen Bereich, wo ein view-controller können Sie die Maus nach oben und unten, verbergen oder offenbaren sich dem Inhalt unter.Implementieren
OverlayContainerViewControllerDelegate
geben die Anzahl der Kerben wünschte:Vorherigen Antwort
Ich denke, es ist ein wichtiger Punkt, der nicht behandelt wird in den vorgeschlagenen Lösungen : der übergang zwischen Schnecke und der übersetzung.
In Karten, wie Sie vielleicht bemerkt haben, wenn der tableView erreicht
contentOffset.y == 0
, das untere Blatt entweder gleitet nach oben oder nach unten geht.Der Punkt ist schwierig, weil wir können nicht einfach aktivieren/deaktivieren Sie den Bildlauf, wenn Sie unsere pan-Geste beginnt die übersetzung. Es würde aufhören, und das scrollen, bis eine neue Note beginnt. Dies ist der Fall in die meisten der vorgeschlagenen Lösungen hier.
Hier ist mein Versuch der Umsetzung dieser motion.
Ausgangspunkt : Karten-App
Beginnen unsere Untersuchung, wir visualisieren die view-Hierarchie der Karten (Maps starten auf einem simulator und wählen Sie
Debug
>Attach to process by PID or Name
>Maps
in Xcode 9).Es nicht sagen, wie die Bewegung funktioniert, aber es hat mir geholfen, zu verstehen, die Logik. Sie können spielen, mit den lldb und die view-Hierarchie debugger.
Unser ViewController-stacks
Erstellen wir eine einfache version der Maps-ViewController-Architektur.
Beginnen wir mit einer
BackgroundViewController
(unsere Karte ansehen) :Legen wir den tableView in einem engagierten
UIViewController
:Nun, wir brauchen einen VC, der embed-overlay und verwalten Sie Ihre übersetzung.
Zur Vereinfachung des Problems betrachten wir übersetzen können, dass es das overlay von einem statischen Punkt
OverlayPosition.maximum
zu einem anderenOverlayPosition.minimum
.Für jetzt es besitzt nur eine öffentliche Methode zum animieren Sie die position ändern, und es hat eine transparente Sicht :
Schließlich brauchen wir noch einen ViewController zum einbetten der alle :
In unserem AppDelegate, unsere startup-Sequenz sieht wie folgt aus :
Die Schwierigkeit hinter dem overlay-übersetzung
Nun, zu übersetzen, wie unser overlay ?
Meisten der vorgeschlagenen Lösungen eine dedizierte pan gesture recognizer, aber wir haben eigentlich schon eine haben : die schwenken-Geste der Tabelle anzeigen.
Darüber hinaus halten wir die schriftrolle und die übersetzung synchronisiert, und die
UIScrollViewDelegate
alle Veranstaltungen die wir brauchen !Eine naive Implementierung würde eine zweite pan-Geste, und versuchen Sie zum zurücksetzen der
contentOffset
von der Tabellenansicht, wenn die übersetzung erfolgt :Aber es funktioniert nicht. Der tableView aktualisiert seine
contentOffset
wenn eine eigene pan gesture recognizer Aktion auslöst oder wenn die displayLink-callback aufgerufen wird. Es ist kein Zufall, dass sich unsere recognizer-Trigger, rechts, nachdem diese erfolgreich zu überschreiben, diecontentOffset
.Unsere einzige chance ist, entweder einen Teil der layout-phase (durch überschreiben
layoutSubviews
des scroll-Ansicht ruft bei jedem frame von der scroll-view) oder zu reagieren, um diedidScroll
- Methode des Delegaten jedes mal aufgerufen, wenn diecontentOffset
geändert wird. Lassen Sie uns versuchen, diese ein.Die übersetzung der Umsetzung
Fügen wir eine Stellvertretung für unsere
OverlayVC
Versendung der scrollview die Veranstaltungen zu unserem translation-handler, dieOverlayContainerViewController
:In unserem container, verfolgen wir die übersetzung mit einem enum :
Die aktuelle position Berechnung sieht wie folgt aus :
Müssen wir 3 Methoden zur Verarbeitung der übersetzung :
Die erste sagt uns, wenn wir brauchen, um starten Sie die übersetzung.
Den zweiten führt man die übersetzung. Es verwendet die
translation(in:)
Methode der scrollView pan-Geste.Die Dritte animiert, das Ende der übersetzung, wenn der Benutzer gibt seine finger. Wir berechnen die position mit der Geschwindigkeit & die aktuelle position der Ansicht.
Unser overlay ist delegieren die Umsetzung einfach aussieht :
Letzte problem : der Versand der overlay container berührt
Die übersetzung ist ziemlich effizient. Aber es gibt noch ein letztes problem : die Details werden nicht geliefert, unser hintergrund anzeigen. Sie sind alle abgefangen durch den overlay-container angeben.
Wir können nicht gesetzt
isUserInteractionEnabled
zufalse
weil es auch deaktivieren Sie die Interaktion in unserer Tabelle anzeigen. Die Lösung ist die, die man verwendet, sich Massiv in die Karten-app,PassThroughView
:Entfernt es sich von der responder-Kette.
In
OverlayContainerViewController
:Ergebnis
Hier ist das Ergebnis :
Finden Sie den code hier.
Bitte, wenn Sie irgendwelche bugs, lass es mich wissen ! Beachten Sie, dass Ihre Implementierung kann natürlich auch ein zweite Pfanne Geste, speziell wenn Sie einen header hinzufügen, die in Ihrer überlagerung.
Update 23/08/18
Können wir ersetzen
scrollViewDidEndDragging
mitwillEndScrollingWithVelocity
eher alsenable
/disable
den Blättern, wenn der Benutzer endet ziehen :Können wir eine spring-animation und Benutzerinteraktion zulassen während der Animation zu machen, die motion flow besser :
UIViewPropertyAnimator
(die hat die Fähigkeit, zu pausieren), verwenden Sie dann diefractionComplete
Eigenschaft zum ausführen des scrub.Du hast Recht @aust. Ich vergaß zu schieben meine Vorherige änderung. Es sollte nun gut sein. Danke.
Dies ist eine großartige Idee, aber ich kann sehen, ein problem sofort. In der
translateView(following:)
Methode ermitteln Sie die Höhe auf der Basis der übersetzung, aber das könnte der Anfang von einem anderen Wert als 0.0 (z.B. Tabelle, view gescrollt ein bisschen und das overlay wird maximiert, wenn Sie beginnen, ziehen). Das ergäbe in den ersten Klick. Man könnte dies lösen, indem Sie diescrollViewWillBeginDragging
Rückruf, wo Sie sich an die erstecontentOffset
von der Tabelle und verwenden Sie es in dertranslateView(following:)
's Berechnung.Wenn die scroll-view-offset, der andere als 0.0 maximiert, während das overlay nicht anfangen, sich zu bewegen, bis der offset wird auf 0.0, sonst würden Sie nicht in der Lage sein, zu bestimmen, ob der Benutzer beabsichtigt, um einen Bildlauf der Bildlauf anzeigen oder die Interaktion mit dem overlay.
Ich war daran interessiert, anbringen debugger Karten.app auf dem Simulator zu, bekomme aber immer eine Fehlermeldung "Konnte nicht an zu pid : "9276"" folgte mit "Sicher "Karten" nicht bereits aktiv ist, und <username> über die Berechtigung zum Debuggen." - Wie hast du den trick mit Xcode zu ermöglichen das anbringen auf Karten.app?
InformationsquelleAutor GaétanZ
Versuchen Riemenscheibe:
https://github.com/52inc/Pulley
Nach dem ausführen der demo sieht es aus wie es unterstützt scrollen, aber nicht den reibungslosen übergang von bewegen der Schublade ein Bildlauf in der Liste.
Das Beispiel scheint sich zu verstecken Äpfel rechtliche link in der unteren linken Seite.
InformationsquelleAutor Rajee Jones
Können Sie versuchen, meine Antwort https://github.com/SCENEE/FloatingPanel. Es bietet eine container-view-controller die Anzeige "untere Blatt" - Schnittstelle.
Es ist einfach zu verwenden und Sie nicht dagegen, jede gestik-Erkennung Handhabung! Auch Sie können verfolgen, ein scroll-Ansicht(oder die Geschwister-Ansicht) in einer unteren Platte, wenn nötig.
Dies ist ein einfaches Beispiel. Bitte beachten Sie, dass Sie sich eine view-controller, um Ihre Inhalte anzuzeigen, die in einem unteren Blatt.
Hier ist ein weiteres Beispiel-code für die Anzeige einer unteren Platte zur Suche nach einem Ort wie Apple Maps.
Danke, @FarisMuhammed! Ich habe aktualisiert die post.
InformationsquelleAutor SCENEE
Keiner der oben genannten arbeiten für mich, weil das panning sowohl der tableview und der äußeren Blick gleichzeitig ist nicht glatt. Also schrieb ich meinem eigenen code, um die beabsichtigten Verhalten in der ios Karten-app.
https://github.com/OfTheWolf/UBottomSheet
InformationsquelleAutor ugur
Vielleicht können Sie versuchen, meine Antwort https://github.com/AnYuan/AYPannel, inspiriert von der Riemenscheibe. Reibungslosen übergang von bewegen der Schublade ein Bildlauf in der Liste. Ich habe eine pan-Geste auf dem container scroll-view, und legen Sie shouldRecognizeSimultaneouslyWithgesturerecognizer zurück JA. Mehr Details in meinem github-link oben. Wunsch, Ihr zu helfen.
InformationsquelleAutor day