天天看点

iOS 6苹果地图应用(MapKit)-内置开发

原始地址:iOS 6苹果地图应用(MapKit)-内置开发

本文是苹果案例RegionDefiner的注释。

#import "ViewController.h"
#import "MyAnnotation.h"

@implementation ViewController

- (void)viewDidLoad
{
    [super viewDidLoad];
    self.mainMapView = [[MKMapView alloc] init];
    
    self.mainMapView.delegate = self;
    [self.mainMapView setUserInteractionEnabled: YES];
    [self.mainMapView setScrollEnabled: YES];
    
    UIToolbar *toolbar = [[UIToolbar alloc] init];
    toolbar.autoresizingMask = UIViewAutoresizingFlexibleTopMargin | UIViewAutoresizingFlexibleWidth;
    [toolbar sizeToFit];
    
    CGSize containerSize = self.view.bounds.size;
    CGSize toolbarSize = toolbar.bounds.size;
    
    UIBarButtonItem *resetButton = [[UIBarButtonItem alloc] initWithTitle:@"Reset"
                                                                          style: UIBarButtonItemStyleBordered
                                                                         target: self
                                                                         action: @selector(removePins)];
    UIBarButtonItem *flexibleSpace = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemFlexibleSpace target:nil action:nil];
    
    UIBarButtonItem *share = [[UIBarButtonItem alloc] initWithTitle: @"Log"
                                                                  style: UIBarButtonItemStyleBordered
                                                                 target: self
                                                                 action: @selector(tappedShare)];

    toolbar.frame = CGRectMake(0, containerSize.height - toolbarSize.height, containerSize.width, toolbarSize.height);
    self.mainMapView.frame = CGRectMake(0, 0, containerSize.width, containerSize.height - toolbarSize.height);
    [self.view addSubview:self.mainMapView];
    [self.view addSubview:toolbar];
    
    //工具条上添加"重置按钮","空白","日志按钮"
    [toolbar setItems:@[ resetButton, flexibleSpace, share ]];
    
    [self setUpGesture];
        
    self.itemsArray = [[NSMutableArray alloc] init];
}

- (void)viewDidUnload
{
    [self setMainMapView:nil];
    [super viewDidUnload];
}

- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation
{
    if ([[UIDevice currentDevice] userInterfaceIdiom] == UIUserInterfaceIdiomPhone)
    {
        return (interfaceOrientation != UIInterfaceOrientationPortraitUpsideDown);
    } else {
        return YES;
    }
}

#pragma mark -
#pragma mark Dropping pins

//添加长按手势
- (void)setUpGesture
{
    self.longPress = [[UILongPressGestureRecognizer alloc] initWithTarget: self
                                                                   action: @selector(handleLongPress:)];
    self.longPress.delegate = self;
    [self.view addGestureRecognizer:self.longPress];
}

//处理长按手势
- (void)handleLongPress:(UILongPressGestureRecognizer *)recognizer
{
    if (recognizer.state == UIGestureRecognizerStateBegan)
    {
        CGPoint longPressPoint = [recognizer locationInView:self.view];
        //在此点绘制大头针
        [self dropPinAtPoint:longPressPoint];
    }
}

- (void)updatePolygon
{
    CLLocationCoordinate2D *points = malloc(sizeof(CLLocationCoordinate2D) * self.itemsArray.count);
    NSUInteger i = 0;
    for (MyAnnotation *pin in self.itemsArray)
    {
        //添加所有坐标的经纬度
        points[i] = pin.coordinate;
        i++;
    }
    
    //清除地图上上次绘制的图形
    [self.mainMapView removeOverlay:self.polygon];
    
    //绘制多边形
    self.polygon = [MKPolygon polygonWithCoordinates:points count:self.itemsArray.count];
    [self.mainMapView addOverlay:self.polygon];
}

- (void) dropPinAtPoint: (CGPoint) pointToConvert
{
    //把视图上的点转换成经纬度
    CLLocationCoordinate2D convertedPoint = [self.mainMapView convertPoint: pointToConvert toCoordinateFromView: self.view];
    
    //大头针的标题
    NSString *pinTitle = [NSString stringWithFormat: @"Pin number %i", self.itemsArray.count];
    
    //大头针的子标题,显示经纬度
    NSString *subCoordinates = [NSString stringWithFormat: @"%f, %f", convertedPoint.latitude, convertedPoint.longitude];
    
    MyAnnotation *droppedPin = [[MyAnnotation alloc] initWithCoordinate: convertedPoint title: pinTitle subtitle: subCoordinates];
    
    //在地图上添加这个标记
    [self.mainMapView addAnnotation:droppedPin];
    //加入数组
    [self.itemsArray addObject:droppedPin];
    //更新多边形
    [self updatePolygon];
}

- (void)removePins
{
    //移除标记
    [self.mainMapView removeAnnotations:self.mainMapView.annotations];
    //重置
    [self.itemsArray removeAllObjects];
    //清除绘制的多边形
    [self.mainMapView removeOverlay:self.polygon];
    //更新多边形
    [self updatePolygon];
}

#pragma mark - Output

//操作日志
- (void)tappedShare
{
    NSLog(@"%@", [self coordinates]);
}

- (NSString *)coordinates
{
    //绘制多边形至少需要三个点
    if (self.itemsArray.count < 3)
    {
        return @"Minimum of 3 vertices requried to make polygon.";
    }
    
    NSString *masterString = @"\n{ \"type\": \"MultiPolygon\",\n \"coordinates\": [\n[[";
    for (MyAnnotation *pin in self.itemsArray)
    {
        masterString = [masterString stringByAppendingFormat: @"[%f, %f],\n", pin.coordinate.longitude, pin.coordinate.latitude];
    }
    
    // GeoJSON requires that the first and last vertices be identical
    MyAnnotation *firstPin = [self.itemsArray objectAtIndex:0];
    masterString = [masterString stringByAppendingFormat: @"[%f, %f],\n", firstPin.coordinate.longitude, firstPin.coordinate.latitude];
    
    masterString = [masterString stringByAppendingString: @"]]\n]\n}\n"];
    masterString = [masterString stringByReplacingOccurrencesOfString: @"],\n]]" withString: @"]]]"];
   
    return masterString;
}

#pragma mark - MKMapViewDelegate

- (MKOverlayView *)mapView:(MKMapView *)mapView viewForOverlay:(id<MKOverlay>)overlay
{
    if (self.polygonView && self.polygonView.polygon == self.polygon)
        return self.polygonView;
    
    self.polygonView = [[MKPolygonView alloc] initWithPolygon:self.polygon];
    //填充色
    self.polygonView.fillColor = [UIColor colorWithRed:0 green:1 blue:0 alpha:0.3f];
    //边界颜色
    self.polygonView.strokeColor = [UIColor colorWithRed:0 green:1 blue:0 alpha:0.9f];
    //边线宽度
    self.polygonView.lineWidth = 1.0f;

    return self.polygonView;
}

@end