2017-01-19 43 views
5

Mam taką samą funkcjonalność, jak aplikacja Uber iOS do przemieszczania pinezki zgodnie z trasą z animacją.iOS: Pokaż widok objaśnienia na ruchomym pinezce

Issues: Kiedy klikam na kołku, gdy jest on w ruchu, a następnie nie jestem w stanie uzyskać didSelectAnnotationView delegata MKMapView. Ale gdy kołek jest stabilny, oznacza to, że się nie porusza, to zostaje wywołany.

Kod: Tworzenie kołek

-(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; 
    } 
} 

Aktualizacja koordynować

- (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); 
    }]; 
} 

Odpowiedz

2

Spróbuj tego.

Uważam, że obserwowane zachowanie wynika z tego, że domyślnie interakcja użytkownika jest wyłączana z animacją czasu trwania z nowymi wywołaniami blokowymi.

Można to zmienić poprzez przepuszczenie UIViewAnimationOptionAllowUserInteraction jak poniżej:

[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

Ty uratował mój dzień dzięki @wolverine. –