Problema cu adnotare Vizualizari dispar de pe zoom dublu robinet

voturi
1

Am fugit într-o problemă cu vederi de adnotare în MapKit pe iPhone. Am reușit să atragă opinii personalizate de adnotare pe hartă - nici o problema acolo. chiar am reușit să le redesena după tragerea sau zoom. Cu toate acestea, există cazuri în care retrasarea nu funcționează: un exemplu ar fi zoom dublu-robinet.

Am atașați un cod în cazul în care am trage cateva dreptunghiuri la anumite locații de pe hartă, iar când am zoom, folosind un gest cu două degete, totul merge bine (de exemplu, dreptunghiurile sunt redesenat). Cu toate acestea, atunci când am atingeți de două ori, dreptunghiurile dispar. Ce e mai ciudat este faptul că toate metodele apelate în ordinea în care acestea ar trebui, și în cele din urmă, chiar drawRect devine numit - dar dreptunghiurile nu sunt desenate.

Deci, aici este codul, vă rugăm să încercați pentru tine - cu două degete zoom lucrări, dar apăsați de două ori zoom-ul nu:

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

Orice ajutor este apreciat. Iată proiectul arhivat: link -

Întrebat 03/10/2009 la 06:32
sursa de către utilizator
În alte limbi...                            


1 răspunsuri

voturi
0

Rețineți că originea cadrului este în sistemul de coordonate al părintelui său, astfel că setarea la zero este, probabil, l pune pe ecran. Bănuiesc că motivul pentru care funcționează vreodată la toate este că devine resetare la spate în cele mai multe situații, dar nu și în cele în care este lipsa.

înlocuiți: self.frame = CGRectMake (0,0,40,40);

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

Publicat 28/02/2010 la 00:10
sursa de către utilizator

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