ios - 自定义 MapKit 注释滞后

标签 ios objective-c mkmapview mapkit

我正在显示一个简单的 MKMapView 来显示用户位置附近发现的地点的集合。获得结果后,我将添加自定义注释 View ,假设类 MyAnnotationView 到 map 。

这些自定义 View 显示得很好,而且我已经消除了所有 复杂的处理程序以获得非常漂亮的 UI。就像大多数人假设(或希望......)一样,在触摸我的一个标记时,会弹出一个单独的(和自定义的)MKAnnotationView 以显示更多详细信息。这个自定义 View 有更多关于找到的位置的细节,有几个用户可以与之交互的按钮。交互不是这里的问题(幸好克服了这个障碍)。

我的问题是,无论出于何种原因,TouchDownTouchUpInside 事件调用之间似乎有一点“滞后” ,大约延迟 ~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/

相关文章:

ios - 屏幕中不同的节点位置和值

objective-c - 使用 Testflight 不接收崩溃

ios - 将 MKPolygon 带到前面

ios - MKMapView 自动缩小动画

ios - 当我搜索一个地方时,它会掉落一个 pin mapView

android - 技术行业的开发人员是否普遍认为混合移动应用程序不如原生应用程序?

ios - UITableView动态高度始终为0

iOS - 界面设计、图像或自定义绘图?

objective-c - iOS - 从 cell.textLabel.frame 获取 CGRect

ios - 不调用 UICollectionView 的 cellForItemAtIndexPath(不使用 Storyboard)