自定义MapKit注释滞后

时间:2017-05-08 22:30:35

标签: ios objective-c mkmapview mapkit

我显示一个简单的MKMapView来显示用户位置附近发现的地点的集合。获得结果后,我会在地图中添加自定义注释视图,比如类MyAnnotationView

这些自定义视图显示得非常好,我已经解决了所有错综复杂的处理程序,以获得非常好的用户界面。就像大多数人会假设(或希望......)一样,在触摸我的一个标记时,会弹出一个单独的(和自定义的)MKAnnotationView来显示更多细节。此自定义视图具有关于找到的位置的更多详细信息,用户可以使用多个按钮进行交互。这里的互动不是问题(幸好克服了这个障碍)。

我的问题无论出于何种原因,TouchDownTouchUpInside事件调用之间似乎有一点“滞后”,约为0.5秒延迟更精确。

我已经检查了我的预期方法 TouchDown事件,它几乎立即触发(任何UIButton自然创建的微延迟)。

我的猜测是MKMapView是罪魁祸首。鉴于它正在拦截/监控许多不同的UIGestureRecognizer,我假设框架在提供TouchUpInside事件方面有点“落后”..

不幸的是,假设并没有真正帮助任何人,特别是如果他们没有提供解决方案。因此,如果任何人有任何想法/解决方案,为什么事件处理正在经历这种延迟,我很乐意听到。谢谢!

代码参考

以下是我的一些帮助代码:

自定义注释视图(带按钮).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;

}

添加观看次数

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


}

1 个答案:

答案 0 :(得分:1)

延迟的原因是地图视图正在等待您是否要双击以放大。即使您双击注释,地图仍将放大。您可以删除如果您不想通过从视图层次结构中删除双击手势来解决双击缩放问题,则会延迟。

- (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的视图层次结构,但如果Apple将来改变它,它可能会停止工作。