Problem mit Annotation Ansichten verschwinden auf Doppel-Tippen Zoom

stimmen
1

Ich habe auf dem iPhone in der MapKit in ein Problem mit Beschriftungsansichten läuft. Ich schaffe es, um benutzerdefinierte Beschriftungsansichten auf der Karte ziehen - kein Problem da. Ich schaffe es sogar nach dem Ziehen oder Zoomen neu zu zeichnen. Es gibt jedoch Fälle, in denen der Nachzug nicht funktioniert: Ein Beispiel wäre Doppel-Tap Zoom sein.

Ich lege einen Code, wo ich ein paar Rechtecken an bestimmten Orten auf der Karte ziehen, und wenn ich eine Zwei-Finger-Geste Zoom verwendet wird, funktioniert alles einwandfrei (dh die Rechtecken neu gezeichnet sind). Allerdings, wenn ich tippen verdoppeln, verschwinden die Rechtecke. Was ist noch seltsamer ist, dass alle Methoden in der Reihenfolge aufgerufen, dass sie sollten, und am Ende, auch die drawRect wird aufgerufen - aber die Rechtecke sind nicht gezeichnet.

Also hier der Code ist, versuchen Sie es für sich selbst - zwei Finger Werke Zoomen, aber Doppel-Tap Zoomen nicht:

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

Jede Hilfe ist willkommen. Hier ist das RV - Projekt: Link

Veröffentlicht am 03/10/2009 um 06:32
quelle vom benutzer
In anderen Sprachen...                            


1 antworten

stimmen
0

Beachten Sie, dass der Ursprung des Rahmens im System der Mutter koordinieren, so dass es auf Null wahrscheinlich setzt es aus dem Bild. Ich vermute, dass der Grund, warum es überhaupt überhaupt funktioniert, ist die es in den meisten Situationen zurückgesetzt hinter dem Rücken bekommen, aber nicht in denen, wo es versagt.

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

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

Beantwortet am 28/02/2010 um 00:10
quelle vom benutzer

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