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