问题 UIPageViewController中的UIButton交互


我在我的应用程序中使用UIPageViewController,我想在其中有一些UIButtons,有点像菜单。我遇到的问题是,当我在屏幕边缘附近放置一个UIButton(或任何其他交互元素)并点击它时,而不是应用UIButton操作,会发生什么变化是页面发生变化(因为边缘点击屏幕更改UIPageViewController上的页面)。我想知道是否有办法使UIButton具有比UIPageViewController更高的优先级,这样当我点击按钮时,它会应用相应的操作而不是更改页面。


12930
2017-11-07 13:58


起源



答案:


我带着同样的问题来到这里。斯普利特 链接 有答案。

使您的根视图控制器成为每个的委托 UIPageViewController的手势识别器,然后防止触摸,如果它们发生在任何内部 UIControl

- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceiveTouch:(UITouch *)touch
{
    return ([touch.view isKindOfClass:[UIControl class]] == NO);
}

7
2018-02-15 20:14





UIPageViewController有两个UIGestureRecognizer。您可以通过gestureRecognizers属性访问它们。确定哪一个是UITapGestureRecognizer然后使用 这个。 希望这可以帮助。


4
2017-11-07 20:28



这在IOS6中有用吗? - Septiadi Agus


答案:


我带着同样的问题来到这里。斯普利特 链接 有答案。

使您的根视图控制器成为每个的委托 UIPageViewController的手势识别器,然后防止触摸,如果它们发生在任何内部 UIControl

- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceiveTouch:(UITouch *)touch
{
    return ([touch.view isKindOfClass:[UIControl class]] == NO);
}

7
2018-02-15 20:14





UIPageViewController有两个UIGestureRecognizer。您可以通过gestureRecognizers属性访问它们。确定哪一个是UITapGestureRecognizer然后使用 这个。 希望这可以帮助。


4
2017-11-07 20:28



这在IOS6中有用吗? - Septiadi Agus


对于那些只想复制/粘贴代码的人来说,这是我的:

// I don't want the tap on borders to change the page
-(void) desactivatePageChangerGesture {
     for (UIGestureRecognizer* gestureRecognizer in self.pageViewController.gestureRecognizers) {
        if ([gestureRecognizer isKindOfClass:[UITapGestureRecognizer class]]) {
            gestureRecognizer.enabled = NO;
        }
    }
}

只需在创建UIPageViewController后调用此函数。


2
2017-09-13 11:50



我为这个“喜欢复制粘贴代码的人”添加了+1:D - Dr. ABT


我遇到了同样的问题,并且不确定如何处理UIGestureRecognizer委托方法。这个简短的例子假设你在Xcode 4中使用“基于页面的应用程序”项目类型。这是我做的:

  • RootViewController.h,我确保宣布RootViewController将处理UIGestureRecognizerDelegate协议:

    @interface RootViewController : UIViewController <UIPageViewControllerDelegate, UIGestureRecognizerDelegate>
    
  • RootViewController.m,我将RootViewController指定为UITapGestureRecognizer的委托。这是在结束时完成的 viewDidLoad 方法。我通过迭代每个gestureRecognizer来查看哪个是UITapGestureRecognizer。

    NSEnumerator *gestureLoop = [self.view.gestureRecognizers objectEnumerator];
    id gestureRecognizer;
    while (gestureRecognizer = [gestureLoop nextObject]) {
        if ([gestureRecognizer isKindOfClass:[UITapGestureRecognizer class]]) {
            [(UITapGestureRecognizer *)gestureRecognizer setDelegate:self];
        }
    }
    
  • 最后,我将gestureRecognizer:shouldReceiveTouch方法添加到了底部 RootViewController.m (这是直接从Split的链接复制的):

    - (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceiveTouch:(UITouch *)touch {
        if ([touch.view isKindOfClass:[UIControl class]]) {
            // we touched a button, slider, or other UIControl
            return NO; // ignore the touch
        }
        return YES; // handle the touch
    }
    

1
2018-04-11 20:47





从代码中注释掉这些行

self.view.gestureRecognizers = self.pageViewController.gestureRecognizers;

或者按照Split的说法使用UIGestureRecognizer

希望对你有帮助


1
2018-02-15 09:40





老答案: 如果你的 UIPageViewController 有一个 transitionStyle 的 UIPageViewControllerTransitionStyleScroll 你在iOS 6.0+,然后你不能使用 gestureRecognizer:shouldReceiveTouch: 方法,因为没有办法将委托设置为 self 在...上 gestureRecognizers 以来 pageViewController.gestureRecognizers 将返回零。看到 UIPageViewController在iOS 6中不返回Gesture Recognizers 有关这方面的更多信息。

如果你只是想确定你的 UIPageViewController 将按钮触摸事件传递给UIButton,您可以使用

for (UIScrollView *view in _pageViewController.view.subviews) {
    if ([view isKindOfClass:[UIScrollView class]]) {
        view.delaysContentTouches = NO;
    }
}

如果你有 transitionStyle 的 UIPageViewControllerTransitionStyleScroll 你在iOS 6.0+。

看到 这个答案 关于为什么 delaysContentTouches = NO 某些情况需要 UIButton 在一个 UIScrollView

更新: 在做了一点研究后,看起来如果你的问题是那个问题 UIButton 点击似乎只被调用 有时那么这实际上可能是一个理想的行为 UIScrollView。一个 UIScrollView 使用 delaysContentTouches 用于自动确定用户是否正在尝试滚动或尝试按滚动视图内的按钮的属性。我认为最好不要将此行为更改为默认值 NO 因为如果用户的手指在按钮上方,这样做将导致无法滚动。


0
2017-12-02 19:12





这里没有你拦截UIPageViewController的轻敲手势识别器的解决方案对我有用。我的目标是iOS 8和9。

有效的是覆盖功能 touchesBegantouchesCancelledtouchesMoved,和 touchesEnded 在我的自定义按钮中,它是。的子类 UIControl。然后我只是手动发送 .TouchUpInside 如果触摸在我的自定义按钮的框架内开始和结束,则控制事件。

我没有必要为包含页面视图控制器或包含页面视图控制器的视图控制器做任何特殊操作。


0
2017-10-23 07:24