Проблема с аннотирования Просмотров исчезая на двойное нажатие зумом

голоса
1

Я столкнулся с проблемой, с видом аннотаций в MapKit на iPhone. Я не смог сделать вид на пользовательских аннотаций на карте - нет проблем там. Я даже умудряюсь перерисовывать после перетаскивания или масштабирования. Однако, бывают случаи, когда перекройка не работает: примером может быть двойное нажатие масштабирования.

Я придаю некоторый код, где я рисую несколько прямоугольников в определенных местах на карте, и когда я масштаб, используя два пальца жест, все работает отлично (т.е. прямоугольники перерисовываются). Однако, когда я дважды нажмите, прямоугольники исчезают. Что еще более странно, что все методы вызываются в том порядке, что они должны, и в конце концов, даже DrawRect вызывается - но прямоугольники не рисуется.

Так вот код, пожалуйста, попробуйте сами - два пальца масштабирования работает, но двойное нажатие трансфокации не делает:

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

Любая помощь приветствуется. Вот архивный проект: ссылка

Задан 03/10/2009 в 06:32
источник пользователем
На других языках...                            


1 ответов

голоса
0

Имейте в виду, что начало фрейма находится в системе координат своего родителя, поэтому установить его в ноль, вероятно, откладывая экран. Я подозреваю, что причина, что когда-либо работает на всех является он получает сброс за вашей спиной в большинстве случаев, но не в тех, где это не удается.

заменить: self.frame = CGRectMake (0,0,40,40);

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

Ответил 28/02/2010 в 00:10
источник пользователем

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