5

我正在使用 UIPageViewContoller 来创建类似书本的翻页体验。我的书的页面比 iPhone 屏幕的整个宽度窄 18 像素,并且固定在屏幕的左侧。然后将我的 UIPageViewController 视图的框架设置为这些页面的框架大小(宽度:302,高度:460)。我这样做是为了让这本书有多个页面,并且翻页看起来像是从当前可见页面的边缘开始的,就像 iBooks 应用程序中的体验一样。

我遇到的问题是,如果有人试图通过从屏幕的最右侧平移来翻页,超过 302 像素点,则 UIPageViewController 不会捕获平移手势并且不会翻页。我看到很多用户尝试以这种方式翻页,所以我想在不改变 UI 设计的情况下修复这种体验。

我的想法是我可以从 UIPageViewController 之外的区域获取 UIPanGesture 并将其传递给 UIPageViewController。我已经使用作为整个视图背景的图像视图成功捕获了平移手势,但我不知道如何将手势传递给 UIPageViewController 以处理翻页。

- (void) viewDidLoad {
...    

    // Add a swipe gesture recognizer to grab page flip swipes that start from the far right of the screen, past the edge of the book page
    self.panGesture = [[[UIPanGestureRecognizer alloc] initWithTarget:self action:nil] autorelease];
    [self.panGesture setDelegate:self];
    [self.iv_background addGestureRecognizer:self.panGesture];

    //enable gesture events on the background image
    [self.iv_background setUserInteractionEnabled:YES];

...
}


#pragma mark - UIGestureRecognizer Delegates
- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceiveTouch:(UITouch *)touch {
    // test if our control subview is on-screen
    if (self.pageController.view.superview != nil) {
       if (gestureRecognizer == self.panGesture) {
            // we touched background of the BookViewController, pass the pan to the UIPageViewController
            [self.pageController.view touchesBegan:[NSSet setWithObject:touch] withEvent:UIEventTypeTouches];

            return YES; // handle the touch
        }
    }
    return YES; // handle the touch
}
4

1 回答 1

5

UIPageViewController 有一个gestureRecognizers 属性。该文档似乎准确地描述了您正在寻找的内容:

手势识别器

配置为处理用户交互的 UIGestureRecognizer 对象数组。(只读)

@property(nonatomic, readonly) NSArray *gestureRecognizers

讨论

这些手势识别器最初附加到页面视图控制器层次结构中的视图。要更改用户可以使用手势导航的屏幕区域,可以将它们放置在另一个视图上。

可用性

在 iOS 5.0 及更高版本中可用。宣布于

UIPageViewController.h

于 2012-06-07T21:35:34.197 回答