Это приложение для 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.
Спасибо за помощь. Cheers,
Ben