Создание подкласса MKAnnotationView и переопределение setDragState

Речь идет о приложении для iPhone, использующем MKMapKit:

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

- (void) movePinUpFinished {

     [super setDragState:MKAnnotationViewDragStateDragging];
     [self setDragState:MKAnnotationViewDragStateDragging];
}

- (void) setDragState:(MKAnnotationViewDragState) myState {
     if (myState == MKAnnotationViewDragStateStarting) {
          NSLog(@"starting");
          CGPoint endPoint = CGPointMake(self.center.x,self.center.y-20);
          self.center = endPoint;
          [self movePinUpFinished];
     }
     if (myState == MKAnnotationViewDragStateEnding) {
          NSLog(@"ending");
          [super setDragState:MKAnnotationViewDragStateEnding];
          [self setDragState:MKAnnotationViewDragStateNone];
          [super setDragState:MKAnnotationViewDragStateNone];
     }
     if (myState == MKAnnotationViewDragStateDragging) {
          NSLog(@"dragging");
     }
     if (myState == MKAnnotationViewDragStateCanceling) {
          NSLog(@"cancel");
     }
     if (myState == MKAnnotationViewDragStateNone) {
          NSLog(@"none");
     }
}

Все работает нормально, аннотация немного перемещается вверх, ее можно перетаскивать, и когда я отпустите аннотацию, отображение карты получит "dragstateending".

Но теперь я хочу, чтобы анимация запускалась в течение определенного периода времени, и изменил dragStateStarting на следующее:

if (myState == MKAnnotationViewDragStateStarting) {
          NSLog(@"starting");
          CGPoint endPoint = CGPointMake(self.center.x,self.center.y-20);
          [UIView animateWithDuration:1.0
           animations:^{ self.center = endPoint; }
           completion:^(BOOL finished){ [self movePinUpFinished]; }];
     }

Анимация запускается по желанию в течение секунды и аннотация перетаскивается. Но когда я отпускаю аннотацию, mapview не получает окончание через делегат. Я также понял, что когда я делаю анимацию с помощью «UIView animateWithDuration ...» заключается в том, что сразу после начала перетаскивания, при запуске анимации, открывается баллон аннотации. Когда я устанавливаю новый центр без анимации, воздушный шар остается закрытым и открывается только после завершения перетаскивания путем отпускания аннотации.

Что я делаю не так? Это правильный способ переопределить setDragState. Неужели надо называть суперкласс? Но без установки состояния перетаскивания в суперклассе мой mapview не реализовал изменения состояния перетаскивания.

Мне интересно узнать об исходной реализации MKPinAnnotationView, но поскольку это внутренний класс, я не смог найти описание метода setDragState.

12118] Спасибо за помощь. Ура,

Бен

9
задан Ben Zwak 9 September 2010 в 13:49
поделиться