Problème avec des vues d'annotation disparaissant sur zoom double tap

voix
1

Je l'ai rencontré un problème avec des vues d'annotation dans le MapKit sur l'iPhone. Je parviens à dessiner des vues d'annotation personnalisée sur la carte - il pas de problème. Je parviens même à les redessiner après avoir fait glisser ou le zoom. Cependant, il y a des cas où le redécoupage ne fonctionne pas: un exemple serait zoom double tap.

Je joins un code où je dessine quelques rectangles à des endroits précis sur la carte, et quand je zoom à l'aide d'un geste de deux doigts, tout fonctionne très bien (les rectangles sont redessinés). Cependant, quand je double tap, les rectangles disparaissent. Ce qui est encore plus étrange est que toutes les méthodes s'appelés dans l'ordre qu'ils devraient, et à la fin, même le drawRect est appelé - mais les rectangles ne sont pas dessinées.

Alors, voici le code, s'il vous plaît essayer pour vous-même - deux œuvres zoom doigt, mais zooming double tap ne pas:

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

Toute aide est appréciée. Voici le projet compressé: lien

Créé 03/10/2009 à 06:32
source utilisateur
Dans d'autres langues...                            


1 réponses

voix
0

Gardez à l'esprit que l'origine du cadre est dans le système de coordonnées de son parent, donc la mise à zéro est de mettre probablement hors de l'écran. Je soupçonne que la raison pour laquelle cela fonctionne jamais du tout est remis à zéro, il devient derrière votre dos dans la plupart des situations, mais pas dans ceux où elle est défaillante.

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

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

Créé 28/02/2010 à 00:10
source utilisateur

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