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

时间:2018-06-14 09:09:00

标签: touch mkmapview uitouch uiresponder

我在我的自定义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上)

1 个答案:

答案 0 :(得分:0)

我终于解决了这个问题。

我不断根据用户的方向(指南针,倾斜等)动画地图,即使设备倾斜/移动一位,也可以创建3D效果,这似乎是连续发生的:

...
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];