登陆 MKMapView 的触摸不会发送到 UIApplication 实例

Touches landing in MKMapView are not sent to the UIApplication instance

我正在拦截自定义 UIApplication 子类中的所有事件(用于调试目的):

[super sendEvent:event];
if(event.type == UIEventTypeTouches){
    if(event.allTouches.anyObject.phase == UITouchPhaseBegan){
    //    NSLog(@"Touch began on view %@", event.allTouches.anyObject.view);
    }
}

它适用于任何触摸,无论视图、手势识别器、用户交互等如何。

但是,我有一个 MKMapView 没有接收到任何触摸(启用了用户交互),甚至没有将触摸转发到应用程序实例。换句话说,当我触摸那个特定的 MKMapView 时,应用程序不会调用 sendEvent:

这怎么可能?据我所知,无论我做什么,UIApplication 都应该 总是 sendEvent: 方法上接收触摸。

我错过了什么吗? (我在 iOS 11.4)

我终于解决了这个问题。

我一直根据用户的方向(指南针、倾斜等)为地图制作动画以创建 3D 效果,即使设备是 tilted/moved 一个位,这似乎连续发生:

...
motionManager = [[CMMotionManager alloc] init];
motionManager.deviceMotionUpdateInterval = 0.033;
[motionManager startDeviceMotionUpdatesUsingReferenceFrame:frame
                                                   toQueue:motionQueue
                                               withHandler:
 ^(CMDeviceMotion* motion, NSError* error){
     //update map
 }];
...

在地图更新方法中,我将地图动画化为新的相机数据以在视觉上平滑更新:

[UIView animateWithDuration:0.3 delay:0 options:UIViewAnimationOptionCurveLinear
animations:block completion:nil];

由于持续的动画,视图忽略了触摸输入。

我已将 UIViewAnimationOptionAllowUserInteraction 添加到我的动画选项中,这解决了问题:

[UIView animateWithDuration:0.3 delay:0 options:UIViewAnimationOptionCurveLinear 
| UIViewAnimationOptionAllowUserInteraction animations:block completion:nil];