Domanda

I have been trying for a few days to be able to use a photo taken from the camera or chosen from the library and have it drop a pin on the map with the image just chosen/taken as the pin.

I'm able to successfully bring up an action sheet and have the user choose/take a photo. I am also able to get the user to drop a pin. Here is the code I have used for both of these actions:

//To take a photo
- (IBAction)takePhoto:(id)sender {
    // Opens Action Sheet
    UIActionSheet *actionSheet = [[UIActionSheet alloc] initWithTitle:@"Add a picture to the map" delegate:self cancelButtonTitle:@"Cancel" destructiveButtonTitle:nil otherButtonTitles:@"Take a picture",@"Choose from photos", nil];
    [actionSheet showInView:self.view];

}

- (void) imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *)info {
    UIImage *image = [info objectForKey:UIImagePickerControllerOriginalImage];
    [imageView setImage:image];

    [self dismissModalViewControllerAnimated:YES];
}

- (void) imagePickerControllerDidCancel:(UIImagePickerController *)picker {
    [self dismissModalViewControllerAnimated:YES];
}

- (void)actionSheet:(UIActionSheet *)actionSheet clickedButtonAtIndex:(NSInteger)buttonIndex {
    picker2 = [[UIImagePickerController alloc] init];
    picker2.delegate = self;

    if (buttonIndex == 0) {
        [picker2 setSourceType:UIImagePickerControllerSourceTypeCamera];

    } else if (buttonIndex == 1) {
        [picker2 setSourceType:UIImagePickerControllerSourceTypePhotoLibrary];
    }
    [self presentModalViewController:picker2 animated:YES];

}

//To drop a pin
        [self.view addSubview:mapview];

    MKCoordinateRegion region = {mapview.userLocation.location.coordinate.latitude,mapview.userLocation.location.coordinate.longitude};
    CLLocationCoordinate2D myCoord = {mapview.userLocation.location.coordinate.latitude,mapview.userLocation.location.coordinate.longitude};
    [mapview setCenterCoordinate:myCoord animated:YES];

    region.span.longitudeDelta = 0.01f;
    region.span.latitudeDelta = 0.01f;
    [mapview setRegion:region animated:YES];
    [mapview setDelegate:self];

    Annotation *ann = [[Annotation alloc]initWithLocation:CLLocationCoordinate2DMake(37.616815,-122.389682)];
    [mapview addAnnotation:ann];
    ann.title = @"Start";
    ann.subtitle = @"Subtitle for annotation";
    ann.coordinate = myCoord;
    ann.image = imageView;

    [self setTitle:@"Map View"];

    [mapview selectAnnotation:ann animated:YES];
    [mapview addAnnotation:ann];

I'm unsure on how I can integrate these together and make it so the image taken is used as the pin, any help is greatly appreciated.

È stato utile?

Soluzione

When you add your annotation, you can set the image in (code mixed using apple example):

- (MKAnnotationView *)mapView:(MKMapView *)mapView viewForAnnotation:(id <MKAnnotation>)annotation
{
    if ([annotation isKindOfClass:[Annotation class]])
    {
        return [self registerAnnotation:annotation withIdentifier:@"AnnotationID" withImage:self.personImage.image];
    }
    else
    {
        return nil;
    }
}

- (MKAnnotationView*)registerAnnotation:(id<MKAnnotation>)annotation withIdentifier:(NSString*)identifier withImage:(UIImage*)image
{
    NSLog(@"annotationIdentifier: %@", identifier);
    MKAnnotationView *flagAnnotationView = [self.mapView dequeueReusableAnnotationViewWithIdentifier:identifier];

    if (flagAnnotationView == nil)
    {
        flagAnnotationView = [[MKAnnotationView alloc] initWithAnnotation:annotation reuseIdentifier:identifier];
        flagAnnotationView = [self resizeAnnotationFromAnnotation:flagAnnotationView andSetImage:image];
    }
    else
    {
        flagAnnotationView.annotation = annotation;
    }
    return flagAnnotationView;
}

- (MKAnnotationView*)resizeAnnotationFromAnnotation:(MKAnnotationView*)annotationView andSetImage:(UIImage*)flagImage
{
    annotationView.canShowCallout = YES;
    annotationView.opaque = NO;

    CGRect resizeRect = [self resizeAnnotationFromSize:flagImage.size];
    UIImage *resizedImage = [self resizeImageFromCGRect:resizeRect andImage:flagImage];
    annotationView.image = resizedImage;

    // offset the flag annotation so that the flag pole rests on the map coordinate
    annotationView.centerOffset = CGPointMake(annotationView.centerOffset.x + annotationView.image.size.width/2, annotationView.centerOffset.y - annotationView.image.size.height/2);
    return annotationView;
}

- (UIImage*)resizeImageFromCGRect:(CGRect)resizeRect andImage:(UIImage*)flagImage
{
    UIGraphicsBeginImageContext(resizeRect.size);
    [flagImage drawInRect:resizeRect];
    UIImage *resizedImage = UIGraphicsGetImageFromCurrentImageContext();
    UIGraphicsEndImageContext();
    return resizedImage;
}

- (CGRect)resizeAnnotationFromSize:(CGSize)size
{
    // size the flag down to the appropriate size
    CGRect resizeRect;
    resizeRect.size = size;
    CGSize maxSize = CGRectInset(self.view.bounds, [self annotationPadding], [self annotationPadding]).size;
    maxSize.height -= self.navigationController.navigationBar.frame.size.height + [self calloutHeight];

    if (resizeRect.size.width > maxSize.width)
        resizeRect.size = CGSizeMake(maxSize.width, resizeRect.size.height / resizeRect.size.width * maxSize.width);
    if (resizeRect.size.height > maxSize.height)
        resizeRect.size = CGSizeMake(resizeRect.size.width / resizeRect.size.height * maxSize.height, maxSize.height);

    resizeRect.origin = CGPointMake(0.0, 0.0);

    return resizeRect;
}
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top