我正在显示一个简单的 MKMapView
来显示用户位置附近发现的地点的集合。获得结果后,我将添加自定义注释 View ,假设类 MyAnnotationView
到 map 。
这些自定义 View 显示得很好,而且我已经消除了所有 复杂的处理程序以获得非常漂亮的 UI。就像大多数人假设(或希望......)一样,在触摸我的一个标记时,会弹出一个单独的(和自定义的)MKAnnotationView
以显示更多详细信息。这个自定义 View 有更多关于找到的位置的细节,有几个用户可以与之交互的按钮。交互不是这里的问题(幸好克服了这个障碍)。
我的问题是,无论出于何种原因,TouchDown
和 TouchUpInside
事件调用之间似乎有一点“滞后” ,大约延迟 ~0.5 秒以更精确。
我已经检查了仅 TouchDown
事件触发我预期的方法,它几乎立即触发(任何 UIButton 自然产生的微延迟)。
我的猜测是 MKMapView
是罪魁祸首。鉴于它正在拦截/监视许多不同的 UIGestureRecognizer
,我假设该框架在传送我的 TouchUpInside
事件时只是有点“落后”..
不幸的是,假设并不能真正帮助任何人,尤其是当他们没有解决方案时。因此,如果有人对事件处理为何会出现这种延迟有任何想法/解决方法,我很乐意听到。谢谢!
代码引用
这是我的一些代码,可以提供帮助:
自定义注释 View (带按钮).h
#import <UIKit/UIKit.h>
#import "MyAnnotationView.h"
@import MapKit;
@interface MyAnnotationView : MKAnnotationView
.m
#import "MyAnnotationView.h"
@implementation MyAnnotationView {
CGFloat width, height;
}
- (instancetype)initWithFrame:(CGRect)frame {
if (self = [super initWithFrame:frame]) {
width = frame.size.width, height = frame.size.height;
self.contentView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, width, height)];
[self addSubview:self.contentView];
}
return self;
}
添加 View
- (MKAnnotationView *)mapView:(MKMapView *)mapView viewForAnnotation:(id<MKAnnotation>)annotation {
// Here I simply create an annotation, assign it to a new `MyAnnotationView`
// and add the view.
MyAnnotationView *view = [[MyAnnotationView alloc] init];
...
// Note: the detailButton is just a UIButton
// This lags...
[view.detailButton addTarget:self action:@selector(didTouchCell) forControlEvents:UIControlEventTouchUpInside];
// No lag... hmm
// [view.detailButton addTarget:self action:@selector(didTouchCell) forControlEvents:UIControlEventTouchDown];
}
最佳答案
延迟的原因是 map View 正在等待您是否要双击放大。即使双击注释, map 仍会放大。您可以删除如果您不介意通过从 View 层次结构中删除双击手势来进行双击缩放,则可以延迟。
- (void)removeDoubleTapGestures:(UIView *)view {
NSArray *gestureRecognizers = [view gestureRecognizers];
for (UIGestureRecognizer *recognizer in gestureRecognizers) {
if ([recognizer isKindOfClass:[UITapGestureRecognizer class]] &&
[(UITapGestureRecognizer *)recognizer numberOfTapsRequired] == 2) {
[view removeGestureRecognizer:recognizer];
}
}
for (UIView *subview in view.subviews) {
[self removeDoubleTapGestures:subview];
}
}
在您的 viewDidLoad
调用中:
[self removeDoubleTapGestures:myMapView];
请记住,尽管您正在修改 MKMapView
的 View 层次结构,因此如果 Apple 将来更改内容,它可能会停止工作。
关于ios - 自定义 MapKit 注释滞后,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43858242/