大家好,并预先感谢=)

我怀疑与MKMapView和MKAnnotationView有关。我需要在MKMapView上显示带有自定义图像的注释。为此,并按照一些教程和其他stackoverflow答案,我创建了自己的类。 EDAnnotation.h:

@interface EDAnnotation : MKAnnotationView
    //@property (nonatomic, strong) UIImageView *imageView;
    - (id)initWithAnnotation:(id <MKAnnotation>)annotation reuseIdentifier:(NSString *)reuseIdentifier;
@end

EDAnnotation.m:
#import "EDAnnotation.h"

@implementation EDAnnotation
    - (id)initWithAnnotation:(id <MKAnnotation>)annotation reuseIdentifier:(NSString *)reuseIdentifier{

        self = [super initWithAnnotation:annotation reuseIdentifier:reuseIdentifier];

        if (self != nil) {

            CGRect frame = self.frame;
            frame.size = CGSizeMake(15.0, 15.0);
            self.frame = frame;
            self.backgroundColor = [UIColor clearColor];
            self.centerOffset = CGPointMake(-5, -5);
        }
        return self;
    }

    -(void) drawRect:(CGRect)rect {

        NSMutableParagraphStyle *style = [[NSParagraphStyle defaultParagraphStyle] mutableCopy];
        [style setAlignment:NSTextAlignmentCenter];
        [[UIImage imageNamed:@"train4_transparent.png"] drawInRect:CGRectMake(0, 0, 15, 15)];
    }
@end

我已经在 map 中添加了一些注释,一切都按预期工作。每当我点击图像时,都会显示一个气泡,显示一些信息。问题是我需要能够检测到其中一个注解的长按手势(除了显示气泡的轻击手势之外)。为此,我尝试将UILongGestureRecognizer添加到几乎所有可能的方法中:
  • UIImageView在上面的类中进行了注释。
  • 在viewForAnnotation回调中使用(EDAnnotation *) [mapView dequeueReusableAnnotationViewWithIdentifier:identifier];检索的“EDAnnotationView”实例。我什至尝试使该实例可拖动,并监听didChangeDragState调用,以便在触发MKAnnotationViewDragStateStarting时立即取消它们,但这也没有按预期工作。

  • 基本上我需要的是:
  • (如果用户将气泡显示在drawRectEDAnnotation方法中指定的图像上)。
  • 如果用户长按drawRectEDAnnotation方法中指定的图像,则
  • 会收到一个回调,该回调使我可以向 map 添加新的MKPointAnnotation。

  • 预先感谢您的帮助=)

    最佳答案

    问题还可能是您的gestureRecognizer与mapView中的gestureRecognizers冲突。可能会发生这种情况,因为注解视图是mapView的子视图。要解决此问题,请使用UIGestureRecognizerDelegate。初始化手手势手势时,请将委托属性设置为实现该协议的类,更确切地说,这两个方法是:

    #pragma mark GestureRecognizerDelegate
    -(BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldRecognizeSimultaneouslyWithGestureRecognizer:(UIGestureRecognizer *)otherGestureRecognizer{
        return YES;
    }
    
    -(BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceiveTouch:(UITouch *)touch{
        return YES;
    }
    

    在这两种方法中,只要轻松返回YES,手势响应器就会做出反应。也许来自mapView的其他gestureRecognizer也可以触发其动作,但是不幸的是,无法委托mapView的poseRecognizers。

    当我向 map 视图添加longPressureRecognizer时,此解决方法对我有所帮助。我认为它也可以帮助您解决问题。

    关于ios - iOS MKAnnotationView LongPressGestureRecognizer,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/29156586/

    10-13 04:49