未调用 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;
有什么想法吗?我在早期的 iOS 版本(例如 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 *)otherGestureRecognizer
method 是从哪里/在哪里调用和定义的?以上是关于未调用 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 之前工作)