从一个视图传递UIPanGestureRecognizer以由另一个视图处理

时间:2012-02-09 01:31:03

标签: iphone uigesturerecognizer uipageviewcontroller uipangesturerecognizer

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

我遇到的问题是,如果有人试图通过从屏幕的最右侧进行平移来翻页,超过302 px点,则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
}

1 个答案:

答案 0 :(得分:3)

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

  

<强> gestureRecognizers

     

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

     

@property(非原子,只读)NSArray * gestureRecognizers

     

讨论

     

这些手势识别器最初附加到页面中的视图   查看控制器的层次结构。 更改屏幕区域   用户可以使用手势导航,他们可以放置   另一种观点。

     

状况

     

适用于iOS 5.0及更高版本。声明在

     

UIPageViewController.h