IOS: displaying a callout view on a moving contact

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); }]; } 
+5
source share
1 answer

Try it.

I think that the behavior you see is due to the fact that by default, user interaction is disabled by duration animations using new block calls.

You can override this by passing UIViewAnimationOptionAllowUserInteraction as shown below:

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

Source: https://habr.com/ru/post/1263034/


All Articles