Probleem met annotatie Bekeken verdwijnen op dubbele tik zoom

stemmen
1

Ik liep in een probleem met uitzicht op aantekening in de MapKit op de iPhone. Ik beheren om aangepaste weergaven aantekening op de kaart te trekken - geen probleem daar. Ik heb zelfs in slagen om hen opnieuw te tekenen na het slepen of zoomen. Echter, er zijn gevallen waarin de herindeling niet werkt: een voorbeeld zou double-tap zoom zijn.

Ik hecht een code waar ik een paar rechthoeken op specifieke locaties op de kaart te trekken, en toen ik zoom met behulp van een twee-vinger gebaar, alles werkt prima (dat wil zeggen de rechthoeken zijn hertekend). Echter, toen ik het dubbele van de tap, de rechthoeken verdwijnen. Wat nog vreemder is dat alle methoden gecalled in de volgorde waarin ze moeten, en op het einde, krijgt zelfs de drawRect genoemd - maar de rechthoeken worden niet getekend.

Dus hier is de code, probeer voor jezelf - twee vingers inzoomen werkt, maar dubbel-tap zoomen niet:

PlaygroundViewController.h

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

@interface PlaygroundViewController : UIViewController <MKMapViewDelegate>{
 MKMapView *mapView_;
 NSMutableDictionary* myViews_;
}

@end

PlaygroundViewController.m

#import PlaygroundViewController.h
#import Territory.h
#import TerritoryView.h

@implementation PlaygroundViewController

- (void)viewDidLoad {
    [super viewDidLoad];
 mapView_=[[MKMapView alloc] initWithFrame:self.view.bounds];
 [self.view insertSubview:mapView_ atIndex:0];
 mapView_.delegate = self;
 [mapView_ setMapType:MKMapTypeStandard];
    [mapView_ setZoomEnabled:YES];
    [mapView_ setScrollEnabled:YES];
 myViews_ = [[NSMutableDictionary alloc] init];
 for (int i = 0; i < 10; i++ ) {
  Territory *territory;
  territory = [[[Territory alloc] init] autorelease];
     territory.latitude_ = 40 + i;
  territory.longitude_ = -122 + i;
  [mapView_ addAnnotation:territory];

 }
}

- (MKAnnotationView *)mapView:(MKMapView *)mapView viewForAnnotation:(id <MKAnnotation>)annotation {
 MKAnnotationView* territoryView = (MKAnnotationView*)[mapView dequeueReusableAnnotationViewWithIdentifier:@Territory];
 if (!territoryView){
  territoryView = [[[TerritoryView alloc] initWithAnnotation:annotation reuseIdentifier:@Territory] autorelease];
  Territory* currentTerritory = (Territory*) annotation;
  [myViews_ setObject:territoryView forKey:currentTerritory.territoryID_];
 }  
    else{
  territoryView.annotation = annotation;
 }  
 return territoryView; 
}

- (void)mapView:(MKMapView *)mapView regionDidChangeAnimated:(BOOL)animated {
 for (NSObject* key in [myViews_ allKeys]) {
  TerritoryView* territoryView = [myViews_ objectForKey:key];
  [territoryView initRedraw];
 }
}

- (void)didReceiveMemoryWarning {
    [super didReceiveMemoryWarning];
}

- (void)dealloc {
    [super dealloc];
}

Territory.h

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


@interface Territory : NSObject <MKAnnotation> {
 float latitude_;
 float longitude_;
 NSString* territoryID_;
}

@property (nonatomic) float latitude_;
@property (nonatomic) float longitude_;
@property (nonatomic, retain) NSString* territoryID_;


@end

Territory.m

#import Territory.h

@implementation Territory

@synthesize latitude_;
@synthesize longitude_;
@synthesize territoryID_;


- (CLLocationCoordinate2D)coordinate {
 CLLocationCoordinate2D coord_ = {self.latitude_, self.longitude_};
 return coord_;
}

-(id) init {
 if (self = [super init]) {
  self.territoryID_ = [NSString stringWithFormat:@%p, self];
 }
 return self;
}


@end

TerritoryView.h

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

@interface TerritoryView : MKAnnotationView {

}

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

@end

TerritoryView.m

#import TerritoryView.h

@implementation TerritoryView

- (id)initWithAnnotation:(id <MKAnnotation>)annotation reuseIdentifier:(NSString *)reuseIdentifier {
    if ([super initWithAnnotation:annotation reuseIdentifier:@Territory]) {
  self.initRedraw;
    }
    return self;
}

- (void)initRedraw {
 self.frame = CGRectMake(0,0,40,40);
 [self setNeedsDisplay];
}

- (void)drawRect:(CGRect)rect {
 NSLog(@in draw rect);
}

@end

Alle hulp wordt gewaardeerd. Hier is het gezipte project: koppeling

De vraag is gesteld op 03/10/2009 om 06:32
bron van user
In andere talen...                            


1 antwoorden

stemmen
0

Houd in gedachten dat de oorsprong van het frame is in het coördinatensysteem van de bovenliggende, zo in te stellen op nul is waarschijnlijk het uitstellen scherm. Ik vermoed dat de reden waarom het ooit al werkt is het het steeds reset achter je rug in de meeste situaties, maar niet in die waar het falen.

vervanging: self.frame = CGRectMake (0,0,40,40);

met: self.frame = CGRectMake (self.frame.origin.x, self.frame.origin.y, 40,40);

antwoordde op 28/02/2010 om 00:10
bron van user

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more