Xcode UIPageViewController - 如何在转换期间控制行为?

时间:2011-11-22 17:28:56

标签: ios xcode uipageviewcontroller

我一直在Xcode中使用 UIPageController 模板来创建交互式书籍。

在此应用中,每个页面加载后,每个页面都会播放不同的音频文件。

当我点击页面的一个角落时(第一页的音频停止,第二页的音频开始,没有可观察到的重叠),它的效果很好。

当我滑动手指,拖动页面时会出现问题。就像在iBooks上一样,我可以在转换过程中保持页面,看到两个页面,但这会导致两个页面的音频重叠。

最理想的情况是,我希望第一页的音频在转换开始后立即停止,第二页的音频在转换结束后立即开始(页面卷曲到达屏幕的末尾),但是只有其中一个能给我一个好结果。

问题是我找不到添加[audioFromPage stop]和[audioFromPage play]的地方,以便没有重叠。

我尝试将这些行添加到setViewControllers:direction:animated:completion:方法以及 viewControllerAfterViewController viewControllerBeforeViewController 方法,但没有一种方法有效。

你们对如何解决这个问题有任何想法吗?

2 个答案:

答案 0 :(得分:6)

我的某个应用中出现过类似情况。

要在成功转页(任一方向)后启动音频,有一个可选方法可以添加到UIPageViewControllerDelegate中的任何一个类:

- (void)pageViewController:(UIPageViewController *)pageViewController didFinishAnimating:(BOOL)finished previousViewControllers:(NSArray *)previousViewControllers transitionCompleted:(BOOL)completed;

无论何时调用此方法,您都可以向当前[pageViewController.viewControllers objectAtIndex:0]发送一条消息以开始播放它的声音(在我看来,您一次只能呈现一个页面,因此NSArray {{1总是只有一个元素)

同样,你也可以向viewControllers一条消息发送类似的消息,以停止播放其声音。

根据您的要求,这会在页面翻转完成时将声音从一个页面切换到下一个页面,但是[previousViewcontrollers objectAtIndex:0]

没有类似的方法

最安全的方法是定义一个包含audioFromPage stop和start方法的协议,然后让每个viewController(你书中的“页面”)实现这个协议。这样编译器将阻止您意外创建不实现这些方法的页面,并避免运行时崩溃。

答案 1 :(得分:1)

开始和结束页面转换有两种方法:

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

- (void)pageViewController:(UIPageViewController *)pageViewController didFinishAnimating:(BOOL)完成previousViewControllers:(NSArray *)previousViewControllers transitionCompleted:(BOOL)完成