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













