質問

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.

役に立ちましたか?

解決

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;
}
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top