我一直在Xcode中使用 UIPageController 模板来创建交互式书籍。
在此应用中,每个页面加载后,每个页面都会播放不同的音频文件。
当我点击页面的一个角落时(第一页的音频停止,第二页的音频开始,没有可观察到的重叠),它的效果很好。
当我滑动手指,拖动页面时会出现问题。就像在iBooks上一样,我可以在转换过程中保持页面,看到两个页面,但这会导致两个页面的音频重叠。
最理想的情况是,我希望第一页的音频在转换开始后立即停止,第二页的音频在转换结束后立即开始(页面卷曲到达屏幕的末尾),但是只有其中一个能给我一个好结果。
问题是我找不到添加[audioFromPage stop]和[audioFromPage play]的地方,以便没有重叠。
我尝试将这些行添加到setViewControllers:direction:animated:completion:
方法以及 viewControllerAfterViewController 和 viewControllerBeforeViewController 方法,但没有一种方法有效。
你们对如何解决这个问题有任何想法吗?
答案 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)完成