登陆 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];
我正在拦截自定义 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];