地图(基本应用,location管理器,注解)

#import "ViewController.h"
#import <MapKit/MapKit.h>

@interface ViewController () <CLLocationManagerDelegate,MKMapViewDelegate>

//这里为什么要把它设置成为属性?为了就是解决强引用的问题,如果不设置,locationManger会在花括号之后,就会释放掉,这样就看不到了我们想要的地址改变信息,arc情况下,解决办法只有把它设置为成员属性
@property (retain,nonatomic) CLLocationManager *locationManger;

@end

@implementation ViewController

- (void)viewDidLoad
{
    [super viewDidLoad];
    
//   创建显示地图的视图MKMapView
    MKMapView *map = [[MKMapView alloc]initWithFrame:self.view.bounds];

//    这里打了一个tag,用于以后识别要显示的地图试图
    map.tag = 1000;

//    设置span
//    span 指的是显示地图精确度,值越小显示的地图数据越精确,越详细,如果值越大, 则显示的区域越大
    MKCoordinateSpan span ={0.1,0.1};
    //    结构体的第二种赋值方法
    //    MKCoordinateSpan span2;
    //    span2.latitudeDelta = 100;
    //    span2.longitudeDelta = 100;
    
    //    采用C函数来创建结构体的具体数据
    //    MKCoordinateSpan span3;
    //    span3 = MKCoordinateSpanMake(100, 100);
    
    /*
     *在OC环境下 对于结构体变量的赋值,有三种方式:
     1?初始化的时候, 直接采用花括号语法, 在花括里,按结构体声明的顺序依次赋值
     2?先声明结构体变量,可以使用点语法,来指定相对应的成员变量的值
     3?采用SDK的C 函数直接完成设置
     */

//    设置经纬度————是地图当前显示位置的地理坐标
    CLLocationCoordinate2D coordinate = {34.7568711,113.663221};
    
    
//    设置题图上显示的区域,这里需要设置两个参数————CLLocationCoordinate2D还有MKCoordinateSpan
    MKCoordinateRegion region = {coordinate,span};
    
//    设置显示界面的region就是上面的MKCoordinateRegion
    map.region = region;
   
//    显示当前位置
    map.showsUserLocation =YES;
//     可放大缩小
    map.zoomEnabled = YES;
//     可滑动
    map.scrollEnabled = YES;
   
//    设置显示的地图的类型————————三种类型
    //    显示卫星地图
//        map.mapType = MKMapTypeSatellite;
    //    显示卫星地图和标准地图的混合
    //    map.mapType = MKMapTypeHybrid;
    //    显示标准也就是普通地图,这是默认地图类型
        map.mapType = MKMapTypeStandard;
    
    [self.view addSubview:map];
    
//    添加地图的地址管理器————CLLocationManager
   self.locationManger = [[CLLocationManager alloc] init];
    
//    当设备移动每超过distanceFilter设置的米数时,就会更新一次位置信息。
//    理解为地图的位置移动一定距离,地图的信息就会更新
    self.locationManger.distanceFilter = 100;

//   地图位置信息的精确度,这里设置为best,精确度就是意味着在10米之内
//    extern const CLLocationAccuracy kCLLocationAccuracyBestForNavigation;
//    extern const CLLocationAccuracy kCLLocationAccuracyBest;
//    extern const CLLocationAccuracy kCLLocationAccuracyNearestTenMeters;
//    extern const CLLocationAccuracy kCLLocationAccuracyHundredMeters;
//    extern const CLLocationAccuracy kCLLocationAccuracyKilometer;
//    extern const CLLocationAccuracy kCLLocationAccuracyThreeKilometers;
    
    self.locationManger.desiredAccuracy = kCLLocationAccuracyBest;
    
//    设置代理
    
    self.locationManger.delegate = self;
    
//    这一句不能忘,只有设置了startUpdatingLocation,才能运行
    [self.locationManger startUpdatingLocation];
 
//   注解类很重要,如果想自定义地图上的一些文本和图标,就必须用到——————注解
//  注解类,用于提供注解数据,真正用于显示注解视图,需要在委托方法去创建
    MKPointAnnotation *pointAnnotation = [[MKPointAnnotation alloc]init];
    
    
    pointAnnotation.title = @"河南省";
    pointAnnotation.subtitle = @"郑州市";

//   设置注解的位置,这里就需要用到————coordinate
    pointAnnotation.coordinate =CLLocationCoordinate2DMake(34.7568711,113.663221);
    
//    把注解加到地图视图上
    [map addAnnotation:pointAnnotation];

}

