【问题标题】:iOS custom view consuming touch eventsiOS 自定义视图消费触摸事件
【发布时间】:2015-03-11 17:12:44
【问题描述】:

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

根据我在覆盖touchesBegantouchesMovedtouchesEndedtouchesCancelled 并实现它们之后的逻辑,因此如果触摸击中目标(视图的一部分),我正在处理事件和 _not_ 调用 [super touchesXXX] 事件不应传递给其父级 UIResponders

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

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

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {
    if([self withinBounds:touches]) {
        //do own stuff
    } else {
        [super touchesBegan:touches withEvent:event];
    }
}

我已经完成了调试打印,一切正常,直到我进行水平移动,它从不调用 super 的 touchesBegan 或 touchesMoved 或任何东西,但手势被激活

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

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

【问题讨论】:

  • resignFirstResponder 或类似的东西怎么样? iOS 应用程序分别积极使用责任链模式来处理事件和触摸事件。

标签: objective-c iphone uiview uigesturerecognizer uipageviewcontroller


【解决方案1】:

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

您的自定义视图将保留对 UIPageViewController 手势识别器的引用。然后它只是禁用-touchesBegan: 中的手势并重新启用-touchesCancelled:-touchesEnded: 中的手势。

例如:

@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

然后,您可以将 UIPageViewController.gestureRecognizers 分配给视图的 overriddenGestures 属性。

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

【讨论】:

    【解决方案2】:

    没有简单的方法可以通过滚动视图或继承自它的类来实现。这两个手势是相同的,并且滚动视图显然第一个镜头在视图层次结构中更高。

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

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

    【讨论】:

    • 逻辑很简单,但问题是,如何禁用滚动视图的用户交互?我的意思是,如果我在滚动视图的委托的 shouldReceiveTouch 上返回 NO,它仍然会接收事件并执行它的操作。
    • 一个 UIScrollView 继承自 UIView。所以,是的,你可以设置他让他在运行时无响应。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-07-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-01-02
    • 2019-03-08
    相关资源
    最近更新 更多