Note that there are some explanatory texts on larger screens.

plurals
  1. POAnimations for a dropped pin not working
    primarykey
    data
    text
    <p>When I drop a pin on my mkmapview the animation works fine and the pin drops from the top of the screen as expected. I color that pin red because I haven't verified it. However, if I verify the pin using some code that is called on calloutAccessoryControlTapped I change the color of the Pin to green.</p> <p>When I next press on the map to drop another red pin the animation fails and the pin just appears. If I do it again (long press) a new pin appears and it's animation is fine. What could I have done to the annotation that causes this behavior.</p> <p>Thanks for any insights of what could have gone wrong here... Donie</p> <pre><code>- (MKAnnotationView *)mapView:(MKMapView *)map viewForAnnotation:(id &lt;MKAnnotation&gt;)annotation { if ([annotation isKindOfClass:[MKUserLocation class]]) { return nil; } static NSString * const kPinIdentifier = @"PinIdentifier"; MKPinAnnotationView *draggablePinView = (MKPinAnnotationView *)[self.mapView dequeueReusableAnnotationViewWithIdentifier:kPinIdentifier]; if(!draggablePinView) { draggablePinView = [[[MKPinAnnotationView alloc] initWithAnnotation:annotation reuseIdentifier:kPinIdentifier] autorelease]; draggablePinView.pinColor = MKPinAnnotationColorRed; draggablePinView.animatesDrop = YES; draggablePinView.canShowCallout = YES; draggablePinView.draggable = YES; UIButton* rightButton = [UIButton buttonWithType:UIButtonTypeDetailDisclosure]; draggablePinView.rightCalloutAccessoryView = rightButton; } else { draggablePinView.annotation = annotation; draggablePinView.animatesDrop = YES; } return draggablePinView; } -(void)longPressGesture:(UIGestureRecognizer *)gestureRecognizer { if (gestureRecognizer.state == UIGestureRecognizerStateBegan) { CGPoint touchPoint = [gestureRecognizer locationInView:mapView]; CLLocationCoordinate2D touchMapCoordinate = [mapView convertPoint:touchPoint toCoordinateFromView:mapView]; [self dropPinWithCoords:touchMapCoordinate]; } } - (void)mapView:(MKMapView *)mapview annotationView:(MKAnnotationView *)view calloutAccessoryControlTapped:(UIControl *)control { [self getFromServer]; } -(void) showLoc8CodeDetail:(LOC8Code *) loc8 { // Open the view controller viewLoc8ViewController *loc8view = [[viewLoc8ViewController alloc] initWithLoc8code:loc8]; [gMainViewController.navigationController pushViewController:loc8view animated:YES]; [loc8view release]; } -(void) dropPinWithCoords:(CLLocationCoordinate2D)loc { // Set the loc8code from index 0 in the global array and populate from response LOC8Code *newPin = [gMapAnnotations objectAtIndex:0]; newPin.starRating = 1; newPin.title = @"Unverified Pin"; newPin.subtitle = @"Click to verify postcode"; newPin.verified = NO; // this means you do have to requery if opened newPin.coordinate = loc; [self removeMapAnnotations]; [gMapAnnotations replaceObjectAtIndex:1 withObject:newPin]; [self.mapView addAnnotation:[gMapAnnotations objectAtIndex:1]]; // Reset flags [dropPinButton setTitle:@"Replace Pin" forState:UIControlStateNormal]; [self moveAndHidePinButtons:NO]; } -(void)getFromServer { [self checkRegisteredFromServer]; // Does API call to see if device already registered // Get the loc8 code from the global array (pin always index 1) LOC8Code *loc8 = [gMapAnnotations objectAtIndex:1]; // If we have a verified pin already (from a search) just show the info if(loc8.verified == YES) { [self showLoc8CodeDetail:loc8]; } else { [self setSpinning:YES]; // Get coordinates NSString *urlWithCoords = [NSString stringWithFormat:@"https://www.server.com/api/rest/lite/loc?t=%@&amp;u=%@&amp;a=iloc8er&amp;la=%f&amp;lo=%f", [Util getAPIToken], [UIDevice currentDevice].uniqueIdentifier, loc8.coordinate.latitude, loc8.coordinate.longitude]; NSLog(@"%@", urlWithCoords); ASIHTTPRequest *request = [self populateRequest:request withURL: urlWithCoords]; [request setDidFinishSelector:@selector(loc8returned:)]; [[self networkQueue] addOperation:request]; } } -(void)loc8returned:(ASIHTTPRequest *)request { @try { NSString *response = [request responseString]; NSLog(@"RSP: %@", response); // Store incoming data into an NSDictionary SBJsonParser *parser = [[SBJsonParser new]autorelease]; NSDictionary *results = [parser objectWithString:response error:nil]; // Check for errors NSNumber *r = [results objectForKey:@"r"]; NSString *e = [results valueForKey:@"e"]; if(r.boolValue == NO) { if([e isEqualToString:@"lc51"] || [e isEqualToString:@"lc52"]) { // Outside range [self setSpinning:NO]; return; } if([e isEqualToString:@"ud04"]) { // quota check [self setSpinning:NO]; return; } } else { LOC8Code *loc8 = [gMapAnnotations objectAtIndex:1]; // Set the loc8code NSString *lc = [results valueForKey:@"lc"]; loc8.postcode = lc; loc8.verified = YES; loc8.starRating = 0; loc8.title = lc; // This pin is now validated MKPinAnnotationView *pinView = (MKPinAnnotationView*)[mapView viewForAnnotation:[gMapAnnotations objectAtIndex:1]]; pinView.pinColor = MKPinAnnotationColorGreen; // Open the view controller [self showLoc8CodeDetail:loc8]; } } @catch (NSException *exception) { [Util say:@"Service Temporarily Unavailable (-200):"]; NSLog(@"RSP: %@, %@", [exception name], [exception reason]); } [self setSpinning:NO]; } </code></pre> <p>The loc8code header class is defined as follows:</p> <pre><code>@interface LOC8Code : MKPlacemark { NSString *postcode; NSString *BusinessName; int starRating; CLLocationCoordinate2D coordinate_; NSString *title_; NSString *subtitle_; BOOL verified; // Verified locations can't be moved (if pin moved then flag as not verified) } // Re-declare MKAnnotation's readonly property 'coordinate' to readwrite. @property (nonatomic, retain) NSString *postcode; @property (nonatomic, retain) NSString *BusinessName; @property (nonatomic, assign) int starRating; @property (nonatomic, readwrite, assign) CLLocationCoordinate2D coordinate; @property (nonatomic, retain) NSString *title; @property (nonatomic, retain) NSString *subtitle; @property (nonatomic, assign) BOOL verified; @end </code></pre> <p>And the implementation</p> <pre><code>#import "LOC8Code.h" @implementation LOC8Code @synthesize coordinate = coordinate_; @synthesize title = title_; @synthesize subtitle = subtitle_; @synthesize verified; @synthesize starRating; @synthesize postcode; @synthesize BusinessName; - (id)initWithCoordinate:(CLLocationCoordinate2D)coordinate addressDictionary:(NSDictionary *)addressDictionary { if ((self = [super initWithCoordinate:coordinate addressDictionary:addressDictionary])) { self.coordinate = coordinate; } return self; } - (void)dealloc { [title_ release]; [subtitle_ release]; [postcode release]; [BusinessName release]; [super dealloc]; } @end </code></pre>
    singulars
    1. This table or related slice is empty.
    plurals
    1. This table or related slice is empty.
    1. This table or related slice is empty.
    1. This table or related slice is empty.
 

Querying!

 
Guidance

SQuiL has stopped working due to an internal error.

If you are curious you may find further information in the browser console, which is accessible through the devtools (F12).

Reload