UIPageViewController automatische scrollen in iOS
Mache ich eine app, in die PageViewController scrollen soll in einiger Zeit-Intervall. Derzeit habe ich getan, bis die manuelle scrollen. Benutzer können Blättern keine Bilder und es wird funktionieren. Aber stecken mit erreichen der automatische Bildlauf mit Benutzer berührt. Unten ist mein code. Bitte helfen Sie mir, dieses.
- (void)viewDidLoad {
[super viewDidLoad];
//Do any additional setup after loading the view.
_pageTitles = @[@"", @"", @"", @""];
_pageImages = @[@"page1.png", @"page2.png", @"page3.png", @"page4.png"];
//Create page view controller
self.pageViewController = [self.storyboard instantiateViewControllerWithIdentifier:@"PageViewController"];
self.pageViewController.dataSource = self;
PageContentViewController *startingViewController = [self viewControllerAtIndex:0];
NSArray *viewControllers = @[startingViewController];
[self.pageViewController setViewControllers:viewControllers direction:UIPageViewControllerNavigationDirectionForward animated:NO completion:nil];
//Change the size of page view controller
self.pageViewController.view.frame = CGRectMake(0, 0, self.view.frame.size.width, self.view.frame.size.height - 50);
[self addChildViewController:_pageViewController];
[self.view addSubview:_pageViewController.view];
[self.pageViewController didMoveToParentViewController:self];
}
- (PageContentViewController *)viewControllerAtIndex:(NSUInteger)index
{
if (([self.pageTitles count] == 0) || (index >= [self.pageTitles count])) {
return nil;
}
//Create a new view controller and pass suitable data.
PageContentViewController *pageContentViewController = [self.storyboard instantiateViewControllerWithIdentifier:@"PageContentViewController"];
pageContentViewController.imageFile = self.pageImages[index];
pageContentViewController.titleText = self.pageTitles[index];
pageContentViewController.pageIndex = index;
return pageContentViewController;
}
-(void)viewWillAppear:(BOOL)animated {
[super viewWillAppear:YES];
self.navigationController.navigationBar.hidden = YES;
}
#pragma mark - Page View Controller Data Source
- (UIViewController *)pageViewController:(UIPageViewController *)pageViewController viewControllerBeforeViewController:(UIViewController *)viewController
{
NSUInteger index = ((PageContentViewController*) viewController).pageIndex;
if ((index == 0) || (index == NSNotFound)) {
return nil;
}
index--;
return [self viewControllerAtIndex:index];
}
- (UIViewController *)pageViewController:(UIPageViewController *)pageViewController viewControllerAfterViewController:(UIViewController *)viewController
{
NSUInteger index = ((PageContentViewController*) viewController).pageIndex;
if (index == NSNotFound) {
return nil;
}
index++;
if (index == [self.pageTitles count]) {
return nil;
}
return [self viewControllerAtIndex:index];
}
- (NSInteger)presentationCountForPageViewController:(UIPageViewController *)pageViewController
{
return [self.pageTitles count];
}
- (NSInteger)presentationIndexForPageViewController:(UIPageViewController *)pageViewController
{
return 0;
}
Du musst angemeldet sein, um einen Kommentar abzugeben.
@Daniel dein link ist kaputt und deine "Antwort" tut wenig, um zu erklären, Ihre Lösung auf die Frage. Für Interessierte in der Lesen-Dokumentation für die UIPageViewController Klasse.
Methode, um Aufmerksamkeit zu hier :
Den UIPageViewController erwartet, dass Sie sagen, welche Daten, zu liefern und zu welchem controller zu verwenden, basierend auf einem Wert. Hier bin ich zu sagen, meine UIPageController Unterklasse werden die Delegierten und dataSouce. Nach der Konfiguration des delegate-Methoden und die viewControllerAtIndex dataSource-Methode, ich habe ein benutzerdefiniertes Intervall, welche Anrufe meiner loadNextController Methode. In dieser Methode, die ich bin überprüfung, um zu sehen, wenn der "weiter" - controller ist gleich null. Wenn es nicht nil ist, gebe ich den "weiter" - controller als @[starting controller] zurück, um einen zweiten Anruf zu setViewControllers. Wenn es null ist, ich nur setzen Sie den index-Wert auf NULL und nennen setViewControllers mit meinen "nächsten" - controller als @[starting controller]. Diese benutzerdefinierten Unterklasse dient zur Seite, um die nächste oder erste-controller automatisch. Der bonus ist, dass der Benutzer-Interaktion wird immer noch behandelt, indem die UIPageViewController Klasse.
Hinweis: Der erste Aufruf von setViewControllers erforderlich ist, weil Ihre UIPageViewContrller nicht wissen, was wäre, wenn jeder viewController geladen werden können ersten. Meine zweite Aufruf setViewControllers nicht mehr, als Sie zum nächsten oder ersten viewController.
Hinweis: Dies funktioniert auch; aber ich bin nicht immer von der Rückkehr die richtigen controller, wenn die interne gestik-Erkennung ändert die Steuerung. Irgendwo entlang der Weise, die ich bin, verlieren die Spur des index. Ich werde aktualisieren diesen mit meinem fertigen Umsetzung.
Arbeitete an @Ryan ' s Antwort. Fixed @Ryan-Frage "aber ich bin nicht immer von der Rückkehr die richtigen controller, wenn die interne gestik-Erkennung ändert die Steuerung. Irgendwo entlang der Weise, die ich bin, verlieren die Spur des index."
Gerade bearbeitete paar Zeilen und es funktionierte für mich. Gedanken zu teilen, bei einigen braucht man das gleiche.
Umgesetzt datasource-Methoden der PageViewController
Umgesetzt didFinishAnimating Methode der PageController delegieren zu bekommen aktuellen index PageViewController und update PageControl entsprechend
und im letzten implementierte Methode zum aktualisieren PageViewController auf animation
Aktuellen index deklariert ist weltweit zu verfolgen, aktuelle PageViewController index und update PageController entsprechend.
Hoffe es hilft.. viel Spaß beim Programmieren.. 🙂
Vielleicht die Methode, die Sie suchen, ist
setViewControllers:direction:animated:completion:
Natürlich benötigen Sie zur Versorgung der view-Controller, die Sie sein wollen, sehen Sie am Ende der animation.
Rufen Sie diese mit animierten auf JA gesetzt und der controller wird die Seite automatisch:)
Sehen die Dokumentation für mehr