I implement the same functionality as the Uber iOS for moving pins along a route with animation.
Problems: When I click on a contact while it is moving, I cannot get the didSelectAnnotationView delegate from MKMapView . But when the pin is stable, it means it does not move, and then it is called.
Code: Create Contact
-(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; } }
Update Coordinate
- (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); }]; }
source share