UIPageViewController Snapchat-ähnliche Navigation

Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

  • UIPageViewController Snapchat-ähnliche Navigation

    Hallo zusammen,

    Ich möchte in meiner App eine Navigation ähnlich wie in der Snapchat App implementieren, so dass der User durch horizontales Swipen durch die verschiedenen VCs navigieren kann.

    Ich mache das aktuell über einen UIPageViewController:


    C-Quellcode

    1. #import "PageNavigationVC.h"
    2. @interface PageNavigationVC ()
    3. @end
    4. @implementation PageNavigationVC
    5. - (void)viewDidLoad
    6. {
    7. [super viewDidLoad];
    8. self.vCIdentifiers = @[@"VC1", @"VC2", @"VC3", @"VC4"];
    9. self.pageViewController = [self.storyboard instantiateViewControllerWithIdentifier:@"PageViewController"];
    10. self.pageViewController.dataSource = self;
    11. UIViewController *startingViewController = [self.storyboard instantiateViewControllerWithIdentifier:self.vCIdentifiers[0]];
    12. NSArray *viewControllers = @[startingViewController];
    13. [self.pageViewController setViewControllers:viewControllers direction:UIPageViewControllerNavigationDirectionForward animated:NO completion:nil];
    14. self.pageViewController.view.frame = CGRectMake(0, 0, self.view.frame.size.width, self.view.frame.size.height);
    15. [self addChildViewController:_pageViewController];
    16. [self.view addSubview:_pageViewController.view];
    17. [self.pageViewController didMoveToParentViewController:self];
    18. }
    19. - (UIViewController *)getViewControllerFromClass:(Class)class isNext:(BOOL)next
    20. {
    21. NSInteger index = [self.vCIdentifiers indexOfObject:[NSString stringWithFormat:@"%@", class]];
    22. if (next)
    23. index+=1;
    24. else
    25. index-=1;
    26. if (index < 0 || index >= self.vCIdentifiers.count)
    27. return nil;
    28. else
    29. return [self.storyboard instantiateViewControllerWithIdentifier:self.vCIdentifiers[index]];
    30. }
    31. #pragma mark - Page View Controller Data Source
    32. - (UIViewController *)pageViewController:(UIPageViewController *)pageViewController viewControllerBeforeViewController:(UIViewController *)viewController
    33. {
    34. return [self getViewControllerFromClass:viewController.class isNext:NO];
    35. }
    36. - (UIViewController *)pageViewController:(UIPageViewController *)pageViewController viewControllerAfterViewController:(UIViewController *)viewController
    37. {
    38. return [self getViewControllerFromClass:viewController.class isNext:YES];
    39. }
    40. - (NSInteger)presentationCountForPageViewController:(UIPageViewController *)pageViewController
    41. {
    42. return 0;
    43. }
    44. - (NSInteger)presentationIndexForPageViewController:(UIPageViewController *)pageViewController
    45. {
    46. return 0;
    47. }
    Alles anzeigen
    PageNavigationVC ist ein UIViewController, der VC mit dem identifier "PageViewController" ist ein UIPageViewController.

    Das Navigieren durch das Swipen funktioniert auch schon korrekt, ich habe allerdings ein paar Probleme, die ich leider nicht lösen kann:

    Die einzelnen VCs, durch die geswiped wird, sind in NavigationController embedded (nur für die Navigation Bar eigentlich). Die Navigation Bar wird aber leider nicht mehr angezeigt, seit ich den UIPageViewController nutze.

    Das zweite Problem ist, dass, wenn man beim letzten oder ersten VC in der Liste der VCs angekommen ist und weiter swiped, der Hintergrund erscheint (wie bei einem TableView, wenn man am unteren Ende weiter scrollt). Normalerweise kann man so etwas ja mit bounces=NO deaktivieren, so eine Option finde ich aber bei einem UIPageViewController nicht.

    Hat jemand eine Idee wie ich das lösen kann?

    Vielen Dank im Voraus :)
  • Venyu schrieb:

    Die einzelnen VCs, durch die geswiped wird, sind in NavigationController embedded (nur für die Navigation Bar eigentlich). Die Navigation Bar wird aber leider nicht mehr angezeigt, seit ich den UIPageViewController nutze.
    Du solltest lieber den Pageview-Controller in den Navigationcontroller legen. Das ergibt optisch das Gleiche.

    Venyu schrieb:

    Das zweite Problem ist, dass, wenn man beim letzten oder ersten VC in der Liste der VCs angekommen ist und weiter swiped, der Hintergrund erscheint (wie bei einem TableView, wenn man am unteren Ende weiter scrollt). Normalerweise kann man so etwas ja mit bounces=NO deaktivieren, so eine Option finde ich aber bei einem UIPageViewController nicht.
    Scrollen ohne Bouncing fühlt sich auch komisch (wie Android ;) an. Warum verwendest du nicht stattdessen das Umblättern?
    „Meine Komplikation hatte eine Komplikation.“
  • Erstmal danke für die Antwort.

    macmoonshine schrieb:

    Du solltest lieber den Pageview-Controller in den Navigationcontroller legen. Das ergibt optisch das Gleiche.
    Okay, aber damit haben alle VCs die gleiche Navigation Bar. Ich möchte z.B. nur in bestimmten VCs eine Navigation Bar haben, und der Inhalt der Navigation Bar (Title, Buttons) ist von VC zu VC unterschiedlich.

    macmoonshine schrieb:

    Scrollen ohne Bouncing fühlt sich auch komisch (wie Android an. Warum verwendest du nicht stattdessen das Umblättern?
    Am Umblättern stört mich eigentlich nur die Animation, deshalb habe ich auf Scrolling gestellt. Kann ich das Umblättern ohne diese Blättern-Animation verwenden?

    VG
  • Venyu schrieb:

    Erstmal danke für die Antwort.

    macmoonshine schrieb:

    Du solltest lieber den Pageview-Controller in den Navigationcontroller legen. Das ergibt optisch das Gleiche.
    Okay, aber damit haben alle VCs die gleiche Navigation Bar. Ich möchte z.B. nur in bestimmten VCs eine Navigation Bar haben, und der Inhalt der Navigation Bar (Title, Buttons) ist von VC zu VC unterschiedlich.

    macmoonshine schrieb:

    Scrollen ohne Bouncing fühlt sich auch komisch (wie Android an. Warum verwendest du nicht stattdessen das Umblättern?
    Am Umblättern stört mich eigentlich nur die Animation, deshalb habe ich auf Scrolling gestellt. Kann ich das Umblättern ohne diese Blättern-Animation verwenden?
    VG
    Das, was die Navigation Bar anzeigt, kannst du doch dann vom jeweilig angezeigten ViewController dynamisch erstelen lassen. genauso kannst du dort entscheiden, ob sie überhaupt angezeigt werden soll.
    Man kann alles schaffen. Man muss es nur wollen ;)
    www.regetskcob.github.io
  • DBocksteger schrieb:

    Das, was die Navigation Bar anzeigt, kannst du doch dann vom jeweilig angezeigten ViewController dynamisch erstelen lassen. genauso kannst du dort entscheiden, ob sie überhaupt angezeigt werden soll.
    Kannst du mir sagen wie ich dann von den VCs auf die Navigation Bar zugreife? Über self.title oder self.navigationItem.title z.B. passiert leider nichts.

    Danke :)
  • macmoonshine schrieb:

    Du musst du Hierarchie hochkraxeln (self.parentViewController.navigationController), und den Navigationitem des Pageviewcontrollers ändern, da der ja im Navigationcontroller liegt.
    Danke, leider funktioniert das nicht ganz optimal:
    Beim ersten VC der aufgerufen wird, soll z.B. die Navigation Bar hidden sein. Ich mache das so:

    C-Quellcode

    1. self.parentViewController.navigationController.navigationBarHidden = YES;
    Beim Start der App ist die Navigation Bar aber trotzdem sichtbar, erst wenn zu einem anderen VC und dann wieder zurück zum ersten VC swipe ist sie hidden...

    Und wenn ich von einem VC ohne Navbar zu einem VC mit Navbar swipe, wird während dem Swipen auch beim VC wo eigentlich keine Navbar erscheinen sollte eine Navbar angezeigt.


    Mache ich hier irgendetwas falsch?
  • Venyu schrieb:

    macmoonshine schrieb:

    Du musst du Hierarchie hochkraxeln (self.parentViewController.navigationController), und den Navigationitem des Pageviewcontrollers ändern, da der ja im Navigationcontroller liegt.
    Danke, leider funktioniert das nicht ganz optimal:Beim ersten VC der aufgerufen wird, soll z.B. die Navigation Bar hidden sein. Ich mache das so:

    C-Quellcode

    1. self.parentViewController.navigationController.navigationBarHidden = YES;
    Beim Start der App ist die Navigation Bar aber trotzdem sichtbar, erst wenn zu einem anderen VC und dann wieder zurück zum ersten VC swipe ist sie hidden...

    Und wenn ich von einem VC ohne Navbar zu einem VC mit Navbar swipe, wird während dem Swipen auch beim VC wo eigentlich keine Navbar erscheinen sollte eine Navbar angezeigt.


    Mache ich hier irgendetwas falsch?
    An welcher Stelle im Code rufst du das auf?
    Man kann alles schaffen. Man muss es nur wollen ;)
    www.regetskcob.github.io
  • DBocksteger schrieb:

    Venyu schrieb:

    macmoonshine schrieb:

    Du musst du Hierarchie hochkraxeln (self.parentViewController.navigationController), und den Navigationitem des Pageviewcontrollers ändern, da der ja im Navigationcontroller liegt.
    Danke, leider funktioniert das nicht ganz optimal:Beim ersten VC der aufgerufen wird, soll z.B. die Navigation Bar hidden sein. Ich mache das so:

    C-Quellcode

    1. self.parentViewController.navigationController.navigationBarHidden = YES;
    Beim Start der App ist die Navigation Bar aber trotzdem sichtbar, erst wenn zu einem anderen VC und dann wieder zurück zum ersten VC swipe ist sie hidden...

    Und wenn ich von einem VC ohne Navbar zu einem VC mit Navbar swipe, wird während dem Swipen auch beim VC wo eigentlich keine Navbar erscheinen sollte eine Navbar angezeigt.


    Mache ich hier irgendetwas falsch?
    An welcher Stelle im Code rufst du das auf?
    In der viewWillAppear-Methode.
  • Venyu schrieb:

    DBocksteger schrieb:

    Venyu schrieb:

    macmoonshine schrieb:

    Du musst du Hierarchie hochkraxeln (self.parentViewController.navigationController), und den Navigationitem des Pageviewcontrollers ändern, da der ja im Navigationcontroller liegt.
    Danke, leider funktioniert das nicht ganz optimal:Beim ersten VC der aufgerufen wird, soll z.B. die Navigation Bar hidden sein. Ich mache das so:

    C-Quellcode

    1. self.parentViewController.navigationController.navigationBarHidden = YES;
    Beim Start der App ist die Navigation Bar aber trotzdem sichtbar, erst wenn zu einem anderen VC und dann wieder zurück zum ersten VC swipe ist sie hidden...

    Und wenn ich von einem VC ohne Navbar zu einem VC mit Navbar swipe, wird während dem Swipen auch beim VC wo eigentlich keine Navbar erscheinen sollte eine Navbar angezeigt.


    Mache ich hier irgendetwas falsch?
    An welcher Stelle im Code rufst du das auf?
    In der viewWillAppear-Methode.
    Damit setzt du diesen Status der Navigationsleiste erst, wenn dein Controller bald erscheinen wird. Was passiert bspw. in der viewDidLoad?
    Man kann alles schaffen. Man muss es nur wollen ;)
    www.regetskcob.github.io
  • DBocksteger schrieb:

    Damit setzt du diesen Status der Navigationsleiste erst, wenn dein Controller bald erscheinen wird. Was passiert bspw. in der viewDidLoad?
    In der viewDidLoad wird zwar nicht mehr während des Swipens auf beiden VCs eine Navbar angezeigt, aber leider klappt das weiterhin nicht richtig. Die Navbar wird jetzt erst nachträglich (nach dem bereits der ganze View angezeigt wurde) oben "reingeschoben". Außerdem wird beim Swipen auf einen VC ohne Navbar von einem VC mit Nav Bar die Nav Bar weiterhin angezeigt... Irgendwas mache ich wohl falsch