Problemet med Merknads Views forsvinner på dobbelttrykke zoom

stemmer
1

Jeg har kjørte inn i et problem med merknads utsikt i MapKit på iPhone. Jeg klarer å trekke tilpasset kommentar syn på kartet - ikke noe problem der. Jeg selv klarer å tegne dem etter å dra eller zooming. Det finnes imidlertid tilfeller der redrawing ikke fungerer: Et eksempel kan være dobbelttrykk zoom.

Jeg legger noen kode der jeg trekke noen rektangler på bestemte steder på kartet, og når jeg zoom bruker en to finger gest, alt fungerer fint (dvs. rektanglene er tegnes på nytt). Men når jeg dobbelttrykke, rektanglene forsvinne. Hva er enda rarere er at alle metoder blir kalt i den rekkefølgen de skal, og til slutt, blir selv de drawRect kalt - men rektanglene er ikke trukket.

Så her er koden, kan du prøve selv - to finger zooming fungerer, men dobbelttrykke zooming ikke:

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 hjelpe er verdsatt. Her er zippet prosjektet: lenke

Publisert på 03/10/2009 klokken 05:32
kilden bruker
På andre språk...                            


1 svar

stemmer
0

Husk at rammen opprinnelse er i koordinatsystemet av sin overordnede, så sette den til null er trolig å sette den av skjermen. Jeg mistenker at grunnen til at det noen gang fungerer i det hele tatt er det blir nullstilt bak ryggen din i de fleste situasjoner, men ikke i de der det er sviktende.

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

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

Svarte 27/02/2010 kl. 23:10
kilden bruker

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