【问题标题】:iOS 13 UIPanGestureRecognizer selector not called未调用 iOS 13 UIPanGestureRecognizer 选择器
【发布时间】:2020-07-02 10:05:19
【问题描述】:

我遇到了一个问题,即没有调用 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;
}

有什么想法吗?我在早期的 iO​​S 版本(例如 iOS 12.2)中运行了代码,并且运行良好

【问题讨论】:

  • 您很可能对旧 iOS 版本中的源代码有工作的印象,因为它的行为可能符合预期,但从未调用 @selector 函数来处理平移事件。您的值也称为 mapView 但您平移了哪个视图? WKWebView?

标签: ios objective-c selector ios13 uipangesturerecognizer


【解决方案1】:

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

希望这对你有帮助。

【讨论】:

    【解决方案2】:

    我有一些与上述相关的问题/猜测。

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

    希望这可以帮助你。对不起,如果没有。

    【讨论】:

      【解决方案3】:

      WkWebView 的加载内容负责里面的导航,通常使用 javascript 或 webviews 的默认滚动行为来完成。 虽然WKWebView 是从NSView 继承的类,但你可以用它做所有超类所能做的事情。

      所以你可以打电话

      [self.mapview resizeSubviewsWithOldSize:NSZeroSize]; 
      

      或/和

      - (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

      【讨论】:

      • 你的 -(BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldRecognizeSimultaneouslyWithGestureRecognizer:(UIGestureRecognizer *)otherGestureRecognizermethod 是从哪里/在哪里调用和定义的?
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-11-16
      • 2019-12-23
      • 2021-02-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-04-11
      相关资源
      最近更新 更多