#pragma mark -
#pragma mark CLLocationManagerDelegate
//第一个参数,表示是哪个地址管理器
//第二个参数,表示当位置更新的时候, 新位置信息。
//第三个参数,表示位置更新时, 老的位置信息。

//   这里要做到的效果是——————做到位置的改变,地图显示随着位置的改变,转变视图的界面
- (void)locationManager:(CLLocationManager *)manager
    didUpdateToLocation:(CLLocation *)newLocation
           fromLocation:(CLLocation *)oldLocation
{
    NSLog(@"newLocation‘s lat is :%f, long is :%f",newLocation.coordinate.latitude,newLocation.coordinate.longitude);
    NSLog(@"oldLocation‘s lat is :%f, long is :%f",oldLocation.coordinate.latitude,oldLocation.coordinate.longitude);
    
//    设置span
//    span 指的是显示地图精确度,值越小显示的地图数据越精确,越详细,如果值越大, 则显示的区域越大
//    这里调用了c语言的方法进行赋值------c赋值
    MKCoordinateSpan span = MKCoordinateSpanMake(1, 1);

//    设置地图上的显示区域
    MKCoordinateRegion region = {newLocation.coordinate,span};
    
//    这里用tag,表示修改后现实的界面还是以前我们创建的map
//    另一种方法是把它设置成为成员属性,也可以答到效果
    MKMapView *map = (MKMapView *)[self.view viewWithTag:1000];
    
//  设置地图界面的显示区域,同时再加上一个动画效果,
//    类似于map.region = region
    [map setRegion:region animated:YES];
 
    
//   计算两个位置之间的相隔距离, 单位是米----CLLocationDistance
    
    CLLocationDistance distance  = [newLocation distanceFromLocation:oldLocation];
    NSLog(@"两地之间的距离是:%f",distance/1000);
    
    
//    调用此方法, 是终止位置管理器更新位置信息,在实际应用中, 一定调用这个方法, 解决设备耗电量问题。
//    [self.locationMgr stopUpdatingLocation];

}

#if 0
//  这个和上面的方法其实是一个方法,6.0以后,系统推荐使用这种方法,同时存在,上面的方法无效
- (void)locationManager:(CLLocationManager *)manager
     didUpdateLocations:(NSArray *)locations
{
//    打印当面方法
    NSLog(@"%@",NSStringFromSelector(_cmd));
    NSLog(@"%@",NSStringFromSelector(@selector(locationManager:didUpdateLocations:)));
    
//   数组locations的最后一个元素, 是最新的位置信息
//    通过地址管理器的地址数组,取最新地址
    CLLocation *newLocation = locations[0];

//  设置span
    MKCoordinateSpan span = MKCoordinateSpanMake(1, 1);
 
//  设置region
    MKCoordinateRegion region = MKCoordinateRegionMake(newLocation.coordinate, span);
    
//    这里用tag,表示修改后现实的界面还是以前我们创建的map
//    另一种方法是把它设置成为成员属性,也可以答到效果
    MKMapView *map = (MKMapView *)[self.view viewWithTag:1000];
 
//  设置地图界面的显示区域,同时再加上一个动画效果,
//    类似于map.region = region
    [map setRegion:region animated:YES];
    
}
#endif
-(void)locationManager:(CLLocationManager *)manager
didFailWithError:(NSError *)error
{
    NSLog(@"%s",__func__);
    
    NSLog(@"%@",error);

}

#pragma mark -
#pragma mark MKMapViewDelegate
// 这里是实现注解的具体的代理方法
//这里有两个参数————————MKMapView还有——————————annotation
- (MKAnnotationView *)mapView:(MKMapView *)mapView viewForAnnotation:(id <MKAnnotation>)annotation
{
//    如果是系统默认的用户当前地址,返回默认的注解,
    if ([annotation isKindOfClass:[MKUserLocation class]]) {
        return nil;
    }
    
//   注解创建的方法和tabelview很像
//    都是先创建一个标识
    static NSString *pinViewIndentifier [email protected]"pinViewIndentifier";
    
//    从可重用队列里取出来
    MKPinAnnotationView *pinView =(MKPinAnnotationView *) [mapView dequeueReusableAnnotationViewWithIdentifier:pinViewIndentifier];
 
//    如果为空,创建pinview;
    if (pinView == nil) {
        pinView = [[MKPinAnnotationView alloc] initWithAnnotation:annotation reuseIdentifier:pinViewIndentifier];
    }

//        修改大头针的显示颜色
    pinView.pinColor =MKPinAnnotationColorGreen;

//        让大头针出现的时候, 展现从天而降的效果
    pinView.animatesDrop =YES;

//        如果想要展示上述效果, 需要设置canShowCallout为yes
    pinView.canShowCallout =YES;
    
    return pinView;
}
@end

