Создание подклассов 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]; }];
     }

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

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

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

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

Бен

Ответы на вопрос(2)

Ваш ответ на вопрос