未调用 iOS 13 UIPanGestureRecognizer 选择器

Posted

技术标签:

【中文标题】未调用 iOS 13 UIPanGestureRecognizer 选择器【英文标题】:iOS 13 UIPanGestureRecognizer selector not called 【发布时间】: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? 【参考方案1】:

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

希望这对你有帮助。

【讨论】:

【参考方案2】:

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

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

以上是关于未调用 iOS 13 UIPanGestureRecognizer 选择器的主要内容,如果未能解决你的问题,请参考以下文章

在 iOS 13 设备中未调用 viewForSupplementaryElementOfKind

IOS13:选择保存照片后未调用 UIActivityViewController.completionWithItemsHandler

iOS 布局在 Xcode 11 上的 iOS 13 上中断 - 未调用 traitCollectionDidChange

未调用 iOS 13 缩略图扩展 (QLThumbnailProvider)

Xamarin.iOS SKProductRequest 事件未在 Debug 中调用(在 iOS 15 和 xCode 13 之前工作)

未调用 iOS 推送通知服务扩展 (didReceive)