2017-01-19 3 views
5

Я реализую ту же функциональность, что и Uber iOS приложение для перемещения булавки в соответствии с маршрутом с анимацией.iOS: показать вид выноски на движущийся вывод

Вопросы: Когда я нажимаю на штыре в то время как он движется, то я не в состоянии получить didSelectAnnotationView делегат MKMapView. Но когда штифт устойчив, значит, он не движется, тогда он называется.

Код: Создать булавку

-(MKAnnotationView*)mapView:(MKMapView*)mapView viewForAnnotation:(id<MKAnnotation>)annotation { 

    if([annotation isKindOfClass:[MKUserLocation class]]) 
     return nil; 

    else { 

     NSString *annotationIdentifier = @"CustomViewAnnotation"; 

     AnnotationView * annotationView = (AnnotationView *)[mapView dequeueReusableAnnotationViewWithIdentifier:annotationIdentifier]; 

     if(annotationView == nil) { 

      annotationView = [[AnnotationView alloc] initWithAnnotation:annotation 
                     reuseIdentifier:annotationIdentifier]; 
      UIImage *pinIcon = [UIImage imageNamed:@"carIcon"]; 
      annotationView.btnInfo = [[UIButton alloc] init]; 
      annotationView.frame = CGRectMake(0.0f, 0.0f, pinIcon.size.width, pinIcon.size.height); 
      annotationView.btnInfo.frame = annotationView.frame; 
      [annotationView.btnInfo setBackgroundImage:pinIcon forState:UIControlStateNormal]; 
      [annotationView addSubview:annotationView.btnInfo]; 
      [annotationView.btnInfo setUserInteractionEnabled:NO]; 
     } 

     else 
      annotationView.annotation = annotation; 

     annotationView.enabled = YES; 
     annotationView.canShowCallout = YES; 

     return annotationView; 
    } 
} 

Обновление координат

- (void)updateLocation { 

    CLLocationCoordinate2D oldLocation; 
    CLLocationCoordinate2D newLocation; 

    oldLocation.latitude = [self convertStringToFloat:self.arrayCSV[self.index-1][@"Latitude"]]; 
    oldLocation.longitude = [self convertStringToFloat:self.arrayCSV[self.index-1][@"Longitude"]]; 
    newLocation.latitude = [self convertStringToFloat:self.arrayCSV[self.index][@"Latitude"]]; 
    newLocation.longitude = [self convertStringToFloat:self.arrayCSV[self.index][@"Longitude"]]; 
    float getAngle = [self angleFromCoordinate:oldLocation toCoordinate:newLocation]; 

    CLLocation *oldInfo = [[CLLocation alloc] initWithLatitude:oldLocation.latitude longitude:oldLocation.longitude]; 
    CLLocation *newInfo = [[CLLocation alloc] initWithLatitude:newLocation.latitude longitude:newLocation.longitude]; 

    [UIView animateWithDuration:3 
     animations:^{ 
      myAnnotation.coordinate = newLocation; 
      AnnotationView *annotationView = (AnnotationView *)[self.mapView viewForAnnotation:myAnnotation];     
      annotationView.transform = CGAffineTransformMakeRotation(getAngle); 
    }]; 
} 

ответ

2

Попробуйте это.

Я думаю, что поведение, которое вы видите, связано с тем, что по умолчанию взаимодействие с пользователем отключается анимацией продолжительности с новыми вызовами блока.

Вы можете изменить это путем передачи UIViewAnimationOptionAllowUserInteraction, как показано ниже:

[UIView animateWithDuration:3 
    delay:0 
    options:UIViewAnimationOptionAllowUserInteraction 
    animations:^{ 
     myAnnotation.coordinate = newLocation; 
     AnnotationView *annotationView = (AnnotationView *)[self.mapView viewForAnnotation:myAnnotation];     
     annotationView.transform = CGAffineTransformMakeRotation(getAngle); 
    } 
completion:nil]; 
+0

Вы спасли мой день благодаря @wolverine. –

Смежные вопросы