iphone地图应用的简易制作
1、新建工程,比如mapEye,点击工程里后缀名为xib(storeBoard一样),进入
操作界面,把在IB library中的Data View里的MapView拉到界面(MapView要在libraries section
里扩展)
2、为了让地图功能更强大,可以通过设置控件的Mapview的delegate,然后利用mapViewDidFinishLoadingMap:方法
来实现.
(1)首先在mapEyeViewController.h里声明class为MKMapViewDelegate.代码如下:
1 #import<UIKit/UIKit.h> 2 #iimport<MapKit/MapKit.h> 3 @interface mapEyeViewController.h:UIViewController 4 <MKMapViewDelegate>{} 5 @end
(2) 地图停止加载后调用MapView委托方法
1 -(void)mapViewDidFinishLoadingMap:(MKMapView *)mapView{ 2 //重复检查用户的位置 3 if(0.00001>[mapView userLocation].location.coordinate.latitude){ 4 [self performSelector:@selector(mapViewDidFinishLoadingMap:) withObject:mapView afterDelay:1.0]; 5 return; 6 } 7 MKCoordinateReginon region=[mapView region]; 8 //以用户所在地为中心 9 region.center=[mapView userLocation].location.coordinate; 10 //缩小区域 11 region.span.latitudeDelta=0.02; 12 region.span.longitudeDelta=0.02; 13 //添加动画 14 [mapView setRegion:region animated:YES]; 15 }
在UI 编辑器里,选择Map View,然后查看它的连线。给File’s Owner 的对象设置
delegate,即mapEyeViewController 实例。
通过CoreLocation查找用户位置
在没有Mapview的情况下需要得到用户位置 的经纬度
可以先创建一个CLLocationManager instance,设置其为delegate,调用startUpdatingLocation,
这个设为delegate的class还需要接入一个CLLoactionManagerDelegate协议
(1)开始并处理 CoreLacation更新
1 -(void)startUpdates{ 2 if(nil==locationManager) 3 locationManager=[[CLLocationmanager alloc] init]; 4 locationManager.delegate=self; 5 locationManager.desriedAccuracy=kCLLocationAccuracyKilom eter; 6 //设置精度 7 locationManager.distanceFilter=10; 8 //更新阙值 9 [locationManager startUpdatingLocation] 10 } 11 -(void)locationManager:(CLLocationManager *)manager 12 didUpdateToLcocation:(CLLocation *)newLocation 13 fromLocation:(CLLocation *)oldLocation 14 { 15 NSDate *eventDate=new Location timestamp; 16 NSTimeInterval howRecent=[eventDate timeIntervalSinceNow]; 17 if(abs(howRecent)<120.0){ 18 [manager stopUpdatingLocation]; 19 theLocation=new Location; 20 [theLocation retain]; 21 根据对精确性和过滤器的设置,你可以控制更新的次数。同时,根据需要,也可以通过 22 stopUpdatingLocation.来停止位置的更新。 23 } 24 }
(3)添加锚点显示用户位置
这个锚点作为界面元素,自然是在mapEyeViewController里进行实行;按钮名字
为parkBtn,将锚点的IBAction添加到头文件里。将mapview作为outlet
下面是mapEyeViewController和park按钮 的IBAction的声明:
1 @interface mapEyeViewController:UIViewController 2 〈MKMapViewDelegate〉{ 3 IBOutlet MKMapView *mapParking 4 } 5 -(IBAction)doParkBtn:(id)sender; 6 @end
在库里拉出ToolBar,并把上面Item按钮改成新名字:park,如图:
在File’s Owner 的关联(connection)里,关联mapParking outlet 到mapview。
双击在toolbar 上默认的Item 按钮,输入一个新名字:Park。在连线窗口,设置Park 按钮
的选择器(selector)为你刚刚在mapEyeParkedViewController 里定义过的IBAction
(命名为doParkBtn),返个park 按钮的选择器是在Interface Builder 里的File’s Owner。
接入doParkBtn,设置用户的位置为用户的停车地点。现在让我们来看看怎么做。
地图上的位置标注叫做annotations。iOS 的SDK 提供了一个MKAnnotation 的原型,
但返个原型丌是默认就接入了的。你必须要创建一个annotation class,返非常简单。你可
以在WhereAmIParkedViewController 文件中添加,如以下代码所示:
MKAnnotation头文件的地点实现
1 @interface SpotAnnotation:NSObject<MKAnnotation> 2 { 3 CLLocationCoordinate2D coordinate; 4 NSString *title; 5 NSString *subtitle; 6 7 } 8 @property(nonatomic,assign)CLLocationCoordinate2D coordinate; 9 @property(nonatomic,retain)NSString *title; 10 @property(nonatomic,retain)NSString *subtitle; 11 @end;
地点的实现文件
1 @implementation SportAnnotation 2 @synthesize title,subtitle,coordinate; 3 @end
将锚点添加到mapview上
1 -(IBAction)doParkBtn(id)sender{ 2 SpotAnnotation *ann=[[SpotAnnotation alloc] init]; 3 [ann setCoordinate:[mapParking userLocation] location coordinate]; 4 [mapParking addAnnotation:ann]; 5 }
设置annotation view,让它在视图上显示
1 -(MKAnnotation *)mapView:(MKMapView *)mapView 2 viewForAnnotation:(id<MKAnnotation>)annotation{ 3 if(![annotation isKindOfClass:[SpotAnnotation class]]) 4 return nil; 5 NSString *dqret=@"ParkingAnnon"; 6 id av=[mapView dequeueReusableAnnotationViewWithIdentifier:dqref]; 7 if(nil==av ){ 8 av=[[MKPinAnnotationView alloc] initWithAnnotation:annotation] 9 reuseIdentifier:dqref]; 10 [av setPinColor:MKPinAnnotationColorRed]; 11 [av setAnimatesDrop:YES]; 12 } 13 return av; 14 }
这样雏形算是出来了。