Objective c 使用触摸事件的iOS自定义视图

Objective c 使用触摸事件的iOS自定义视图,objective-c,iphone,uiview,uigesturerecognizer,uipageviewcontroller,Objective C,Iphone,Uiview,Uigesturerecognizer,Uipageviewcontroller,我正在实现一个自定义视图来处理图像的编辑(非常特殊的目的),并且我一直在处理触摸事件 根据我覆盖触摸开始、触摸移动、触摸结束和触摸取消并实现它们后的逻辑,因此如果触摸击中目标(视图的一部分),我正在处理事件,而\u不调用[超级触摸XXX]事件不应传递给其父级ui响应者 但是,我的视图位于UIPageViewController上,触摸事件运行良好,但出于某种原因,UIPageViewController也会始终接收事件,并通过滑动手势接管,这使我无法执行需要移动触摸的操作,因为每次触摸都会水平移

我正在实现一个自定义视图来处理图像的编辑(非常特殊的目的),并且我一直在处理触摸事件

根据我覆盖
触摸开始
触摸移动
触摸结束
触摸取消
并实现它们后的逻辑,因此如果触摸击中目标(视图的一部分),我正在处理事件,而\u不调用
[超级触摸XXX]
事件不应传递给其父级
ui响应者

但是,我的视图位于
UIPageViewController
上,触摸事件运行良好,但出于某种原因,
UIPageViewController
也会始终接收事件,并通过滑动手势接管,这使我无法执行需要移动触摸的操作,因为每次触摸都会水平移动
UIPageViewController
将其识别为滑动

所以基本上我的代码如下:

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {
    if([self withinBounds:touches]) {
        //do own stuff
    } else {
        [super touchesBegan:touches withEvent:event];
    }
}
我已经完成了调试打印,在我做水平移动之前,一切都很完美,它从不调用super的touchesBegind或touchesMoved或其他任何东西,但手势被激活了

我还尝试通过设置自定义
UIgestureRecognitizer
delegate来覆盖该手势,该委托在shouldReceiveTouch方法上始终返回NO,但滑动手势仍在继续


另外,如果有必要的话,我的目标平台是iOS 8.1,我正在模拟器上运行该应用程序

没有简单的方法通过scrollview或继承自它的类来实现这一点。这两个手势完全相同,scrollview的第一个镜头显然在视图层次结构中更高

要么不要使用pageviewcontroller,要么创建更复杂的触摸逻辑


例如,您可以检查是否长按要编辑的图像。如果长按,则禁用scrollview的用户交互,处理图像的移动,然后启用交互。

您可以在要跟踪的任何触摸事件期间禁用UIPageViewController手势识别器

自定义视图将保留对UIPageViewController手势识别器的引用。然后,它只需禁用
-touchsbegind:
中的手势,然后重新启用
-touchscancelled:
-touchsended:
中的手势

例如:

然后,您可以将
UIPageViewController.GestureRecognitors
分配给视图的
覆盖手势
属性


或者,如果要将UIPageViewController的手势限制在屏幕的特定区域,请在屏幕的所需区域放置一个空UIView,并将UIPageViewController的手势附加到该视图。

逻辑非常简单,但问题是,如何禁用滚动视图的用户交互?我的意思是,如果我在scroll视图的委托的shouldReceiveTouch上返回NO,它仍然接收事件并执行它的操作。UIScrollView继承了UIView。所以,是的,您可以将他设置为在运行时使其无响应。那么
辞职FirstResponder
或类似的东西呢?iOS应用程序分别积极使用责任链模式处理事件和触摸事件。
@interface MyView : UIView
@property (nonatomic, copy) NSArray* overriddenGestures;
@end

@implementation MyView
- (void)setGesturesEnabled:(BOOL)enabled
{
    for (UIGestureRecognizer* gr in _overriddenGestures)
    {
        gr.enabled = enabled;
    }
}

- (void)touchesBegan:(NSSet*)touches withEvent:(UIEvent*)event
{
    NSLog(@"BEGIN: %@", event);
    [self setGesturesEnabled:NO];
}

- (void)touchesCancelled:(NSSet*)touches withEvent:(UIEvent*)event
{
    NSLog(@"CANCEL: %@", event);
    [self setGesturesEnabled:YES];
}

- (void)touchesEnded:(NSSet*)touches withEvent:(UIEvent*)event
{
    NSLog(@"END: %@", event);
    [self setGesturesEnabled:YES];
}

- (void)touchesMoved:(NSSet*)touches withEvent:(UIEvent*)event
{
    NSLog(@"MOVE: %@", event);
}
@end