1

UIPageViewController過渡頁面捲曲廣告素材我已經搜索了很多沒有成功發佈前:與UIScrollView的錯誤頁索引

我UIPageViewController用的UIViewController和頁面捲曲廣告素材的數組作爲過渡。

每個UIViewController由UIScrollView和UIWebView組成。

加載內容後基於webview高度計算的滾動高度。

現在,當我加載UIPageViewController並啓動UIViewController之間的導航而不滾動內容時,每件事情都能正常工作。但是,如果我滾動任何頁面,然後導航到下一頁或上一頁。它將重新顯示相同的頁面,然後再次正常工作。

我已經測試了IOS7和iOS8上:

UIPageViewController viewDidLoad方法:

self.pageController = [[UIPageViewController alloc] initWithTransitionStyle:UIPageViewControllerTransitionStylePageCurl navigationOrientation:UIPageViewControllerNavigationOrientationHorizontal options:nil]; 
NSArray *viewControllers = [NSArray arrayWithObject:currentViewController]; 

    [self.pageController setViewControllers:viewControllers direction:UIPageViewControllerNavigationDirectionForward animated:NO completion:nil]; 

self.pageController.doubleSided = NO; 

[self addChildViewController:self.pageController]; 
[[self view] addSubview:[self.pageController view]]; 
[self.pageController didMoveToParentViewController:self]; 

視圖控制器webViewDidFinishLoad:

CGSize contentSize = aWebView.scrollView.contentSize; 
webView.frame = CGRectMake(0, 312, contentSize.width, contentSize.height); 
scrollView.contentSize = CGSizeMake(320.f, contentSize.height+60); 

編輯 下面是完整的代碼爲viewControllerBeforeViewControllerviewControllerAfterViewController UIPageViewController

- (UIViewController *)pageViewController:(UIPageViewController *)pageViewController viewControllerBeforeViewController:(UIViewController *)viewController { 

    NSUInteger index = [(NewsDetailVC *)viewController index]; 
    self.index = index; 
    NSLog(@"view before %i", index); 
    if (index <= 0) { 
     return nil; 
    } 

    index--; 
    currentViewController = [self viewControllerAtIndex:index]; 
    return [self viewControllerAtIndex:index]; 

} 

- (UIViewController *)pageViewController:(UIPageViewController *)pageViewController viewControllerAfterViewController:(UIViewController *)viewController { 
    NSUInteger index = [(NewsDetailVC *)viewController index]; 
    NSLog(@"view after %i", index); 

    if (index >= self.newsList.count -1) { 
     return nil; 
    } 
    index++; 
    currentViewController =[self viewControllerAtIndex:index]; 
    return [self viewControllerAtIndex:index]; 
} 

EDIT2 前頁是一個的UIViewController包含的UITableView當點擊一個細胞將通過項目以UIPageViewController和所選擇的索引的數組。 currentViewController的用途,因爲我有字體大小和當前視圖背景的控件。 的UIPageViewController父的UIViewController 這裏是viewControllerAtIndex的代碼:

- (NewsDetailVC *)viewControllerAtIndex:(NSUInteger)index { 

    NewsDetailVC *childViewController = [[UIStoryboard storyboardWithName:@"Main_iPhone" bundle:nil] instantiateViewControllerWithIdentifier:@"NewsDetailVC"]; 
    childViewController.index = index; 
    childViewController.selectedNews = [self.newsList objectAtIndex:index ]; 
    childViewController.selectedCategory = self.selectedCategory; 
    return childViewController; 
} 
+0

你應該添加你的'UIPageViewController'的實現(尤其是'viewControllerAfterViewController'和'viewControllerBeforeViewController') – longilong 2014-11-25 18:49:22

+0

@longilong我編輯了這篇文章。 – Ammar 2014-11-25 20:33:42

+0

你能否實現委託方法pageViewController:willTransitionToViewControllers:在調用時會說入日誌。然後嘗試與ScrollView進行交互,並查看該方法是否被調用。想知道手勢是否在視圖中造成混亂 – 2014-11-28 12:26:04

回答

1

我有UIPageViewController有同樣的問題。

看起來像viewControllerAtIndex中顯示的索引是不是很準確。

正如上面評論中提到的其他人一樣,在這些情況下,您應該實現委託方法pageViewController:willTransitionToViewControllers

在這種方法中,你應該做你的工作:

- (void)pageViewController:(UIPageViewController *)pageViewController 
willTransitionToViewControllers:(NSArray *)pendingViewControllers { 

    if ([pendingViewControllers count] > 0) { 
     NSUInteger index = [(PageContentViewController *) 
     [pendingViewControllers objectAtIndex:0] pageIndex]; 

    if (index == [yourArray count] - 1 || index == 0) { 
     [self loadContent]; 
    } else { 
     [self doOtherStuff]; 
    } 
    } 
} 

不知何故,* viewControllerAtIndex *被稱爲幾次,有問題的時候發現了指數,但這種方法的指數應該是準確的。

希望它有幫助!