拍摄照片并将其用作mapview上的图钉

时间:2014-02-20 16:26:50

标签: ios mkmapview uiimagepickercontroller mkannotationview

我已经尝试了几天,能够使用从相机拍摄的照片或从图书馆中选择的照片,并在地图上放置一个图钉,图像刚刚选择/作为图钉。

我能够成功调出一张活动表并让用户选择/拍照。我也能让用户丢弃一个引脚。以下是我用于这两个操作的代码:

//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];

我不确定如何将它们整合在一起并制作成所以将拍摄的图像用作引脚,非常感谢任何帮助。

1 个答案:

答案 0 :(得分:0)

添加注释时,可以设置图像(使用apple示例混合的代码):

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