Речь идет о приложении для 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] Спасибо за помощь. Ура,
Бен