iOS 13 未调用 UIPanGestureRecognizer 选择器

iOS 13 UIPanGestureRecognizer selector not called

我遇到了一个问题,即没有调用 UIPanGestureRecognizer 选择器。 UIPanGestureRecognizer 被绑定到 WKWebView 及其委托给自身(视图控制器)。

UIPanGestureRecognizer 委托方法已成功调用,但未成功调用选择器方法。

UIPanGestureRecognizer *pan = [[UIPanGestureRecognizer alloc] initWithTarget:self action:@selector(panningMethod:)];

[pan setDelegate:self];

[self.mapView addGestureRecognizer:pan];


-(BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldRecognizeSimultaneouslyWithGestureRecognizer:(UIGestureRecognizer *)otherGestureRecognizer {
    return YES;
}

有什么想法吗?我 运行 早期 iOS 版本中的代码(例如 iOS 12.2)并且它工作得很好

我有几个questions/guesses与上述相关。

  1. 您确定那个平移手势识别器调用了委托方法吗? 您能否将 UIPanGestureRecognizer 保存到 ivar 中并在调试会话期间比较地址?我的意思是来自您的委托方法的 ivar 和手势的地址。
  2. 我不能确定为什么,但是当我没有实现其他委托方法时,我遇到了类似的问题: -(BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceiveTouch:(UITouch *)touch { return YES; }
  3. 如果其他方法都不起作用 - 此解决方案可以帮助您:

希望对您有所帮助。抱歉,如果没有。

WKWebView 可能会抑制手势,在这里找到相关讨论:Can't handle touches simultaneously with WKWebView on iOS 13.4

希望对您有所帮助。

WkWebView 的加载内容负责内部导航,通常通过 javascript 或 webview 的默认滚动行为完成。 虽然 WKWebView 是从 NSView 继承而来的 class,但你可以用它做所有可以用超级 class.

做的事情

所以你可以打电话给

[self.mapview resizeSubviewsWithOldSize:NSZeroSize]; 

or/and

- (BOOL)canBecomeFirstResponder {
  return YES;
}

可以设置。

您还可以明确定义交互的处理方式。 以下示例代码旨在能够关闭 (bool)_cursor 值以停止 wkwebview 的光标交互。

#pragma mark - interaction interception

- (NSView*)hitTest:(NSPoint)point {
    if (_cursor) return [super hitTest:point];
    return nil;
}

- (void)keyDown:(NSEvent *)event {
    [super keyDown:event];
}
- (void)keyUp:(NSEvent *)event {
    [super keyUp:event];
}

-(void)mouseMoved:(NSEvent *)event {
    if (_cursor) [super mouseMoved:event];
}
- (void)mouseDown:(NSEvent *)event {
    if (_cursor) [super mouseDown:event];
}
- (void)mouseUp:(NSEvent *)event {
    if (_cursor) [super mouseUp:event];
}
- (void)mouseDragged:(NSEvent *)event {
    if (_cursor) [super mouseDragged:event];
}
- (void)mouseEntered:(NSEvent *)event {
    if (_cursor) [super mouseEntered:event];
}
- (void)mouseExited:(NSEvent *)event {
    if (_cursor) [super mouseExited:event];
}

但是有一个更简单的方法。 当你实现 NSResponder 协议或对 Views 使用相应的方法时,你不需要 UIPanGestureRecognizer..

-(void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event {
    // do stuff 
    [super touchesBegan:touches withEvent:event];
}
-(void)touchesMoved:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event {
    for (UITouch *touch in touches) {
        // do stuff;
    }
    [super touchesMoved:touches withEvent:event];
}
-(void)touchesEnded:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event {
    for (UITouch *touch in touches) {
        // do stuff;
    }
    [super touchesEnded:touches withEvent:event];
}

最后但同样重要的是.. 以防万一您错过了选择器的定义 您的 WKWebView 需要以下 @implementation

-(void)panningMethod:(UIPanGestureRecognizer *)gesture {
}

通常还有 @interface 定义

-(void)panningMethod:(UIPanGestureRecognizer *)gesture;

最后,您不需要在定义 GestureRecogniser 后调用显式 -setDelegate 方法,除非您打算为 WKWebView.

设置 -navigationDelegate