UIPageViewController
arasındaki PageCurl
karşı Scroll
geçişleri kullanarak farklı davranışlar görüyorum. PageCurl beklediğim şekilde çalışır ancak Scroll-ing kullanırken bazen viewControllerBeforeViewController:
ve viewControllerAfterViewController:
çağrıları görürsünüz Ekstra Veri Kaynağı çağrılarının bu modelini tanıyan var mı?UIPageViewController davranışı Scroll & PageCurl için farklı davranış
Bir dizi görüntü gösteriyorum ve sırayla herhangi bir yere başlıyorum. Scroll geçişini kullanırken değil, PageCurl kullanırken, ilk sayfaya geçtikten sonra "sağa" hareket ettiğimde, beklediğimden ziyade 3 DataSource çağrısı alıyorum. Aşağıdaki örnek çalıştırmak için 3 indeks değerimde başladım. "Sonraki" görüntüye geçmek için kaydırdığımda, indeks 4'e ulaşmak için 3 numaralı tek bir viewControllerAfterViewController:
çağrı almayı beklerim. Eğer bir test yaparsam iki tane alırım Ekstra aramalar: İndeks 3'ten önce (yani 2) ve Endeks 4'ten sonrakiler için (yani 5). çıktısı:
2013-04-19 12:37:33.964 Clouds[496:907] Page 3 - viewControllerAfterViewController called on this index
2013-04-19 12:37:33.988 Clouds[496:907] Page 3 - viewControllerBeforeViewController called on this index
2013-04-19 12:37:34.010 Clouds[496:907] willTransitionToViewControllers to indices
2013-04-19 12:37:34.014 Clouds[496:907] Page 4
2013-04-19 12:37:34.461 Clouds[496:907] Page 4 - viewControllerAfterViewController called on this index
bütün bunlardan sonra görüntülenen görünümü gerçekten UIPageViewController beklediğim şekilde davranmaya görünüyor bu ilk geçişten sonra indeks 4 için görünümüdür. PageCurl geçişini kullandığımda, her zaman beklediğim şekilde davranıyor ve bu gereksiz çağrılardan hiçbirini alamıyorum. aslında çıktıyı üretti
kodudur:
- (void)viewDidLoad
{
[super viewDidLoad];
self.pageViewController = [[UIPageViewController alloc] initWithTransitionStyle:UIPageViewControllerTransitionStyleScroll navigationOrientation:UIPageViewControllerNavigationOrientationHorizontal options:nil];
self.pageViewController.delegate = self;
self.pageViewController.dataSource = self;
CloudImageVC *startingViewController = [self viewControllerAtIndex:self.currentPage storyboard:self.storyboard];
NSArray *viewControllers = @[startingViewController];
[self.pageViewController setViewControllers:viewControllers direction:UIPageViewControllerNavigationDirectionForward animated:NO completion:NULL];
[self addChildViewController:self.pageViewController];
[self.view addSubview:self.pageViewController.view];
CGRect pageViewRect = self.view.bounds;
self.pageViewController.view.frame = pageViewRect;
[self.pageViewController didMoveToParentViewController:self];
// Add the page view controller's gesture recognizers to the book view controller's view so that the gestures are started more easily.
self.view.gestureRecognizers = self.pageViewController.gestureRecognizers;
}
- (CloudImageVC *)viewControllerAtIndex:(NSUInteger)index storyboard:(UIStoryboard *)storyboard {
// Return the data view controller for the given index.
if (index >= [self.imageNames count]) {
return nil;
}
self.dataViewController = [self makeDataViewControllerAtIndex:index storyboard:storyboard];
return self.dataViewController;
}
- (CloudImageVC *) makeDataViewControllerAtIndex:(NSUInteger)index storyboard:(UIStoryboard *)storyboard {
// Make and return the data view controller for the given index.
if (index >= [self.imageNames count]) {
return nil;
}
// Create a new view controller and pass suitable data.
self.dataViewController = [storyboard instantiateViewControllerWithIdentifier:@"CloudImageVC"];
self.dataViewController.imageIndex = index;
//self.dataViewController.cloudImage = nil;
return self.dataViewController;
}
- (NSUInteger)indexOfViewController:(CloudImageVC *)viewController
{
// Return the index of the given data view controller.
// For simplicity, we store the index value in the view controller.
return viewController.imageIndex;
}
#pragma mark - Page View Controller Data Source
- (UIViewController *)pageViewController:(UIPageViewController *)pageViewController viewControllerBeforeViewController:(UIViewController *)viewController {
NSUInteger index = [self indexOfViewController:(CloudImageVC *)viewController];
NSLog(@"Page %d - viewControllerBeforeViewController called on this index", index);
if ((index == 0) || (index == NSNotFound)) {
return nil;
}
index--;
return [self viewControllerAtIndex:index storyboard:viewController.storyboard];
}
- (UIViewController *)pageViewController:(UIPageViewController *)pageViewController viewControllerAfterViewController:(UIViewController *)viewController {
NSUInteger index = [self indexOfViewController:(CloudImageVC *)viewController];
NSLog(@"Page %d - viewControllerAfterViewController called on this index", index);
if (index == NSNotFound) {
return nil;
}
index++;
if (index == self.imageNames.count) {
return nil;
}
return [self viewControllerAtIndex:index storyboard:viewController.storyboard];
}
#pragma mark - Protocol UI PageViewController Delegate
- (void) pageViewController:(UIPageViewController *)pageViewController willTransitionToViewControllers:(NSArray *)pendingViewControllers {
NSLog(@"willTransitionToViewControllers to indices");
for (CloudImageVC *vc in pendingViewControllers) {
NSLog(@"Page %d",vc.imageIndex);
}
}
Evet, bu deseni gördüm ve saçma değil. Sayfa görüntüleme denetleyicisi, kaydırma geçişine ayarlandığında, görünüm hiyerarşisine kaydırma görünümü eklenir ve fazladan aramalar, önceki ve sonraki denetleyicileri almaktır, böylece kısmen kaydırıldığında, bir sonraki öğeyi görebilirsiniz (veya önceki) geçerli olanla aynı anda. – rdelmar
Bilgi için çok teşekkürler. Bir hatamın olmadığını bilmek güzel! –
@rdelmar Ama benim durumumda "önce", ama sadece "sonraki" iki kere çağırmıyor. Neden olduğuna dair bir fikrin var mı? –