UIPageViewController等待webView中的计算页面

时间:2014-03-20 14:04:33

标签: ios objective-c webview uipageviewcontroller uiwebviewdelegate

我的项目是一个电子书阅读器(ePub),UIPageViewController包含webViews来显示页面。
页面是通过加载带有chapterFile的webView并计算webView需要在webViewDidFinishLoad中显示的页面来计算的。这将在名为trough webViewDidFinishLoad的委托中的所有chapterFiles中完成,其中下一章将加载到webView中以计算页面。
在某些条件下,例如使用纵向的新textSize从纵向转为横向, pageViewController比分页需要完成要求更快的第二页。
PageViewController正在调用

- (UIViewController *)pageViewController:(UIPageViewController *)pageViewController viewControllerAfterViewController:(UIViewController *)viewController

在这个方法中,我调用另一个方法“goToNextPage”来查看下一页是否是webViews viewPort的移位或者要加载的新chapterFile。
我想要的是“goToNextPage”等待分页待完成。

- (UIViewController *)pageViewController:(UIPageViewController *)pageViewController   viewControllerAfterViewController:(UIViewController *)viewController{
     ...
    //paging is already in progress at this point (if needed )
    //I want goToNextPage to wait for paging to be finished 
    [self goToNextPage];`
     ...
    //loading newViewController with right page
    return newViewController;
}

我不知道如何实现这一点,因为委托调用等待。

1 个答案:

答案 0 :(得分:0)

我参与了一个类似的项目。我们发现有必要在后台计算页面的性能。我们的Web视图大小与放置在UIPageViewController后面的UIPageViewController相同,因此它不可见(将视图设置为隐藏会导致它不显示网页)。然后我们循环遍历计算页数的每个脊椎项目,并保存脊柱项目索引,当前字体大小和页面计数以供稍后使用。在我们的例子中,可以在计算页面(类似于iBooks)时提供一定量的导航,而不会阻止所有导航。

计算完页数后,即使当前页面在加载时尚未完成,您也可以随时显示任何页面所需的所有信息。

如果字体大小或视图大小发生变化,则需要重新计算页数。

另一个选项可能是阻止页面更改,直到当前脊柱项目完成计算页面。您可以通过从pageViewController返回nil来实现这一点:viewControllerAfterViewController:和pageViewController:viewControllerBeforeViewController:直到您的页数返回。页面的计算速度可能足够快,只会出现翻页速度受限的情况。

预先计算所有脊柱物品大小的好处之一是,每次导航多个页面成为可能。

无论你走到哪里,我都建议限制页面翻转 - 如果在UIPageViewController中页面转得太快,我遇到了在setDeviceScaleFactor中崩溃的Web视图的一些问题。如果用户不断地尽快翻页,UIPageViewController将尝试以比设备可以跟上创建和呈现UIWebViews更快的速度请求新的视图控制器。