2

注釈に独自のカスタム ピン イメージを使用するのは非常に簡単だと考えました。

しかし、私はそれを機能させることができませんでした。その理由はわかりません!

私は単に使用しています:

- (MKAnnotationView *)mapView:(MKMapView *)mapView viewForAnnotation:(id<MKAnnotation>)annotation
{
    if([annotation isKindOfClass:[MKUserLocation class]])
        return nil;

    NSString *annotationIdentifier = @"CustomViewAnnotation";
    CustomAnnotationView * customAnnotationView = (CustomAnnotationView *) [self.mapview dequeueReusableAnnotationViewWithIdentifier:annotationIdentifier];
    if(!customAnnotationView)
    {
        customAnnotationView=[[CustomAnnotationView alloc] initWithAnnotationWithImage:annotation
                                                                       reuseIdentifier:annotationIdentifier 
                                                                   annotationViewImage:[UIImage imageNamed:@"map_location_pin.png"]];
    }

    customAnnotationView.image=[UIImage imageNamed:@"map_location_pin.png"];

    customAnnotationView.canShowCallout= YES;

    return customAnnotationView;
}

UIImageが必要なものであるため、これは機能するはずであり、プロジェクトに.pngファイルがあります。

私の画像は一切使用せず、標準の赤いピンのみを使用します。ここで何が間違っていますか?

4

3 に答える 3

6

いくつかの考え:

  1. あなたのdelegateためにあなたを定義しましたMKMapViewか?あなたが呼び出されNSLogていることを確認するために、ブレークポイントまたはここに配置しましたか?viewForAnnotation

  2. インターフェイス/実装の詳細を共有していませんが、そこで特別なことをしていない限りCustomAnnotationView、サブクラス化する必要はありません。MKAnnotationView画像を置き換えるだけの場合は、次のことができます。

    - (MKAnnotationView *)mapView:(MKMapView *)mapView viewForAnnotation:(id<MKAnnotation>)annotation
    {
        if([annotation isKindOfClass:[MKUserLocation class]]) {
            return nil;
        }
    
        NSString *annotationIdentifier = @"CustomViewAnnotation";
        MKAnnotationView* annotationView = [mapview dequeueReusableAnnotationViewWithIdentifier:annotationIdentifier];
    
        if (annotationView) {
            annotationView.annotation = annotation;
        } else {
            annotationView = [[MKAnnotationView alloc] initWithAnnotation:annotation reuseIdentifier:annotationIdentifier];
        }
    
        annotationView.image = [UIImage imageNamed:@"map_location_pin.png"];
        annotationView.canShowCallout= YES;
    
        return annotationView;
    }
    

    ただし、明らかに、何か興味深いこと (ピンをドラッグまたはドロップしたときのカスタム アノテーションなど) を行う場合は、先に進んでCustomAnnotationViewサブクラスを作成してくださいMKAnnotationView。それはあなたが何をしようとしているのかにかかっています。

  3. 元の質問とは関係ありませんが、次のことをお勧めします。

    • メソッドがクラス プロパティを参照するのではなくviewForAnnotation、ローカル変数を使用するだけであること(それらは間違いなく同じですが)、mapViewself.mapView

    • カスタム init メソッドの名前を変更することを検討していること。したがって、代わりに:

      customAnnotationView = [[CustomAnnotationView alloc] initWithAnnotationWithImage:annotation
                                                                       reuseIdentifier:annotationIdentifier 
                                                                   annotationViewImage:[UIImage imageNamed:@"map_location_pin.png"]];
      

      次のようなことをします:

      customAnnotationView = [[CustomAnnotationView alloc] initWithAnnotation:annotation
                                                              reuseIdentifier:annotationIdentifier 
                                                                        image:[UIImage imageNamed:@"map_location_pin.png"]];
      

CustomAnnotationViewそれでも問題が解決しない場合は、コードの一部を私たちと共有してください。

于 2013-03-12T15:30:46.467 に答える
2

私はそれがあなたへのサポートだと思います.このコードを試してみてください.そして、私の注釈.hと.mファイルを追加して、いくつかの変更を加えることができます.私の注釈

私の注釈.h

   #import <Foundation/Foundation.h>
    #import <MapKit/MapKit.h>

    @interface MyAnnotation : NSObject<MKAnnotation> {

        CLLocationCoordinate2D  coordinate;
        NSString*               title;
        NSString*               subtitle;
        UIImage*                image;
    }

    @property (nonatomic, assign)   CLLocationCoordinate2D  coordinate;
    @property (nonatomic, copy)     NSString*               title;
    @property (nonatomic, copy)     NSString*               subtitle;
    @property (nonatomic, retain)       UIImage*                image;

    @end


my annotation.m


        #import "MyAnnotation.h"


    @implementation MyAnnotation

    @synthesize title;
    @synthesize subtitle;
    @synthesize coordinate;
    @synthesize image;
    - (void)dealloc 
    {
        [super dealloc];
        self.title = nil;
        self.subtitle = nil;
        self.image=nil;
    }
    @end





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

    {

        //NSLog(@"welcome into the map view annotation");

        // if it's the user location, just return nil.

        if ([annotation isKindOfClass:[MKUserLocation class]])

            return nil;

        // try to dequeue an existing pin view first
        static NSString* AnnotationIdentifier = @"AnnotationIdentifier";

        MKPinAnnotationView* pinView = [[[MKPinAnnotationView alloc] initWithAnnotation:annotation reuseIdentifier:AnnotationIdentifier]autorelease];

        //annotation.image = [UIImage imageNamed:@"shop-1.png"];

        //[pinView setImage:[UIImage imageNamed:@"shop-1.png"]];

        UIImageView *thumbnailImageView = [[UIImageView alloc] initWithImage:((MyAnnotation *)annotation).image];
        CGRect newBounds = CGRectMake(0.0, 0.0, 32.0, 32.0);
        [thumbnailImageView setBounds:newBounds];
        pinView.leftCalloutAccessoryView = thumbnailImageView;
        [thumbnailImageView release];

        //UIImageView *profileIconView = [[UIImageView alloc] initWithImage:featuredDealcouponImage1];
        // [pinView setImage:featuredDealcouponImage1];
        pinView.animatesDrop=NO;

        pinView.canShowCallout=YES;

        pinView.pinColor=MKPinAnnotationColorGreen;

        UIButton* rightButton = [UIButton buttonWithType:UIButtonTypeDetailDisclosure];

        [rightButton setTitle:annotation.title forState:UIControlStateNormal];

        [rightButton addTarget:self action:@selector(_annotation_btn_click:) forControlEvents:UIControlEventTouchUpInside];

        pinView.rightCalloutAccessoryView = rightButton;




        return pinView;

    }
于 2013-03-12T13:13:31.450 に答える
0

サブクラス化されていることを確認してください

NSObject <MKAnnotation> 

ではなく

MKPinAnnotationView
于 2013-03-12T14:11:09.363 に答える