Ada*_*ama 4 iphone xcode ios ios6
有一些关于此的教程和问题,但我还不够了解如何将它们实现到我的特定应用程序中.我从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
Run Code Online (Sandbox Code Playgroud)
和我的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
Run Code Online (Sandbox Code Playgroud)
启动地图应用的的位置感知编程指南说:
如果您希望在地图应用中显示地图信息而不是自己的应用,则可以使用以下两种技术之一以编程方式启动地图:
在iOS 6及更高版本中,使用
MKMapItem对象打开地图.
在iOS 5及更早版本中,创建并打开特殊格式的地图URL,如Apple URL Scheme Reference中所述.
打开地图应用的首选方法是使用MKMapItem该类.此类提供用于打开应用程序和显示位置或方向的openMapsWithItems:launchOptions:类方法和openInMapsWithLaunchOptions:实例方法.有关如何打开地图应用的示例,请参阅"要求地图应用显示路线".
所以,你应该:
确保将视图控制器定义delegate为地图视图;
写一个viewForAnnotation打开canShowCallout并打开标注附件视图:
- (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;
}
Run Code Online (Sandbox Code Playgroud)然后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];
}
Run Code Online (Sandbox Code Playgroud)
我不知道你的KML中有哪些额外的地理信息,但你可以addressDictionary根据自己的意愿填写.
在回答有关如何使用您的后续问题addressDictionary的参数MKPlacemark初始化方法,initWithCoordinate如果您有NSString在街上变量address中,city中,state中,zip等等,它看起来像:
NSDictionary *addressDictionary = @{(NSString *)kABPersonAddressStreetKey : street,
(NSString *)kABPersonAddressCityKey : city,
(NSString *)kABPersonAddressStateKey : state,
(NSString *)kABPersonAddressZIPKey : zip};
Run Code Online (Sandbox Code Playgroud)
对于这个工作,你必须在适当的框架中添加,AddressBook.framework以你的项目,并在您的.m文件导入头:
#import <AddressBook/AddressBook.h>
Run Code Online (Sandbox Code Playgroud)
然而,真正的问题是如何设置它name,MKMapItem因此它不会在地图应用程序中显示为"未知位置".这就像设置name属性一样简单,可能只是抓住title你的annotation:
mapitem.name = annotation.title;
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
2480 次 |
| 最近记录: |