加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

iphone – 如何在我的每个地图注释中添加“地图”应用链接

发布时间:2020-12-14 17:42:16 所属栏目:百科 来源:网络整理
导读:有一些关于此的教程和问题,但我还不够了解如何将它们实现到我的特定应用程序中.我从URL获取 JSON注释数据并解析它并在for循环中添加每个注释.我想在每个注释上添加一个链接,以打开地图的方向. 这是我的ViewController.H #import UIKit/UIKit.h#import MediaP
有一些关于此的教程和问题,但我还不够了解如何将它们实现到我的特定应用程序中.我从URL获取 JSON注释数据并解析它并在for循环中添加每个注释.我想在每个注释上添加一个链接,以打开地图的方向.

这是我的ViewController.H

#import <UIKit/UIKit.h>
#import <MediaPlayer/MediaPlayer.h>
#import <MapKit/MapKit.h>

//MAP Setup
@interface ViewController : UIViewController <MKMapViewDelegate>

//map setup
@property (weak,nonatomic) IBOutlet MKMapView *mapView;
@property (nonatomic,strong) NSMutableData *downloadData;
//- (IBAction)refreshTapped:(id)sender;


@end

和我的ViewController.m

- (void)viewDidLoad
{
    ////////////////////////
    //Connection to download JSON map info
    ////////////////////////
    self.downloadData = [NSMutableData new];

    NSURL *requestURL2 = [NSURL URLWithString:@"http:OMITTED"];
    NSURLRequest *request = [NSURLRequest requestWithURL:requestURL2];
    NSURLConnection *connection = [NSURLConnection connectionWithRequest:request delegate:self];

    //scroller
    [scroller setScrollEnabled:YES];
    [scroller setContentSize:CGSizeMake(320,900)];

    [super viewDidLoad];    

//Map
    [self.mapView.userLocation addObserver:self
                                forKeyPath:@"location"
                                   options:(NSKeyValueObservingOptionNew|NSKeyValueObservingOptionOld)
                                   context:nil];
}

- (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data {
    [self.downloadData appendData:data];

}

- (void)connectionDidFinishLoading:(NSURLConnection *)connection {

    id parsed = [NSJSONSerialization JSONObjectWithData:_downloadData options:kNilOptions error:nil];

    ////////////////////////
    //Iterating and adding annotations
    ////////////////////////
    for (NSDictionary *pointInfo in parsed)
    {
        NSLog([pointInfo objectForKey:@"name"]);
        double xCoord = [(NSNumber*)[pointInfo objectForKey:@"lat"] doubleValue];
        double yCoord = [(NSNumber*)[pointInfo objectForKey:@"lon"] doubleValue];
        CLLocationCoordinate2D coords = CLLocationCoordinate2DMake(xCoord,yCoord);


        MKPointAnnotation *point = [MKPointAnnotation new];
        point.coordinate = coords;
        point.title = [pointInfo objectForKey:@"name"];

        [self.mapView addAnnotation:point];// or whatever your map view's variable name is
    }
}

- (void)didReceiveMemoryWarning
{
    [super didReceiveMemoryWarning];
    // Dispose of any resources that can be recreated.
}

//centers map on user loc and then allows for movement of map without re-centering on userlocation check.
-(void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context{
    if ([self.mapView showsUserLocation])
    {
        MKCoordinateRegion region;
        region.center = self.mapView.userLocation.coordinate;

        MKCoordinateSpan span;
        span.latitudeDelta  = .50; // Change these values to change the zoom
        span.longitudeDelta = .50;
        region.span = span;

        [self.mapView setRegion:region animated:YES];

        self.mapView.showsUserLocation = NO;}
}

- (void)dealloc
{
    [self.mapView.userLocation removeObserver:self forKeyPath:@"location"];
    [self.mapView removeFromSuperview]; // release crashes app
    self.mapView = nil;
}

@end

解决方法

Launching the Maps App位置感知编程指南说:

If you would prefer to display map information in the Maps app as opposed to your own app,you can launch Maps programmatically using one of two techniques:

In iOS 6 and later,use an 07001 object to open Maps.
In iOS 5 and earlier,create and open a specially formatted map URL as described in 07002.
The preferred way to open the Maps app is to use the MKMapItem class. This class offers both the 07003 class method and the 07004 instance method for opening the app and displaying locations or directions.

For an example showing how to open the Maps app,see 07005

所以,你应该:

>确保将视图控制器定义为地图视图的委托;
>写一个viewForAnnotation打开canShowCallout并打开callout accessory view:

- (MKAnnotationView *)mapView:(MKMapView *)mapView viewForAnnotation:(id <MKAnnotation>)annotation
{
    if ([annotation isKindOfClass:[MKUserLocation class]])
        return nil;

    MKAnnotationView* annotationView = [[MKPinAnnotationView alloc] initWithAnnotation:annotation
                                                                    reuseIdentifier:@"MyCustomAnnotation"];

    annotationView.canShowCallout = YES;
    annotationView.rightCalloutAccessoryView = [UIButton buttonWithType:UIButtonTypeDetailDisclosure];

    return annotationView;
}

>然后编写一个calloutAccessoryControlTapped方法,根据您支持的iOS版本(例如iOS 6)打开上面列出的地图:

- (void)mapView:(MKMapView *)mapView annotationView:(MKAnnotationView *)view calloutAccessoryControlTapped:(UIControl *)control
{
    id <MKAnnotation> annotation = view.annotation;
    CLLocationCoordinate2D coordinate = [annotation coordinate];
    MKPlacemark *placemark = [[MKPlacemark alloc] initWithCoordinate:coordinate addressDictionary:nil];
    MKMapItem *mapitem = [[MKMapItem alloc] initWithPlacemark:placemark];
    mapitem.name = annotation.title;
    [mapitem openInMapsWithLaunchOptions:nil];
}

我不知道您的KML中有哪些其他地理信息,但您可以根据需要填写地址字典.

在回答有关如何使用MKPlacemark初始化方法initWithCoordinate的addressDictionary参数的后续问题时,如果您有街道地址,城市,州,拉链等的NSString变量,它将如下所示:

NSDictionary *addressDictionary = @{(NSString *)kABPersonAddressStreetKey : street,(NSString *)kABPersonAddressCityKey   : city,(NSString *)kABPersonAddressStateKey  : state,(NSString *)kABPersonAddressZIPKey    : zip};

为此,您必须将add the appropriate framework,AddressBook.framework添加到您的项目并导入.m文件中的标头:

#import <AddressBook/AddressBook.h>

但真正的问题是如何设置MKMapItem的名称,以便它不会在地图应用程序中显示为“未知位置”.这就像设置name属性一样简单,可能只是从注释中抓取标题:

mapitem.name = annotation.title;

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读