0

我需要将自定义注释视图放到 mapview 中,并且它们需要是可点击的。我需要而不是经典的标注,我将点击注释,它会执行一些功能。

我尝试了很多事情,但仍然没有实现。

4

2 回答 2

2

我为您找到了一个非常好的实现:

http://blog.asolutions.com/2010/09/building-custom-map-annotation-callouts-part-1/

在那里您可以使用操作向 calloutView 添加按钮

或者..

在 mapView 委托中,您可以自定义注释和标注视图:

viewForAnnotation:返回与指定注释对象关联的注释视图(如果有)。

  • (MKAnnotationView *)viewForAnnotation:(id < MKAnnotation >)annotation

有一个例子:

- (MKAnnotationView *)mapView:(MKMapView *)mapView viewForAnnotation:(id <MKAnnotation>)annotation
{   
    MKAnnotationView *annotationView = [[MKPinAnnotationView alloc] initWithAnnotation:annotation reuseIdentifier:@"loc"];

    // Button
    UIButton *button = [UIButton buttonWithType:UIButtonTypeDetailDisclosure];
    button.frame = CGRectMake(0, 0, 23, 23);
    annotationView.rightCalloutAccessoryView = button;

    // Image and two labels
    UIView *leftCAV = [[UIView alloc] initWithFrame:CGRectMake(0,0,23,23)];
    [leftCAV addSubview : yourImageView];
    [leftCAV addSubview : yourFirstLabel];
    [leftCAV addSubview : yourSecondLabel];
    annotationView.leftCalloutAccessoryView = leftCAV;

    annotationView.canShowCallout = YES;

    return annotationView;
}

自定义密码的编辑答案:

创建一个 MKAnnotationView 子类

。H

#import <MapKit/MapKit.h>

@interface AnnotationView : MKAnnotationView

- (id)initWithAnnotation:(id <MKAnnotation>)annotation reuseIdentifier:(NSString *)reuseIdentifier;

@end

.m

#import "AnnotationView.h"

@implementation AnnotationView

{
    NSString *identifier;
}

- (id)initWithAnnotation:(id <MKAnnotation>)annotation reuseIdentifier:(NSString *)reuseIdentifier

{

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

    if (self != nil)

    {

        CGRect frame = self.frame;

        frame.size = CGSizeMake(78.0, 35.0);

        self.frame = frame;

        self.backgroundColor = [UIColor clearColor];

        self.centerOffset = CGPointMake(0, 0);


    }

    return self;

}

-(void) drawRect:(CGRect)rect

{


    [[UIImage imageNamed:@"yourImage"]drawInRect:CGRectMake(0, 0, 78, 35)];


}


@end

然后在 mapview 委托中:

- (MKAnnotationView *)mapView:(MKMapView *)mapView viewForAnnotation:(id <MKAnnotation>)annotation {

    if ([annotation isKindOfClass:[MKUserLocation class]]) {
        return nil;
    }

    if ([annotation isKindOfClass:[Annotation class]]) {

        NSString* annotationIdentifier = @"yourAnnotation";
        AnnotationView* customAnnotationView = (AnnotationView*)[mapView dequeueReusableAnnotationViewWithIdentifier:annotationIdentifier];

        if (!customAnnotationView) {
            customAnnotationView = [[AnnotationView alloc]initWithAnnotation:annotation reuseIdentifier:annotationIdentifier];

            customAnnotationView.canShowCallout = YES;
        }

        else{
            customAnnotationView.annotation= annotation;
        }


        return customAnnotationView;
    }
    return nil;
}

注释类是我的自定义注释类:

@interface Annotation : NSObject <MKAnnotation>

我希望这有帮助

于 2013-09-09T07:23:01.133 回答
0

mapViewDelegate 上有一个方法:viewForMapView。在此方法中,您返回一个视图。您可以完全自定义此视图,例如,您可以向其添加手势识别器以处理除轻击之外的其他手势。

于 2013-09-09T07:04:55.470 回答