地图(基本应用,location管理器,注解),布布扣,bubuko.com

时间: 2024-08-03 20:27:36

地图(基本应用,location管理器,注解)的相关文章

Spring jdbctemplate和事务管理器 全注解配置 不使用xml

/** * spring的配置类,相当于bean.xml */@Configuration//@Configuration标注在类上,相当于把该类作为spring的xml配置文件中的<beans>// 作用为:配置spring容器(应用上下文)@ComponentScan("com.zxh")//需要扫描的包@Import({JdbcConfig.class,TransactionConfig.class})//子配置类@PropertySource("jdbcC

Spring学习事务管理--基于注解方式(三)

图书类接口 package com.spring.tx; public interface BookShopDao { /** * 根据书号查找加个 * @param isbn * @return */ public int findBookPriceByIsbn(String isbn); /** * 更新书的库存 * @param isbn */ public void updateBookStock(String isbn); /** * 更新账户 * @param username *

Aop事务小结(事务管理器和自身构建)

声明市事务是利用AOP来实现的. 1.采用事务管理器AOP: <!--3.配置事务切面:控制住连接池 --> <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager"> <property name="dataSource" ref="comboPooledDa

Spring4+Hibernate4 事务管理 配置 注解 AOP

在单独使用hibernate的时候 使用如下配置: <property name="hibernate.current_session_context_class">thread</property> 根据文档,这个是hibernate3.1以后的一个新扩展,目的在于可以让我们在某一个上下文环境(比如说当前线程)中可以通过SessionFactory.getCurrentSession()得到同一个session会话. 该方式hibernate会自动关闭sess

Spring3.0配置多个事务管理器(即操作多个数据源)的方法

大多数项目只需要一个事务管理器.然而,有些项目为了提高效率.或者有多个完全不同又不相干的数据源,最好用多个事务管理器.机智的Spring的Transactional管理已经考虑到了这一点,首先分别定义多个transactional manager,并为qualifier属性指定不同的值:然后在需要使用@Transactional注解的时候指定TransactionManager的qualifier属性值或者直接使用bean名称.配置和代码使用的例子: <tx:annotation-driven/

拦截器-注解

首先定义我们自己的Interceptor package com.web.interceptor; import javax.servlet.http.HttpServletRequest; import org.apache.struts2.StrutsStatics; import org.apache.struts2.convention.annotation.ParentPackage; import com.common.utils.StringUtil; import com.ope

转:OGRE场景管理器介绍

一个场景代表在虚拟世界中显示的物品.场景可以包括静态几何体(比如地形或者室内),模型(比如树.椅子等),光和摄像机.场景有下面种类.室内场景:可能由走廊.有家具的屋子和挂着装饰品的墙组成.室外场景:可能由山,树木,微微摇动的草地,飘着云彩的天空组成.Ogre提供了一套不同的场景管理器,每一种特别支持某种场景,本文档将列出Ogre提供的场景管理器和它们的优缺点. 1 选择一个场景管理器 2 八叉树场景管理器(Octree Scene Manager) 3 地形场景管理器(Terrain Scene

Container容器控件的使用、Hbox与Vbox布局管理器的使用、以及AjaxAction前后台事件响应、浏览器debug

1.由于有前后台交互功能,需要在Spring上下文中注册一个用于提供服务的bean,对于这个bean使用Spring提供的@Component标注,如果需要使用@Component注解,需要在项目中WebContent->WEB-INF->dorado-home目录下的app-context.xml文件中增加一个配置,配置如下:<context:component-scan base-package="com.bstek.dorado.sample"/> 2.C

PHP FastCGI进程管理器PHP-FPM的架构

PHP FastCGI进程管理器PHP-FPM的架构 一个master进程,支持多个pool,每个pool由master进程监听不同的端口,pool中有多个worker进程. 每个worker进程都内置PHP解释器,并且进程常驻后台,支持prefork动态增加. 每个worker进程支持在运行时编译脚本并在内存中缓存生成的opcode来提升性能. 每个worker进程支持配置响应指定请求数后自动重启,master进程会重启挂掉的worker进程. 每个worker进程能保持一个到MySQL/Me