日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

ios 地图

發布時間:2024/4/17 编程问答 44 豆豆
生活随笔 收集整理的這篇文章主要介紹了 ios 地图 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

iOS開發系列--地圖與定位

2014-11-27 08:52 by KenshinCui,?70734?閱讀,?20?評論,?收藏,?編輯

概覽

現在很多社交、電商、團購應用都引入了地圖和定位功能,似乎地圖功能不再是地圖應用和導航應用所特有的。的確,有了地圖和定位功能確實讓我們的生活更加豐富多彩,極大的改變了我們的生活方式。例如你到了一個陌生的地方想要查找附近的酒店、超市等就可以打開軟件搜索周邊;類似的,還有很多團購軟件可以根據你所在的位置自動為你推薦某些商品。總之,目前地圖和定位功能已經大量引入到應用開發中。今天就和大家一起看一下iOS如何進行地圖和定位開發。

  • 定位
  • 地圖
  • 定位

    要實現地圖、導航功能,往往需要先熟悉定位功能,在iOS中通過Core Location框架進行定位操作。Core Location自身可以單獨使用,和地圖開發框架MapKit完全是獨立的,但是往往地圖開發要配合定位框架使用。在Core Location中主要包含了定位、地理編碼(包括反編碼)功能。

    定位功能

    定位是一個很常用的功能,如一些地圖軟件打開之后如果用戶允許軟件定位的話,那么打開軟件后就會自動鎖定到當前位置,如果用戶手機移動那么當前位置也會跟隨著變化。要實現這個功能需要使用Core Loaction中CLLocationManager類,首先看一下這個類的一些主要方法和屬性:

    類方法說明
    + (BOOL)locationServicesEnabled;是否啟用定位服務,通常如果用戶沒有啟用定位服務可以提示用戶打開定位服務
    + (CLAuthorizationStatus)authorizationStatus;定位服務授權狀態,返回枚舉類型:
    kCLAuthorizationStatusNotDetermined: 用戶尚未做出決定是否啟用定位服務
    kCLAuthorizationStatusRestricted: 沒有獲得用戶授權使用定位服務,可能用戶沒有自己禁止訪問授權
    kCLAuthorizationStatusDenied :用戶已經明確禁止應用使用定位服務或者當前系統定位服務處于關閉狀態
    kCLAuthorizationStatusAuthorizedAlways: 應用獲得授權可以一直使用定位服務,即使應用不在使用狀態
    kCLAuthorizationStatusAuthorizedWhenInUse: 使用此應用過程中允許訪問定位服務
    屬性說明
    desiredAccuracy定位精度,枚舉類型:

    kCLLocationAccuracyBest:最精確定位
    CLLocationAccuracy kCLLocationAccuracyNearestTenMeters:十米誤差范圍
    kCLLocationAccuracyHundredMeters:百米誤差范圍
    kCLLocationAccuracyKilometer:千米誤差范圍
    kCLLocationAccuracyThreeKilometers:三千米誤差范圍

    distanceFilter位置信息更新最小距離,只有移動大于這個距離才更新位置信息,默認為kCLDistanceFilterNone:不進行距離限制
    對象方法說明
    startUpdatingLocation開始定位追蹤,開始定位后將按照用戶設置的更新頻率執行-(void)locationManager:(CLLocationManager *)manager didUpdateLocations:(NSArray *)locations;方法反饋定位信息
    stopUpdatingLocation停止定位追蹤
    startUpdatingHeading開始導航方向追蹤
    stopUpdatingHeading停止導航方向追蹤
    startMonitoringForRegion:開始對某個區域進行定位追蹤,開始對某個區域進行定位后。如果用戶進入或者走出某個區域會調用- (void)locationManager:(CLLocationManager *)manager
    ??? didEnterRegion:(CLRegion *)region
    - (void)locationManager:(CLLocationManager *)manager
    ??? didExitRegion:(CLRegion *)region
    代理方法反饋相關信息
    stopMonitoringForRegion:停止對某個區域進行定位追蹤
    requestWhenInUseAuthorization請求獲得應用使用時的定位服務授權,注意使用此方法前在要在info.plist中配置NSLocationWhenInUseUsageDescription
    requestAlwaysAuthorization請求獲得應用一直使用定位服務授權,注意使用此方法前要在info.plist中配置NSLocationAlwaysUsageDescription
    代理方法說明
    -(void)locationManager:(CLLocationManager *)manager didUpdateLocations:(NSArray *)locations;位置發生改變后執行(第一次定位到某個位置之后也會執行)
    - (void)locationManager:(CLLocationManager *)manager
    ?????? didUpdateHeading:(CLHeading *)newHeading;
    導航方向發生變化后執行
    ? - (void)locationManager:(CLLocationManager *)manager
    ??? didEnterRegion:(CLRegion *)region
    進入某個區域之后執行
    - (void)locationManager:(CLLocationManager *)manager
    ??? didExitRegion:(CLRegion *)region
    走出某個區域之后執行

    iOS 8 還提供了更加人性化的定位服務選項。App 的定位服務不再僅僅是關閉或打開,現在,定位服務的啟用提供了三個選項,「永不」「使用應用程序期間」和「始終」。同時,考慮到能耗問題,如果一款 App 要求始終能在后臺開啟定位服務,iOS 8 不僅會在首次打開 App 時主動向你詢問,還會在日常使用中彈窗提醒你該 App 一直在后臺使用定位服務,并詢問你是否繼續允許。在iOS7及以前的版本,如果在應用程序中使用定位服務只要在程序中調用startUpdatingLocation方法應用就會詢問用戶是否允許此應用是否允許使用定位服務,同時在提示過程中可以通過在info.plist中配置通過配置Privacy - Location Usage Description告訴用戶使用的目的,同時這個配置是可選的。
    但是在iOS8中配置配置項發生了變化,可以通過配置NSLocationAlwaysUsageDescription或者NSLocationWhenInUseUsageDescription來告訴用戶使用定位服務的目的,并且注意這個配置是必須的,如果不進行配置則默認情況下應用無法使用定位服務,打開應用不會給出打開定位服務的提示,除非安裝后自己設置此應用的定位服務。同時,在應用程序中需要根據配置對requestAlwaysAuthorization或locationServicesEnabled方法進行請求。由于本人機器已經更新到最新的iOS8.1下面的內容主要針對iOS8,使用iOS7的朋友需要稍作調整。

    // // KCMainViewController.m // CoreLocation // // Created by Kenshin Cui on 14-03-27. // Copyright (c) 2014年 Kenshin Cui. All rights reserved. //#import "KCMainViewController.h" #import <CoreLocation/CoreLocation.h>@interface KCMainViewController ()<CLLocationManagerDelegate>{CLLocationManager *_locationManager; }@end@implementation KCMainViewController- (void)viewDidLoad {[super viewDidLoad];//定位管理器_locationManager=[[CLLocationManager alloc]init];if (![CLLocationManager locationServicesEnabled]) {NSLog(@"定位服務當前可能尚未打開,請設置打開!");return;}//如果沒有授權則請求用戶授權if ([CLLocationManager authorizationStatus]==kCLAuthorizationStatusNotDetermined){[_locationManager requestWhenInUseAuthorization];}else if([CLLocationManager authorizationStatus]==kCLAuthorizationStatusAuthorizedWhenInUse){//設置代理_locationManager.delegate=self;//設置定位精度_locationManager.desiredAccuracy=kCLLocationAccuracyBest;//定位頻率,每隔多少米定位一次CLLocationDistance distance=10.0;//十米定位一次_locationManager.distanceFilter=distance;//啟動跟蹤定位[_locationManager startUpdatingLocation];} }#pragma mark - CoreLocation 代理 #pragma mark 跟蹤定位代理方法,每次位置發生變化即會執行(只要定位到相應位置) //可以通過模擬器設置一個虛擬位置,否則在模擬器中無法調用此方法 -(void)locationManager:(CLLocationManager *)manager didUpdateLocations:(NSArray *)locations{CLLocation *location=[locations firstObject];//取出第一個位置CLLocationCoordinate2D coordinate=location.coordinate;//位置坐標NSLog(@"經度:%f,緯度:%f,海拔:%f,航向:%f,行走速度:%f",coordinate.longitude,coordinate.latitude,location.altitude,location.course,location.speed);//如果不需要實時定位,使用完即使關閉定位服務[_locationManager stopUpdatingLocation]; }@end

    注意:

    1.定位頻率和定位精度并不應當越精確越好,需要視實際情況而定,因為越精確越耗性能,也就越費電。

    2.定位成功后會根據設置情況頻繁調用-(void)locationManager:(CLLocationManager *)manager didUpdateLocations:(NSArray *)locations方法,這個方法返回一組地理位置對象數組,每個元素一個CLLocation代表地理位置信息(包含經度、緯度、海報、行走速度等信息),之所以返回數組是因為有些時候一個位置點可能包含多個位置。

    3.使用完定位服務后如果不需要實時監控應該立即關閉定位服務以節省資源。

    4.除了提供定位功能,CLLocationManager還可以調用startMonitoringForRegion:方法對指定區域進行監控。

    地理編碼

    除了提供位置跟蹤功能之外,在定位服務中還包含CLGeocoder類用于處理地理編碼和逆地理編碼(又叫反地理編碼)功能。

    地理編碼:根據給定的位置(通常是地名)確定地理坐標(經、緯度)。

    逆地理編碼:可以根據地理坐標(經、緯度)確定位置信息(街道、門牌等)。

    CLGeocoder最主要的兩個方法就是- (void)geocodeAddressString:(NSString *)addressString completionHandler:(CLGeocodeCompletionHandler)completionHandler;- (void)reverseGeocodeLocation:(CLLocation *)location completionHandler:(CLGeocodeCompletionHandler)completionHandler;,分別用于地理編碼和逆地理編碼。下面簡單演示一下:

    // // KCMainViewController.m // CoreLocation // // Created by Kenshin Cui on 14-03-27. // Copyright (c) 2014年 Kenshin Cui. All rights reserved. //#import "KCMainViewController.h" #import <CoreLocation/CoreLocation.h>@interface KCMainViewController ()<CLLocationManagerDelegate>{CLGeocoder *_geocoder; }@end@implementation KCMainViewController- (void)viewDidLoad {[super viewDidLoad];_geocoder=[[CLGeocoder alloc]init];[self getCoordinateByAddress:@"北京"];[self getAddressByLatitude:39.54 longitude:116.28]; }#pragma mark 根據地名確定地理坐標 -(void)getCoordinateByAddress:(NSString *)address{//地理編碼[_geocoder geocodeAddressString:address completionHandler:^(NSArray *placemarks, NSError *error) {//取得第一個地標,地標中存儲了詳細的地址信息,注意:一個地名可能搜索出多個地址CLPlacemark *placemark=[placemarks firstObject];CLLocation *location=placemark.location;//位置CLRegion *region=placemark.region;//區域NSDictionary *addressDic= placemark.addressDictionary;//詳細地址信息字典,包含以下部分信息 // NSString *name=placemark.name;//地名 // NSString *thoroughfare=placemark.thoroughfare;//街道 // NSString *subThoroughfare=placemark.subThoroughfare; //街道相關信息,例如門牌等 // NSString *locality=placemark.locality; // 城市 // NSString *subLocality=placemark.subLocality; // 城市相關信息,例如標志性建筑 // NSString *administrativeArea=placemark.administrativeArea; // 州 // NSString *subAdministrativeArea=placemark.subAdministrativeArea; //其他行政區域信息 // NSString *postalCode=placemark.postalCode; //郵編 // NSString *ISOcountryCode=placemark.ISOcountryCode; //國家編碼 // NSString *country=placemark.country; //國家 // NSString *inlandWater=placemark.inlandWater; //水源、湖泊 // NSString *ocean=placemark.ocean; // 海洋 // NSArray *areasOfInterest=placemark.areasOfInterest; //關聯的或利益相關的地標NSLog(@"位置:%@,區域:%@,詳細信息:%@",location,region,addressDic);}]; }#pragma mark 根據坐標取得地名 -(void)getAddressByLatitude:(CLLocationDegrees)latitude longitude:(CLLocationDegrees)longitude{//反地理編碼CLLocation *location=[[CLLocation alloc]initWithLatitude:latitude longitude:longitude];[_geocoder reverseGeocodeLocation:location completionHandler:^(NSArray *placemarks, NSError *error) {CLPlacemark *placemark=[placemarks firstObject];NSLog(@"詳細信息:%@",placemark.addressDictionary);}]; }@end

    地圖

    iOS從6.0開始地圖數據不再由谷歌驅動,而是改用自家地圖,當然在國內它的數據是由高德地圖提供的。這樣一來,如果在iOS6.0之前進行地圖開發的話使用方法會有所不同,基于目前的情況其實使用iOS6.0之前版本的系統基本已經寥寥無幾了,所有在接下來的內容中不會再針對iOS5及之前版本的地圖開發進行介紹。

    在iOS中進行地圖開發主要有兩種方式,一種是直接利用MapKit框架進行地圖開發,利用這種方式可以對地圖進行精準的控制;另一種方式是直接調用蘋果官方自帶的地圖應用,主要用于一些簡單的地圖應用(例如:進行導航覆蓋物填充等),無法進行精確的控制。當然,本節重點內容還是前者,后面的內容也會稍加提示。

    用MapKit之前需要簡單了解一下MapKit中地圖展示控件MKMapView的的一些常用屬性和方法,具體如下表:
    屬性說明
    userTrackingMode跟蹤類型,是一個枚舉:
    MKUserTrackingModeNone :不進行用戶位置跟蹤;
    MKUserTrackingModeFollow :跟蹤用戶位置;
    MKUserTrackingModeFollowWithHeading :跟蹤用戶位置并且跟蹤用戶前進方向;
    mapType地圖類型,是一個枚舉:
    MKMapTypeStandard :標準地圖,一般情況下使用此地圖即可滿足;
    MKMapTypeSatellite :衛星地圖;
    MKMapTypeHybrid :混合地圖,加載最慢比較消耗資源;
    userLocation用戶位置,只讀屬性
    annotations當前地圖中的所有大頭針,只讀屬性
    對象方法說明
    - (void)addAnnotation:(id <MKAnnotation>)annotation;添加大頭針,對應的有添加大頭針數組
    - (void)removeAnnotation:(id <MKAnnotation>)annotation;刪除大頭針,對應的有刪除大頭針數組

    - (void)setRegion:(MKCoordinateRegion)region animated:(BOOL)animated;

    設置地圖顯示區域,用于控制當前屏幕顯示地圖范圍
    - (void)setCenterCoordinate:(CLLocationCoordinate2D)coordinate animated:(BOOL)animated;設置地圖中心點位置
    - (CGPoint)convertCoordinate:(CLLocationCoordinate2D)coordinate toPointToView:(UIView *)view;將地理坐標(經緯度)轉化為數學坐標(UIKit坐標)
    - (CLLocationCoordinate2D)convertPoint:(CGPoint)point toCoordinateFromView:(UIView *)view;將數學坐標轉換為地理坐標
    - (MKAnnotationView *)dequeueReusableAnnotationViewWithIdentifier:(NSString *)identifier;從緩存池中取出大頭針,類似于UITableView中取出UITableViewCell,為了進行性能優化而設計
    - (void)selectAnnotation:(id <MKAnnotation>)annotation animated:(BOOL)animated;選中指定的大頭針
    - (void)deselectAnnotation:(id <MKAnnotation>)annotation animated:(BOOL)animated;取消選中指定的大頭針
    代理方法說明
    - (void)mapView:(MKMapView *)mapView didUpdateUserLocation:(MKUserLocation *)userLocation ;用戶位置發生改變時觸發(第一次定位到用戶位置也會觸發該方法)
    - (void)mapView:(MKMapView *)mapView didUpdateUserLocation:(MKUserLocation *)userLocation ;顯示區域發生改變后觸發
    - (void)mapViewDidFinishLoadingMap:(MKMapView *)mapView;地圖加載完成后觸發
    - (MKAnnotationView *)mapView:(MKMapView *)mapView viewForAnnotation:(id <MKAnnotation>)annotation;顯示大頭針時觸發,返回大頭針視圖,通常自定義大頭針可以通過此方法進行
    - (void)mapView:(MKMapView *)mapView didSelectAnnotationView:(MKAnnotationView *)view點擊選中某個大頭針時觸發
    - (void)mapView:(MKMapView *)mapView didDeselectAnnotationView:(MKAnnotationView *)view取消選中大頭針時觸發
    - (MKOverlayRenderer *)mapView:(MKMapView *)mapView rendererForOverlay:(id <MKOverlay>)overlay渲染地圖覆蓋物時觸發

    用戶位置跟蹤

    在很多帶有地圖的應用中默認打開地圖都會顯示用戶當前位置,同時將當前位置標記出來放到屏幕中點方便用戶對周圍情況進行查看。如果在iOS6或者iOS7中實現這個功能只需要添加地圖控件、設置用戶跟蹤模式、在-(void)mapView:(MKMapView *)mapView didUpdateUserLocation:(MKUserLocation *)userLocation代理方法中設置地圖中心區域及顯示范圍。但是在iOS8中用法稍有不同:

    1.由于在地圖中進行用戶位置跟蹤需要使用定位功能,而定位功能在iOS8中設計發生了變化,因此必須按照前面定位章節中提到的內容進行配置和請求。

    2.iOS8中不需要進行中心點的指定,默認會將當前位置設置中心點并自動設置顯示區域范圍。

    了解以上兩點,要進行用戶位置跟蹤其實就相當簡單了,值得一提的是-(void)mapView:(MKMapView *)mapView didUpdateUserLocation:(MKUserLocation *)userLocation這個代理方法。這個方法只有在定位(利用前面章節中的定位內容)到當前位置之后就會調用,以后每當用戶位置發生改變就會觸發,調用頻率相當頻繁。

    大頭針

    在iOS開發中經常會標記某個位置,需要使用地圖標注,也就是大家俗稱的“大頭針”。只要一個NSObject類實現MKAnnotation協議就可以作為一個大頭針,通常會重寫協議中coordinate(標記位置)、title(標題)、subtitle(子標題)三個屬性,然后在程序中創建大頭針對象并調用addAnnotation:方法添加大頭針即可(之所以iOS沒有定義一個基類實現這個協議供開發者使用,多數原因應該是MKAnnotation是一個模型對象,對于多數應用模型會稍有不同,例如后面的內容中會給大頭針模型對象添加其他屬性)。

    KCAnnotation.h

    // // KCAnnotation.h // MapKit // // Created by Kenshin Cui on 14/3/27. // Copyright (c) 2014年 Kenshin Cui. All rights reserved. //#import <Foundation/Foundation.h> #import <MapKit/MapKit.h>@interface KCAnnotation : NSObject<MKAnnotation>@property (nonatomic) CLLocationCoordinate2D coordinate; @property (nonatomic, copy) NSString *title; @property (nonatomic, copy) NSString *subtitle;@end

    KCMainViewController.m

    // // KCMainViewController.m // MapKit Annotation // // Created by Kenshin Cui on 14/3/27. // Copyright (c) 2014年 Kenshin Cui. All rights reserved. // 37.785834 -122.406417 // 39.92 116.39#import "KCMainViewController.h" #import <CoreLocation/CoreLocation.h> #import <MapKit/MapKit.h> #import "KCAnnotation.h"@interface KCMainViewController ()<MKMapViewDelegate>{CLLocationManager *_locationManager;MKMapView *_mapView; }@end@implementation KCMainViewController- (void)viewDidLoad {[super viewDidLoad];[self initGUI]; }#pragma mark 添加地圖控件 -(void)initGUI{CGRect rect=[UIScreen mainScreen].bounds;_mapView=[[MKMapView alloc]initWithFrame:rect];[self.view addSubview:_mapView];//設置代理_mapView.delegate=self;//請求定位服務_locationManager=[[CLLocationManager alloc]init];if(![CLLocationManager locationServicesEnabled]||[CLLocationManager authorizationStatus]!=kCLAuthorizationStatusAuthorizedWhenInUse){[_locationManager requestWhenInUseAuthorization];}//用戶位置追蹤(用戶位置追蹤用于標記用戶當前位置,此時會調用定位服務)_mapView.userTrackingMode=MKUserTrackingModeFollow;//設置地圖類型_mapView.mapType=MKMapTypeStandard;//添加大頭針[self addAnnotation]; }#pragma mark 添加大頭針 -(void)addAnnotation{CLLocationCoordinate2D location1=CLLocationCoordinate2DMake(39.95, 116.35);KCAnnotation *annotation1=[[KCAnnotation alloc]init];annotation1.title=@"CMJ Studio";annotation1.subtitle=@"Kenshin Cui's Studios";annotation1.coordinate=location1;[_mapView addAnnotation:annotation1];CLLocationCoordinate2D location2=CLLocationCoordinate2DMake(39.87, 116.35);KCAnnotation *annotation2=[[KCAnnotation alloc]init];annotation2.title=@"Kenshin&Kaoru";annotation2.subtitle=@"Kenshin Cui's Home";annotation2.coordinate=location2;[_mapView addAnnotation:annotation2]; }#pragma mark - 地圖控件代理方法 #pragma mark 更新用戶位置,只要用戶改變則調用此方法(包括第一次定位到用戶位置) -(void)mapView:(MKMapView *)mapView didUpdateUserLocation:(MKUserLocation *)userLocation{NSLog(@"%@",userLocation);//設置地圖顯示范圍(如果不進行區域設置會自動顯示區域范圍并指定當前用戶位置為地圖中心點)// MKCoordinateSpan span=MKCoordinateSpanMake(0.01, 0.01);// MKCoordinateRegion region=MKCoordinateRegionMake(userLocation.location.coordinate, span);// [_mapView setRegion:region animated:true]; }@end

    運行效果:

    ?

    設置大頭針視圖

    在一些應用中系統默認的大頭針樣式可能無法滿足實際的需求,此時就需要修改大頭針視圖默認樣式。根據前面MapKit的代理方法不難發現- (MKAnnotationView *)mapView:(MKMapView *)mapView viewForAnnotation:(id <MKAnnotation>)annotation;方法可以返回一個大頭針視圖,只要實現這個方法并在這個方法中定義一個大頭針視圖MKAnnotationView對象并設置相關屬性就可以改變默認大頭針的樣式。MKAnnotationView常用屬性:

    屬性說明
    annotation大頭針模型信息,包括標題、子標題、地理位置。
    image大頭針圖片
    canShowCallout點擊大頭針是否顯示標題、子標題內容等,注意如果在- (MKAnnotationView *)mapView:(MKMapView *)mapView viewForAnnotation:(id <MKAnnotation>)annotation;方法中重新定義大頭針默認情況是無法交互的需要設置為true。
    calloutOffset點擊大頭針時彈出詳情信息視圖的偏移量
    selected是否被選中狀態
    leftCalloutAccessoryView彈出詳情左側視圖
    rightCalloutAccessoryView彈出詳情右側視圖

    需要注意:

    a.這個代理方法的調用時機:每當有大頭針顯示到系統可視界面中時就會調用此方法返回一個大頭針視圖放到界面中,同時當前系統位置標注(也就是地圖中藍色的位置點)也是一個大頭針,也會調用此方法,因此處理大頭針視圖時需要區別對待。

    b.類似于UITableView的代理方法,此方法調用頻繁,開發過程中需要重復利用MapKit的緩存池將大頭針視圖緩存起來重復利用。

    c.自定義大頭針默認情況下不允許交互,如果交互需要設置canShowCallout=true

    d.如果代理方法返回nil則會使用默認大頭針視圖,需要根據情況設置。

    下面以一個示例進行大頭針視圖設置,這里設置了大頭針的圖片、彈出視圖、偏移量等信息。

    KCAnnotation.h

    // // KCAnnotation.h // MapKit // // Created by Kenshin Cui on 14/3/27. // Copyright (c) 2014年 Kenshin Cui. All rights reserved. //#import <Foundation/Foundation.h> #import <MapKit/MapKit.h>@interface KCAnnotation : NSObject<MKAnnotation>@property (nonatomic) CLLocationCoordinate2D coordinate; @property (nonatomic, copy) NSString *title; @property (nonatomic, copy) NSString *subtitle;#pragma mark 自定義一個圖片屬性在創建大頭針視圖時使用 @property (nonatomic,strong) UIImage *image;@end

    KCMainViewController.m

    // // KCMainViewController.m // MapKit Annotation // // Created by Kenshin Cui on 14/3/27. // Copyright (c) 2014年 Kenshin Cui. All rights reserved. // 37.785834 -122.406417 // 39.92 116.39#import "KCMainViewController.h" #import <CoreLocation/CoreLocation.h> #import <MapKit/MapKit.h> #import "KCAnnotation.h"@interface KCMainViewController ()<MKMapViewDelegate>{CLLocationManager *_locationManager;MKMapView *_mapView; }@end@implementation KCMainViewController- (void)viewDidLoad {[super viewDidLoad];[self initGUI]; }#pragma mark 添加地圖控件 -(void)initGUI{CGRect rect=[UIScreen mainScreen].bounds;_mapView=[[MKMapView alloc]initWithFrame:rect];[self.view addSubview:_mapView];//設置代理_mapView.delegate=self;//請求定位服務_locationManager=[[CLLocationManager alloc]init];if(![CLLocationManager locationServicesEnabled]||[CLLocationManager authorizationStatus]!=kCLAuthorizationStatusAuthorizedWhenInUse){[_locationManager requestWhenInUseAuthorization];}//用戶位置追蹤(用戶位置追蹤用于標記用戶當前位置,此時會調用定位服務)_mapView.userTrackingMode=MKUserTrackingModeFollow;//設置地圖類型_mapView.mapType=MKMapTypeStandard;//添加大頭針[self addAnnotation]; }#pragma mark 添加大頭針 -(void)addAnnotation{CLLocationCoordinate2D location1=CLLocationCoordinate2DMake(39.95, 116.35);KCAnnotation *annotation1=[[KCAnnotation alloc]init];annotation1.title=@"CMJ Studio";annotation1.subtitle=@"Kenshin Cui's Studios";annotation1.coordinate=location1;annotation1.image=[UIImage imageNamed:@"icon_pin_floating.png"];[_mapView addAnnotation:annotation1];CLLocationCoordinate2D location2=CLLocationCoordinate2DMake(39.87, 116.35);KCAnnotation *annotation2=[[KCAnnotation alloc]init];annotation2.title=@"Kenshin&Kaoru";annotation2.subtitle=@"Kenshin Cui's Home";annotation2.coordinate=location2;annotation2.image=[UIImage imageNamed:@"icon_paopao_waterdrop_streetscape.png"];[_mapView addAnnotation:annotation2]; }#pragma mark - 地圖控件代理方法 #pragma mark 顯示大頭針時調用,注意方法中的annotation參數是即將顯示的大頭針對象 -(MKAnnotationView *)mapView:(MKMapView *)mapView viewForAnnotation:(id<MKAnnotation>)annotation{//由于當前位置的標注也是一個大頭針,所以此時需要判斷,此代理方法返回nil使用默認大頭針視圖if ([annotation isKindOfClass:[KCAnnotation class]]) {static NSString *key1=@"AnnotationKey1";MKAnnotationView *annotationView=[_mapView dequeueReusableAnnotationViewWithIdentifier:key1];//如果緩存池中不存在則新建if (!annotationView) {annotationView=[[MKAnnotationView alloc]initWithAnnotation:annotation reuseIdentifier:key1];annotationView.canShowCallout=true;//允許交互點擊annotationView.calloutOffset=CGPointMake(0, 1);//定義詳情視圖偏移量annotationView.leftCalloutAccessoryView=[[UIImageView alloc]initWithImage:[UIImage imageNamed:@"icon_classify_cafe.png"]];//定義詳情左側視圖}//修改大頭針視圖//重新設置此類大頭針視圖的大頭針模型(因為有可能是從緩存池中取出來的,位置是放到緩存池時的位置)annotationView.annotation=annotation;annotationView.image=((KCAnnotation *)annotation).image;//設置大頭針視圖的圖片return annotationView;}else {return nil;} } @end

    運行效果:

    注意:

    在MapKit框架中除了MKAnnotationView之外還有一個MKPinAnnotationView,它是MKAnnotationView的子類,相比MKAnnotationView多了兩個屬性pinColor和animationDrop,分別用于設置大頭針視圖顏色和添加大頭針動畫。

    擴展--自定義大頭針彈詳情視圖

    通過上面的示例不難看出MKAnnotationView足夠強大(何況還有MKPinAnnotationView),很多信息都可以進行設置,但是唯獨不能修改大頭針描述詳情視圖(僅僅支持詳情中左右視圖內容)。要實現這個需求目前開發中普遍采用的思路就是:

    a.點擊一個大頭針A時重新在A的坐標處添加另一個大頭針B(注意此時將A對應的大頭針視圖canShowCallout設置為false)作為大頭針詳情模型,然后在- (MKAnnotationView *)mapView:(MKMapView *)mapView viewForAnnotation:(id <MKAnnotation>)annotation;代理方法中判斷大頭針類型,如果是B則重寫MKAnnotationView(可以自定義一個類C繼承于MKAnnotationView),返回自定義大頭針視圖C。

    b.定義大頭針視圖C繼承于MKAnnotationView(或者MKPinAnnotationView),在自定義大頭針視圖中添加自己的控件,完成自定義布局。

    在使用百度地圖客戶端時當點擊一個搜索位置時可以看到此位置的評價等信息,視圖效果大概如下:

    ?

    下面不妨試著實現一下這個效果:

    大頭針模型:KCAnnotation.h

    // // KCAnnotation.h // MapKit // // Created by Kenshin Cui on 14/3/27. // Copyright (c) 2014年 Kenshin Cui. All rights reserved. //#import <Foundation/Foundation.h> #import <MapKit/MapKit.h>@interface KCAnnotation : NSObject<MKAnnotation>@property (nonatomic) CLLocationCoordinate2D coordinate; @property (nonatomic, copy) NSString *title; @property (nonatomic, copy) NSString *subtitle;#pragma mark 自定義一個圖片屬性在創建大頭針視圖時使用 @property (nonatomic,strong) UIImage *image;#pragma mark 大頭針詳情左側圖標 @property (nonatomic,strong) UIImage *icon; #pragma mark 大頭針詳情描述 @property (nonatomic,copy) NSString *detail; #pragma mark 大頭針右下方星級評價 @property (nonatomic,strong) UIImage *rate;@end

    彈出詳情大頭針模型:KCCalloutAnnotation.h

    // // KCCalloutAnnotation.h // MapKit // // Created by Kenshin Cui on 14/3/27. // Copyright (c) 2014年 Kenshin Cui. All rights reserved. //#import <UIKit/UIKit.h> #import <CoreLocation/CoreLocation.h> #import <MapKit/MapKit.h>@interface KCCalloutAnnotation : NSObject<MKAnnotation>@property (nonatomic) CLLocationCoordinate2D coordinate; @property (nonatomic, copy,readonly) NSString *title; @property (nonatomic, copy,readonly) NSString *subtitle;#pragma mark 左側圖標 @property (nonatomic,strong) UIImage *icon; #pragma mark 詳情描述 @property (nonatomic,copy) NSString *detail; #pragma mark 星級評價 @property (nonatomic,strong) UIImage *rate;@end

    彈出詳情大頭針視圖:KCCalloutAnnotatonView.h

    // // KCCalloutView.h // MapKit // // Created by Kenshin Cui on 14/3/27. // Copyright (c) 2014年 Kenshin Cui. All rights reserved. // 自定義彈出標注視圖#import <UIKit/UIKit.h> #import <CoreLocation/CoreLocation.h> #import <MapKit/MapKit.h> #import "KCCalloutAnnotation.h"@interface KCCalloutAnnotationView : MKAnnotationView@property (nonatomic ,strong) KCCalloutAnnotation *annotation;#pragma mark 從緩存取出標注視圖 +(instancetype)calloutViewWithMapView:(MKMapView *)mapView;@end

    KCCalloutAnnotationView.m

    // // KCCalloutView.m // MapKit // // Created by Kenshin Cui on 14/3/27. // Copyright (c) 2014年 Kenshin Cui. All rights reserved. //#import "KCCalloutAnnotationView.h" #define kSpacing 5 #define kDetailFontSize 12 #define kViewOffset 80@interface KCCalloutAnnotationView(){UIView *_backgroundView;UIImageView *_iconView;UILabel *_detailLabel;UIImageView *_rateView; }@end@implementation KCCalloutAnnotationView-(instancetype)init{if(self=[super init]){[self layoutUI];}return self; } -(instancetype)initWithFrame:(CGRect)frame{if (self=[super initWithFrame:frame]) {[self layoutUI];}return self; }-(void)layoutUI{//背景_backgroundView=[[UIView alloc]init];_backgroundView.backgroundColor=[UIColor whiteColor];//左側添加圖標_iconView=[[UIImageView alloc]init];//上方詳情_detailLabel=[[UILabel alloc]init];_detailLabel.lineBreakMode=NSLineBreakByWordWrapping;//[_text sizeToFit];_detailLabel.font=[UIFont systemFontOfSize:kDetailFontSize];//下方星級_rateView=[[UIImageView alloc]init];[self addSubview:_backgroundView];[self addSubview:_iconView];[self addSubview:_detailLabel];[self addSubview:_rateView]; }+(instancetype)calloutViewWithMapView:(MKMapView *)mapView{static NSString *calloutKey=@"calloutKey1";KCCalloutAnnotationView *calloutView=(KCCalloutAnnotationView *)[mapView dequeueReusableAnnotationViewWithIdentifier:calloutKey];if (!calloutView) {calloutView=[[KCCalloutAnnotationView alloc]init];}return calloutView; }#pragma mark 當給大頭針視圖設置大頭針模型時可以在此處根據模型設置視圖內容 -(void)setAnnotation:(KCCalloutAnnotation *)annotation{[super setAnnotation:annotation];//根據模型調整布局_iconView.image=annotation.icon;_iconView.frame=CGRectMake(kSpacing, kSpacing, annotation.icon.size.width, annotation.icon.size.height);_detailLabel.text=annotation.detail;float detailWidth=150.0;CGSize detailSize= [annotation.detail boundingRectWithSize:CGSizeMake(detailWidth, MAXFLOAT) options:NSStringDrawingUsesLineFragmentOrigin attributes:@{NSFontAttributeName: [UIFont systemFontOfSize:kDetailFontSize]} context:nil].size;float detailX=CGRectGetMaxX(_iconView.frame)+kSpacing;_detailLabel.frame=CGRectMake(detailX, kSpacing, detailSize.width, detailSize.height);_rateView.image=annotation.rate;_rateView.frame=CGRectMake(detailX, CGRectGetMaxY(_detailLabel.frame)+kSpacing, annotation.rate.size.width, annotation.rate.size.height);float backgroundWidth=CGRectGetMaxX(_detailLabel.frame)+kSpacing;float backgroundHeight=_iconView.frame.size.height+2*kSpacing;_backgroundView.frame=CGRectMake(0, 0, backgroundWidth, backgroundHeight);self.bounds=CGRectMake(0, 0, backgroundWidth, backgroundHeight+kViewOffset);} @end

    主視圖控制器:KCMainViewController.m

    // // KCMainViewController.m // MapKit Annotation // // Created by Kenshin Cui on 14/3/27. // Copyright (c) 2014年 Kenshin Cui. All rights reserved. // 37.785834 -122.406417 // 39.92 116.39#import "KCMainViewController.h" #import <CoreLocation/CoreLocation.h> #import <MapKit/MapKit.h> #import "KCAnnotation.h" #import "KCCalloutAnnotationView.h" #import "KCCalloutAnnotationView.h"@interface KCMainViewController ()<MKMapViewDelegate>{CLLocationManager *_locationManager;MKMapView *_mapView; }@end@implementation KCMainViewController- (void)viewDidLoad {[super viewDidLoad];[self initGUI]; }#pragma mark 添加地圖控件 -(void)initGUI{CGRect rect=[UIScreen mainScreen].bounds;_mapView=[[MKMapView alloc]initWithFrame:rect];[self.view addSubview:_mapView];//設置代理_mapView.delegate=self;//請求定位服務_locationManager=[[CLLocationManager alloc]init];if(![CLLocationManager locationServicesEnabled]||[CLLocationManager authorizationStatus]!=kCLAuthorizationStatusAuthorizedWhenInUse){[_locationManager requestWhenInUseAuthorization];}//用戶位置追蹤(用戶位置追蹤用于標記用戶當前位置,此時會調用定位服務)_mapView.userTrackingMode=MKUserTrackingModeFollow;//設置地圖類型_mapView.mapType=MKMapTypeStandard;//添加大頭針[self addAnnotation]; }#pragma mark 添加大頭針 -(void)addAnnotation{CLLocationCoordinate2D location1=CLLocationCoordinate2DMake(39.95, 116.35);KCAnnotation *annotation1=[[KCAnnotation alloc]init];annotation1.title=@"CMJ Studio";annotation1.subtitle=@"Kenshin Cui's Studios";annotation1.coordinate=location1;annotation1.image=[UIImage imageNamed:@"icon_pin_floating.png"];annotation1.icon=[UIImage imageNamed:@"icon_mark1.png"];annotation1.detail=@"CMJ Studio...";annotation1.rate=[UIImage imageNamed:@"icon_Movie_Star_rating.png"];[_mapView addAnnotation:annotation1];CLLocationCoordinate2D location2=CLLocationCoordinate2DMake(39.87, 116.35);KCAnnotation *annotation2=[[KCAnnotation alloc]init];annotation2.title=@"Kenshin&Kaoru";annotation2.subtitle=@"Kenshin Cui's Home";annotation2.coordinate=location2;annotation2.image=[UIImage imageNamed:@"icon_paopao_waterdrop_streetscape.png"];annotation2.icon=[UIImage imageNamed:@"icon_mark2.png"];annotation2.detail=@"Kenshin Cui...";annotation2.rate=[UIImage imageNamed:@"icon_Movie_Star_rating.png"];[_mapView addAnnotation:annotation2]; }#pragma mark - 地圖控件代理方法 #pragma mark 顯示大頭針時調用,注意方法中的annotation參數是即將顯示的大頭針對象 -(MKAnnotationView *)mapView:(MKMapView *)mapView viewForAnnotation:(id<MKAnnotation>)annotation{//由于當前位置的標注也是一個大頭針,所以此時需要判斷,此代理方法返回nil使用默認大頭針視圖if ([annotation isKindOfClass:[KCAnnotation class]]) {static NSString *key1=@"AnnotationKey1";MKAnnotationView *annotationView=[_mapView dequeueReusableAnnotationViewWithIdentifier:key1];//如果緩存池中不存在則新建if (!annotationView) {annotationView=[[MKAnnotationView alloc]initWithAnnotation:annotation reuseIdentifier:key1]; // annotationView.canShowCallout=true;//允許交互點擊annotationView.calloutOffset=CGPointMake(0, 1);//定義詳情視圖偏移量annotationView.leftCalloutAccessoryView=[[UIImageView alloc]initWithImage:[UIImage imageNamed:@"icon_classify_cafe.png"]];//定義詳情左側視圖}//修改大頭針視圖//重新設置此類大頭針視圖的大頭針模型(因為有可能是從緩存池中取出來的,位置是放到緩存池時的位置)annotationView.annotation=annotation;annotationView.image=((KCAnnotation *)annotation).image;//設置大頭針視圖的圖片return annotationView;}else if([annotation isKindOfClass:[KCCalloutAnnotation class]]){//對于作為彈出詳情視圖的自定義大頭針視圖無彈出交互功能(canShowCallout=false,這是默認值),在其中可以自由添加其他視圖(因為它本身繼承于UIView)KCCalloutAnnotationView *calloutView=[KCCalloutAnnotationView calloutViewWithMapView:mapView];calloutView.annotation=annotation;return calloutView;} else {return nil;} }#pragma mark 選中大頭針時觸發 //點擊一般的大頭針KCAnnotation時添加一個大頭針作為所點大頭針的彈出詳情視圖 -(void)mapView:(MKMapView *)mapView didSelectAnnotationView:(MKAnnotationView *)view{KCAnnotation *annotation=view.annotation;if ([view.annotation isKindOfClass:[KCAnnotation class]]) {//點擊一個大頭針時移除其他彈出詳情視圖 // [self removeCustomAnnotation];//添加詳情大頭針,渲染此大頭針視圖時將此模型對象賦值給自定義大頭針視圖完成自動布局KCCalloutAnnotation *annotation1=[[KCCalloutAnnotation alloc]init];annotation1.icon=annotation.icon;annotation1.detail=annotation.detail;annotation1.rate=annotation.rate;annotation1.coordinate=view.annotation.coordinate;[mapView addAnnotation:annotation1];} }#pragma mark 取消選中時觸發 -(void)mapView:(MKMapView *)mapView didDeselectAnnotationView:(MKAnnotationView *)view{[self removeCustomAnnotation]; }#pragma mark 移除所用自定義大頭針 -(void)removeCustomAnnotation{[_mapView.annotations enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) {if ([obj isKindOfClass:[KCCalloutAnnotation class]]) {[_mapView removeAnnotation:obj];}}]; } @end?

    在這個過程中需要注意幾點:

    1.大頭針A作為一個普通大頭針,其中最好保存自定義大頭針視圖C所需要的模型以便根據不同的模型初始化視圖。

    2.自定義大頭針視圖C的大頭針模型B中不需要title、subtitle屬性,最好設置為只讀;模型中最后保存自定義大頭針視圖C所需要的布局模型數據。

    3.只有點擊非B類大頭針時才新增自定義大頭針,并且增加時要首先移除其他B類大頭針避免重疊(一般建議放到取消大頭針選擇的代理方法中)。

    4.通常在自定義大頭針視圖C設置大頭針模型時布局界面,此時需要注意新增大頭針的位置,通常需要偏移一定的距離才能達到理想的效果。

    運行效果:

    使用自帶的地圖應用

    除了可以使用MapKit框架進行地圖開發,對地圖有精確的控制和自定義之外,如果對于應用沒有特殊要求的話選用蘋果自帶的地圖應用也是一個不錯的選擇。使用蘋果自帶的應用時需要用到MapKit中的MKMapItem類,這個類有一個openInMapsWithLaunchOptions:動態方法和一個openMapsWithItems: launchOptions:靜態方法用于打開蘋果地圖應用。第一個方法用于在地圖上標注一個位置,第二個方法除了可以標注多個位置外還可以進行多個位置之間的駕駛導航,使用起來也是相當方便。在熟悉這兩個方法使用之前有必要對兩個方法中的options參數做一下簡單說明:

    鍵(常量)說明
    MKLaunchOptionsDirectionsModeKey路線模式,常量MKLaunchOptionsDirectionsModeDriving? 駕車模式
    MKLaunchOptionsDirectionsModeWalking 步行模式
    MKLaunchOptionsMapTypeKey地圖類型,枚舉MKMapTypeStandard :標準模式
    MKMapTypeSatellite :衛星模式
    MKMapTypeHybrid? :混合模式
    MKLaunchOptionsMapCenterKey中心點坐標,CLLocationCoordinate2D類型?
    MKLaunchOptionsMapSpanKey地圖顯示跨度,MKCoordinateSpan 類型?
    MKLaunchOptionsShowsTrafficKey是否 顯示交通狀況,布爾型?
    MKLaunchOptionsCameraKey3D地圖效果,MKMapCamera類型
    注意:此屬性從iOS7及以后可用,前面的屬性從iOS6開始可用
    ?

    單個位置的標注

    下面的代碼演示了如何在蘋果自帶地圖應用上標記一個位置,首先根據反地理編碼獲得一個CLPlacemark位置對象,然后將其轉換為MKPlacemark對象用于MKMapItem初始化,最后調用其openInMapsWithLaunchOptions:打開地圖應用并標記:

    // // KCMainViewController.m // AppleMap // // Created by Kenshin Cui on 14/3/27. // Copyright (c) 2014年 Kenshin Cui. All rights reserved. //#import "KCMainViewController.h" #import <CoreLocation/CoreLocation.h> #import <MapKit/MapKit.h>@interface KCMainViewController () @property (nonatomic,strong) CLGeocoder *geocoder; @end@implementation KCMainViewController- (void)viewDidLoad {[super viewDidLoad];_geocoder=[[CLGeocoder alloc]init];[self location]; }#pragma mark 在地圖上定位 -(void)location{//根據“北京市”進行地理編碼[_geocoder geocodeAddressString:@"北京市" completionHandler:^(NSArray *placemarks, NSError *error) {CLPlacemark *clPlacemark=[placemarks firstObject];//獲取第一個地標MKPlacemark *mkplacemark=[[MKPlacemark alloc]initWithPlacemark:clPlacemark];//定位地標轉化為地圖的地標NSDictionary *options=@{MKLaunchOptionsMapTypeKey:@(MKMapTypeStandard)};MKMapItem *mapItem=[[MKMapItem alloc]initWithPlacemark:mkplacemark];[mapItem openInMapsWithLaunchOptions:options];}]; } @end

    運行效果:

    標記多個位置

    如果要標記多個位置需要調用MKMapItem的靜態方法,下面的代碼演示中需要注意,使用CLGeocoder進行定位時一次只能定位到一個位置,所以第二個位置定位放到了第一個位置獲取成功之后。

    // // KCMainViewController.m // AppleMap // // Created by Kenshin Cui on 14/3/27. // Copyright (c) 2014年 Kenshin Cui. All rights reserved. //#import "KCMainViewController.h" #import <CoreLocation/CoreLocation.h> #import <MapKit/MapKit.h>@interface KCMainViewController () @property (nonatomic,strong) CLGeocoder *geocoder; @end@implementation KCMainViewController- (void)viewDidLoad {[super viewDidLoad];_geocoder=[[CLGeocoder alloc]init];[self listPlacemark]; }-(void)listPlacemark{//根據“北京市”進行地理編碼[_geocoder geocodeAddressString:@"北京市" completionHandler:^(NSArray *placemarks, NSError *error) {CLPlacemark *clPlacemark1=[placemarks firstObject];//獲取第一個地標MKPlacemark *mkPlacemark1=[[MKPlacemark alloc]initWithPlacemark:clPlacemark1];//注意地理編碼一次只能定位到一個位置,不能同時定位,所在放到第一個位置定位完成回調函數中再次定位[_geocoder geocodeAddressString:@"鄭州市" completionHandler:^(NSArray *placemarks, NSError *error) {CLPlacemark *clPlacemark2=[placemarks firstObject];//獲取第一個地標MKPlacemark *mkPlacemark2=[[MKPlacemark alloc]initWithPlacemark:clPlacemark2];NSDictionary *options=@{MKLaunchOptionsMapTypeKey:@(MKMapTypeStandard)};//MKMapItem *mapItem1=[MKMapItem mapItemForCurrentLocation];//當前位置MKMapItem *mapItem1=[[MKMapItem alloc]initWithPlacemark:mkPlacemark1];MKMapItem *mapItem2=[[MKMapItem alloc]initWithPlacemark:mkPlacemark2];[MKMapItem openMapsWithItems:@[mapItem1,mapItem2] launchOptions:options];}];}]; } @end

    運行效果:

    地圖導航

    要使用地圖導航功能在自帶地圖應用中相當簡單,只要設置參數配置導航模式即可,例如在上面代碼基礎上設置駕駛模式,則地圖應用會啟動駕駛模式計算兩點之間的距離同時對路線進行規劃。

    // // KCMainViewController.m // AppleMap // // Created by Kenshin Cui on 14/3/27. // Copyright (c) 2014年 Kenshin Cui. All rights reserved. //#import "KCMainViewController.h" #import <CoreLocation/CoreLocation.h> #import <MapKit/MapKit.h>@interface KCMainViewController () @property (nonatomic,strong) CLGeocoder *geocoder; @end@implementation KCMainViewController- (void)viewDidLoad {[super viewDidLoad];_geocoder=[[CLGeocoder alloc]init];[self turnByTurn]; }-(void)turnByTurn{//根據“北京市”地理編碼[_geocoder geocodeAddressString:@"北京市" completionHandler:^(NSArray *placemarks, NSError *error) {CLPlacemark *clPlacemark1=[placemarks firstObject];//獲取第一個地標MKPlacemark *mkPlacemark1=[[MKPlacemark alloc]initWithPlacemark:clPlacemark1];//注意地理編碼一次只能定位到一個位置,不能同時定位,所在放到第一個位置定位完成回調函數中再次定位[_geocoder geocodeAddressString:@"鄭州市" completionHandler:^(NSArray *placemarks, NSError *error) {CLPlacemark *clPlacemark2=[placemarks firstObject];//獲取第一個地標MKPlacemark *mkPlacemark2=[[MKPlacemark alloc]initWithPlacemark:clPlacemark2];NSDictionary *options=@{MKLaunchOptionsMapTypeKey:@(MKMapTypeStandard),MKLaunchOptionsDirectionsModeKey:MKLaunchOptionsDirectionsModeDriving};//MKMapItem *mapItem1=[MKMapItem mapItemForCurrentLocation];//當前位置MKMapItem *mapItem1=[[MKMapItem alloc]initWithPlacemark:mkPlacemark1];MKMapItem *mapItem2=[[MKMapItem alloc]initWithPlacemark:mkPlacemark2];[MKMapItem openMapsWithItems:@[mapItem1,mapItem2] launchOptions:options];}];}]; } @end

    運行效果:

    注意:其實如果不用蘋果自帶的地圖應用也可以實現地圖導航,MapKit中提供了MKDirectionRequest對象用于計算路線,提供了MKDirections用于計算方向,這樣一來只需要調用MKMapView的addOverlay等方法添加覆蓋物即可實現類似的效果,有興趣的朋友可以試一下。

    由于定位和地圖框架中用到了諸多類,有些初學者容易混淆,下面簡單對比一下。

    CLLocation:用于表示位置信息,包含地理坐標、海拔等信息,包含在CoreLoaction框架中。

    MKUserLocation:一個特殊的大頭針,表示用戶當前位置。

    CLPlacemark:定位框架中地標類,封裝了詳細的地理信息。

    MKPlacemark:類似于CLPlacemark,只是它在MapKit框架中,可以根據CLPlacemark創建MKPlacemark。

    轉載于:https://www.cnblogs.com/leilei123/p/4922736.html

    總結

    以上是生活随笔為你收集整理的ios 地图的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

    91人人视频在线观看 | 久久精品国产亚洲 | 亚洲婷婷综合色高清在线 | www在线观看视频 | 国产三级国产精品国产专区50 | 97视频免费播放 | 又紧又大又爽精品一区二区 | 婷婷婷国产在线视频 | 日韩18p| 久久精品视频中文字幕 | 日韩无在线 | 欧美aaa视频 | 伊人成人精品 | 日韩激情视频在线观看 | 日日干天天操 | 午夜12点 | 91传媒免费在线观看 | 精品国偷自产国产一区 | 在线观看黄色 | 婷婷婷国产在线视频 | 日韩高清免费在线观看 | 蜜桃麻豆www久久囤产精品 | 不卡的av在线播放 | 久香蕉 | 久久午夜国产 | 在线观看成人一级片 | 天天综合网 天天综合色 | 久久精品99国产精品亚洲最刺激 | 精品国产福利在线 | av资源网在线播放 | 五月色婷| 日韩欧美一区二区在线播放 | 这里有精品在线视频 | 在线观看mv的中文字幕网站 | 波多野结衣电影一区二区三区 | 国产一区二区观看 | 天天拍天天干 | 五月天综合色 | 亚洲经典视频在线观看 | 免费黄色看片 | 国产免费影院 | 成人中文字幕av | 国产视频在线播放 | 狠狠躁夜夜躁人人爽超碰97香蕉 | 成人免费观看在线视频 | 天天色天天搞 | 中文字幕在线看视频 | 欧美激情精品久久久 | 国产毛片久久久 | 日韩一区二区三免费高清在线观看 | 国产精品久久久久久av | 在线免费视频一区 | av超碰在线 | 色综合久久久 | 久久黄网站 | 日韩精品一区二区免费视频 | 成年人免费在线看 | 国产免费人人看 | 欧美 亚洲 另类 激情 另类 | 欧美一区二区三区在线播放 | 91大神dom调教在线观看 | 手机看片中文字幕 | 国产日本亚洲 | 精品视频一区在线 | 永久免费av在线播放 | 国产一区网址 | 国产一区免费在线 | 久久九九国产精品 | 国产99免费| 久久蜜臀一区二区三区av | 91精品啪在线观看国产线免费 | 黄毛片在线观看 | 国产精品资源在线观看 | 丁香资源影视免费观看 | 国产精品videoxxxx | 午夜12点 | 欧美色图狠狠干 | 免费成人在线视频网站 | 91日韩国产 | 国产一区二区久久久久 | 天天色天天色天天色 | 中文字幕日韩精品有码视频 | 国产精品欧美精品 | 日韩免费b| 欧美人牲 | 日本成人免费在线观看 | 99电影 | 国产原厂视频在线观看 | 丁香一区二区 | 免费观看一区二区三区视频 | 就要干b | 在线观看视频国产 | 日韩午夜精品 | 日韩最新在线 | 午夜电影 电影 | 天堂麻豆 | 国产亚洲观看 | 日韩美女久久 | 国产精品免费视频观看 | 99视频在线播放 | 国产字幕在线看 | 久久久久久99精品 | 国产最新视频在线观看 | 日本一区二区高清不卡 | 午夜久久福利视频 | 青青河边草免费 | 九九99| 五月婷婷激情六月 | 国产 色| 色香天天| 91精品区| 日韩欧美一区二区在线 | 亚洲精品美女久久17c | 国产精品99久久久久久小说 | 日韩理论在线观看 | 91亚洲精品国偷拍 | 国产精品剧情 | www国产精品com | 欧美国产亚洲精品久久久8v | 日本中文字幕电影在线免费观看 | 精品久久久久久国产 | 亚洲一区二区三区毛片 | 99精品美女 | 欧美xxxx性xxxxx高清 | 成人在线免费av | 人人爽人人干 | 在线a亚洲视频播放在线观看 | 亚洲综合视频在线观看 | 欧美日韩不卡一区二区三区 | 午夜在线免费观看 | 中文字幕在线观看第一区 | 99视频在线观看免费 | 国产精品中文字幕在线 | 国产福利中文字幕 | 亚洲综合成人婷婷小说 | 欧美9999 | 欧美韩国日本在线观看 | 日本精品久久久久影院 | 国产三级香港三韩国三级 | 国产a级免费 | 亚洲免费小视频 | 在线免费黄 | 亚洲综合小说电影qvod | 免费在线观看av网址 | 91精品国产92久久久久 | 日韩av中文在线 | 成年人黄色免费视频 | 亚洲成人国产 | 丁香视频全集免费观看 | 在线国产99 | www夜夜操com | 五月婷婷综合激情网 | 丁香六月婷婷激情 | av888av.com| 麻豆精品视频 | 一区国产精品 | 久久久久麻豆v国产 | 91插插视频 | 色综合中文字幕 | 久久国语| 欧美日韩亚洲在线观看 | 99成人在线视频 | 91高清免费在线观看 | 日韩区在线观看 | 91综合久久一区二区 | 91av官网 | 天天做天天射 | 五月婷香 | 国产精品久久嫩一区二区免费 | 色综合久久久久综合体桃花网 | 九九久久视频 | 国产高清av | 在线观看一区二区精品 | 国产精品黄色在线观看 | 欧美资源在线观看 | 香蕉视频在线看 | 亚洲欧美一区二区三区孕妇写真 | 日韩一区二区免费播放 | www.久艹| 日韩视频中文 | 日本深夜福利视频 | 国产精品福利一区 | 国产欧美日韩精品一区二区免费 | 婷婷新五月 | 五月婷婷视频在线 | 国产一级久久久 | 久久国产精品久久国产精品 | 日韩在线第一 | 精品久久福利 | 色婷婷视频在线观看 | 亚洲国产精品一区二区尤物区 | 最新精品国产 | 国产1级毛片 | 99re8这里有精品热视频免费 | 日日干夜夜爱 | 午夜精品久久久久久久99水蜜桃 | 91精品视频免费看 | 二区三区中文字幕 | 少妇18xxxx性xxxx片 | 天天色天天干天天色 | 伊人亚洲综合网 | 91在线日韩 | 久久久久国产一区二区三区四区 | 久久精品一区二区国产 | 97视频资源 | 91精品无人成人www | 五月婷在线观看 | 日韩网站一区 | 中文字幕永久免费 | 国产九九九九九 | 波多野结依在线观看 | 少妇bbw搡bbbb搡bbbb | 一区二区精品视频 | 国产精品福利小视频 | 国产一在线精品一区在线观看 | 在线视频手机国产 | 亚洲三级在线播放 | 久久好看免费视频 | 午夜精品久久久久久久久久久久久久 | 久久欧美在线电影 | 色搞搞 | 久久久久久久久久久国产精品 | 欧美a√大片 | 黄色毛片一级 | 日本黄色a级大片 | 成人性生交大片免费看中文网站 | 香蕉久草| 亚洲精品在线视频播放 | 在线黄色国产 | 国产精品综合在线观看 | 欧美日韩国产网站 | 97视频免费| 精品免费视频. | 久久精品视频免费观看 | 久久久久久久久久久久久久av | 国产丝袜制服在线 | 国产尤物在线视频 | 国产精品免费av | 99九九视频| 麻花传媒mv免费观看 | 最新国产精品视频 | 国产黄色片免费观看 | 99精品美女 | 久久免费公开视频 | 天天干天天干天天干天天干天天干天天干 | 999久久久欧美日韩黑人 | 精品国产成人 | 97国产情侣爱久久免费观看 | 日韩在线视频线视频免费网站 | 国产黄色视 | 欧美性大战久久久久 | 欧洲av不卡 | 亚洲精品成人av在线 | 精品国产福利在线 | 免费观看xxxx9999片 | 日批视频在线播放 | 日韩在线免费不卡 | 亚洲成人精品在线 | 国产视频一区二区在线 | 久久久久久久久黄色 | 精品国产电影一区二区 | 国产精品久久久久久久久久久久午 | 亚洲精品乱码久久久久久蜜桃不爽 | 国产精品久久久久久久久久久久午 | 天堂网在线视频 | 五月天综合激情 | 成 人 黄 色 视频 免费观看 | 亚洲专区一二三 | 欧美有色 | 国产做aⅴ在线视频播放 | 久草视频在线观 | 一区二区三区在线免费播放 | 亚洲精品高清视频 | 91视频这里只有精品 | 久草在在线 | 91桃色在线观看视频 | 九九九国产 | 欧美日韩免费在线视频 | 免费人成在线观看网站 | 蜜臀av夜夜澡人人爽人人桃色 | 久久久免费电影 | 日本最新一区二区三区 | 91成人午夜| 亚洲高清免费在线 | 国产99视频在线观看 | 欧美人zozo | 不卡国产视频 | 在线观看aaa| 91免费黄视频 | 天天天干| 麻豆国产精品va在线观看不卡 | 欧美伊人网 | 欧美一级久久久久 | 超碰97在线人人 | 在线观看国产www | 色综合www | 亚洲精品国产精品国自产观看 | 韩日av在线 | www.香蕉视频在线观看 | 免费黄色激情视频 | 中文字幕亚洲国产 | 国产精品成人一区二区三区吃奶 | 黄色片网站 | sm免费xx网站| 人人狠狠综合久久亚洲 | 18做爰免费视频网站 | 在线播放精品一区二区三区 | 91在线免费观看网站 | 伊人va | 中文字幕在线看片 | 国产精品激情偷乱一区二区∴ | 国产视频欧美视频 | 日韩免费不卡视频 | 久视频在线播放 | 国产福利在线不卡 | 色网站在线 | 999久久久免费精品国产 | 日韩欧美精选 | 狠狠干成人 | 亚洲a资源 | 成人播放器 | 97免费在线观看视频 | 国内精品久久久久久久久久久久 | 国产午夜精品一区二区三区 | 天天躁日日 | 成人三级网站在线观看 | 欧美日韩中文国产 | 96精品在线 | 91男人影院| 91免费网址 | 国产视频在线观看免费 | 亚洲精欧美一区二区精品 | 亚洲精品国产品国语在线 | 国产精品九九热 | 欧美一级电影在线观看 | 亚洲精品中文字幕在线观看 | 91成人精品一区在线播放 | 91在线91 | aaa日本高清在线播放免费观看 | 国产激情小视频在线观看 | 色婷婷狠狠18 | 国产91aaa| 日韩亚洲精品电影 | 日韩在线第一区 | 男女全黄一级一级高潮免费看 | 国产又粗又猛又黄又爽视频 | 欧美视频www | 成人精品一区二区三区电影免费 | 97人人网 | 婷婷丁香六月天 | 亚洲另类交 | 在线影视 一区 二区 三区 | 综合网天天色 | 成人午夜精品 | 麻豆小视频在线观看 | 国产成人精品999在线观看 | av天天澡天天爽天天av | 免费观看一区二区 | 欧美极品一区二区三区 | 欧洲一区二区三区精品 | 在线观看中文字幕网站 | 中文字幕在线观看完整版 | 亚洲黄色在线观看 | 国产在线不卡精品 | 在线免费成人 | 亚洲日本一区二区在线 | 狠狠色丁香婷综合久久 | 黄色国产精品 | 久久伦理 | 天天干天天爽 | 久草网在线观看 | 九九九九热精品免费视频点播观看 | 97超碰总站 | 国产高清无线码2021 | 国产在线传媒 | 一区在线播放 | 91精品国产自产老师啪 | 欧美 国产 视频 | 激情六月婷婷久久 | 色网站免费在线看 | 在线观看一级 | 九色精品免费永久在线 | 丁香九月婷婷综合 | 一级黄色片在线免费看 | 亚洲国产日本 | 亚洲欧美视频 | 色综合五月天 | 久久久久久久久久影院 | 天天爱天天干天天爽 | 久草五月| 国产超碰97 | 久久综合久久伊人 | 婷婷久操| 欧美一级日韩免费不卡 | 91九色在线视频观看 | 国产成人精品综合久久久 | 亚洲国产黄色片 | 欧美日韩高清免费 | 久久久久久久电影 | 国产精品久久久久久久久久久久午 | 久久8| av免费观看高清 | 一区二区三区在线免费观看视频 | 911精品视频 | 国产福利av | 国产精品久久久久永久免费看 | 久久激情网站 | 久久久黄色av| 亚av在线 | 中文字幕 婷婷 | 黄a网站 | 天天添夜夜操 | 久久免费的视频 | 亚洲五月婷| 欧美日韩一区二区视频在线观看 | 中文久草 | 在线观看精品视频 | 麻豆视频免费入口 | 安徽妇搡bbbb搡bbbb | 国产伦理一区 | 精品视频区| 欧美精品中文字幕亚洲专区 | 视频在线一区 | 国产精品一区免费看8c0m | 日日夜夜骑 | 毛片在线播放网址 | 久久久久看片 | 国产小视频在线观看免费 | 国产精品一区二区av日韩在线 | 久久久99国产精品免费 | 免费观看黄色12片一级视频 | 天天综合色 | 久久久影视 | 91丨九色丨首页 | 成人欧美一区二区三区在线观看 | 日韩一区二区三区高清在线观看 | 亚洲午夜久久久久久久久 | 黄色三级视频片 | 亚洲精选视频在线 | 91色综合| 日韩在线中文字幕视频 | 在线免费观看视频一区 | 五月婷综合 | 婷婷免费视频 | 91色视频 | www日日夜夜 | 日韩精品视频久久 | jizz999| 中文av网站 | 国产亚洲欧美一区 | 国产精品久久久久久麻豆一区 | 国产一级免费在线 | 国产精品女同一区二区三区久久夜 | 欧美性爽爽 | 欧美va日韩va | 99久久国产免费看 | 国产大尺度视频 | 国产精品99久久久精品免费观看 | 天天五月天色 | 91精品国产一区二区在线观看 | 爱色av.com| 丁香六月五月婷婷 | 午夜精品福利在线 | 国产69久久 | 国内精品久久久久久 | 在线免费观看黄 | 日本高清中文字幕有码在线 | 亚洲精品黄| 国产专区精品视频 | 国产手机视频在线观看 | 成人av在线观 | 激情视频一区二区三区 | 91毛片在线观看 | 麻豆国产精品va在线观看不卡 | 国产精品久久av | 在线观看网站你懂的 | 国产123区在线观看 国产精品麻豆91 | 特及黄色片 | 亚洲精品av在线 | 精品视频免费在线 | 91亚洲精品乱码久久久久久蜜桃 | 超碰在线最新网址 | 国产精品中文字幕在线 | 久久久高清 | 韩日电影在线观看 | 国产专区在线播放 | 亚洲精品国产综合99久久夜夜嗨 | www.精选视频.com | 中文字幕av播放 | 欧美色综合天天久久综合精品 | 欧美成人区 | 亚洲3级| 国产原创中文在线 | 国产精品美 | 操夜夜操 | 91高清免费观看 | 色婷婷av在线 | 日韩中文字幕在线观看 | 精品一区二区日韩 | 国产成人精品综合 | 激情久久综合网 | 亚洲成色777777在线观看影院 | 99免费看片 | 欧美成人999 | 黄色一级动作片 | 91精品视频网站 | 免费在线观看av网址 | 国产视频中文字幕在线观看 | 九九在线视频免费观看 | 久草在线视频中文 | 人人添人人澡 | 国产破处在线视频 | 综合激情网... | 国产97色 | 国产午夜三级一二三区 | 国产999视频在线观看 | 亚州精品一二三区 | 国产高清99 | 97超碰在线人人 | 日韩免费视频一区二区 | av国产在线观看 | 国产综合激情 | 亚洲一区二区三区四区在线视频 | 国产一区二区中文字幕 | www99精品| 美女免费网站 | 欧美日韩a视频 | 久久天天躁狠狠躁亚洲综合公司 | 亚洲精品456在线播放 | av最新资源 | 91精品1区| 五月激情六月丁香 | 国产精品久久久久av免费 | 天天插一插| 在线观看日本高清mv视频 | 亚洲无吗天堂 | 天天干天天射天天插 | 亚洲最新av在线网站 | 亚洲欧美成人综合 | 99热精品国产 | 国产一级片免费观看 | 久草在线精品观看 | 婷婷久久婷婷 | 伊人婷婷 | 久久精品91久久久久久再现 | 久影院| 精品久久综合 | 亚洲视频免费视频 | 国产精品美女在线观看 | 亚洲国内精品在线 | 婷婷深爱五月 | www.夜夜操| av免费在线观看1 | 日日草夜夜操 | 亚洲精品乱码久久久一二三 | 91插插插免费视频 | 园产精品久久久久久久7电影 | 天天射天天爱天天干 | 不卡av电影在线观看 | 亚洲国产精品成人va在线观看 | 成人午夜电影久久影院 | 久久久国产影院 | 欧美日韩中文国产一区发布 | 最近中文字幕大全中文字幕免费 | 欧美精品中文字幕亚洲专区 | 一级淫片在线观看 | 日韩精品一二三 | 久草在线手机观看 | 精品免费一区二区三区 | 美女免费黄网站 | 天天综合天天做天天综合 | 成人三级网址 | 天天色天天上天天操 | 人人爽人人爽人人片av免 | 99久久日韩精品免费热麻豆美女 | av九九九 | 五月婷婷综合激情 | 国产亚州精品视频 | 日韩精品一区二区三区视频播放 | 超碰在97| 国产精品免费麻豆入口 | www亚洲精品 | 国产一区二区久久久久 | 美女精品在线 | 亚洲婷婷在线 | 亚洲精品国产区 | 九九九在线观看视频 | 久久免费视频3 | 美女久久视频 | 99久久这里有精品 | 欧美日韩有码 | av大全免费在线观看 | 久久精品电影院 | 欧美成人69av | 又黄又爽又无遮挡的视频 | 二区在线播放 | 久久一二三四 | 99re亚洲国产精品 | 91成人精品 | 天堂激情网 | 欧美日韩在线播放 | 伊人网综合在线观看 | 97在线观看免费高清完整版在线观看 | 精品久久久久久久久久久院品网 | 精品久久网 | 高潮久久久久久 | 亚洲五月婷 | 欧美成亚洲 | 久久久久免费看 | 九九爱免费视频 | 五月开心色 | 欧美一区二区三区在线观看 | 午夜美女福利 | 久久久久久久久国产 | 高清在线一区二区 | 日韩动态视频 | 91精品国产福利在线观看 | 狠狠色丁香婷婷综合橹88 | 98超碰在线观看 | 精品免费视频 | 在线观看av黄色 | 亚洲美女精品区人人人人 | 国产无遮挡又黄又爽在线观看 | 国产精品久久久久影院日本 | av一区二区三区在线观看 | av福利电影| 国产91免费在线观看 | 久香蕉| 99国产在线观看 | 国产在线精品一区二区 | ,午夜性刺激免费看视频 | 99久久精品免费看国产 | 成人动漫一区二区三区 | 精品视频一区在线观看 | 麻豆国产精品永久免费视频 | 最近中文字幕久久 | 福利一区二区在线 | 亚洲免费精品视频 | 美女黄网久久 | 国内亚洲精品 | 天天干天天射天天操 | 国产二区视频在线 | 久久不卡国产精品一区二区 | 有码中文在线 | 日韩在线观看小视频 | 9999免费视频 | 国产 日韩 在线 亚洲 字幕 中文 | 麻豆一级视频 | 青草草在线视频 | 五月天亚洲婷婷 | 亚洲午夜激情网 | 精品一区久久 | 成人午夜免费剧场 | 99九九热只有国产精品 | 国内免费的中文字幕 | 97色在线观看 | 亚洲免费视频观看 | 国产精品中文字幕在线观看 | 欧美成人h版在线观看 | 特级黄色视频毛片 | 国产精品久久久久久久久久久久 | 久久综合九色综合欧美就去吻 | 日韩欧美在线视频一区二区 | 国产一区欧美在线 | 久产久精国产品 | 欧美日韩二区三区 | 天天爱天天操天天干 | av3级在线 | 最新国产在线观看 | 视频91在线| 国产精品片 | www.亚洲精品视频 | 99久精品视频| 国产伦理精品一区二区 | 国产男女免费完整视频 | 91成人天堂久久成人 | 狠狠色噜噜狠狠狠狠2021天天 | 午夜婷婷在线观看 | 国产精品亚洲片在线播放 | 99国产精品久久久久老师 | 国产成人免费 | 五月天伊人 | 波多野结衣久久资源 | 国产成人av免费在线观看 | 日韩一级片网址 | 久久久久国产精品免费免费搜索 | 国产精品美女久久久久久久久久久 | 亚洲国产精品视频 | 91av播放 | 一区二区中文字幕在线 | 色九九在线 | 国产五月 | 又爽又黄在线观看 | 国产亚洲午夜高清国产拍精品 | 亚洲午夜久久久久 | 五月天天色 | 亚洲男男gⅴgay双龙 | av在线看网站 | 中文字幕中文字幕在线中文字幕三区 | 国偷自产中文字幕亚洲手机在线 | 草久热 | 91av亚洲 | 天天艹日日干 | 波多野结衣电影久久 | av解说在线 | 色干综合| 日韩在线第一 | 国产精品一区二区精品视频免费看 | 国产三级精品三级在线观看 | 成人一区二区三区在线观看 | 日韩av中文字幕在线 | 黄色一级在线视频 | 亚洲最大av | 久久精品网址 | 国产一级黄大片 | 久久精品综合网 | 国产r级在线观看 | 十八岁以下禁止观看的1000个网站 | 日韩欧美一区二区三区视频 | 色婷婷福利视频 | 国产xxxx做受性欧美88 | 亚洲高清视频在线播放 | 狠狠的操你 | 91中文字幕一区 | 美女精品久久久 | 国产精品一区电影 | 中文字幕在线视频网站 | 麻豆国产精品va在线观看不卡 | 国产字幕在线看 | 日韩高清观看 | 91色综合 | 色婷婷av一区二 | 欧洲精品久久久久毛片完整版 | av在线短片 | 日韩字幕在线 | 黄免费在线观看 | 欧美ⅹxxxxxx | 999久久国产精品免费观看网站 | 国产中文字幕视频在线观看 | 91九色蝌蚪视频在线 | 麻豆免费观看视频 | 国产午夜亚洲精品 | 天堂在线一区二区 | 国产精品久久av | 91成人网页版 | 国产精品porn | 一区二区视频在线免费观看 | 欧美国产高清 | 久久久久国产成人免费精品免费 | 欧美精品免费一区二区 | 欧美久久久久久久久久久 | 91精品久久久久久久久久入口 | 久久久久免费精品视频 | 91 在线视频播放 | 国产不卡在线观看视频 | 亚洲精品网址在线观看 | 97精品国产97久久久久久久久久久久 | 日韩欧美国产免费播放 | 日韩在线大片 | 最新国产精品视频 | 91精品一区二区三区蜜臀 | 亚洲春色奇米影视 | 黄色免费网战 | 欧美日韩在线免费观看视频 | 在线观看中文字幕一区二区 | 91看片一区二区三区 | 中文字幕高清在线播放 | 99久久国产免费,99久久国产免费大片 | 草莓视频在线观看免费观看 | 99精品国产福利在线观看免费 | 九九热99视频 | 女人18毛片90分钟 | 在线看中文字幕 | 综合久久网站 | 91.麻豆视频 | 97在线视频观看 | 久久精品4 | 国产精品久久 | 亚洲欧美视频在线播放 | 久久久久国产a免费观看rela | 成人午夜剧场在线观看 | 欧美韩国日本在线观看 | 久久免费观看少妇a级毛片 久久久久成人免费 | 黄色国产区| 欧美日韩视频免费 | 久久久久成人精品免费播放动漫 | 欧美日韩中文国产一区发布 | 国产精品视频99 | jizzjizzjizz亚洲 | 美女黄视频免费 | 在线成人av | 人人玩人人爽 | 毛片永久新网址首页 | 国产一线二线三线在线观看 | 国产美女主播精品一区二区三区 | 97色在线观看免费视频 | 99精品视频精品精品视频 | 亚洲国产免费看 | 中午字幕在线 | 亚洲jizzjizz日本少妇 | 一区二区三区免费网站 | 狠狠干美女 | 亚洲最新视频在线播放 | 夜色资源站wwwcom | 亚洲v欧美v国产v在线观看 | 操操操干干干 | 99久久婷婷国产一区二区三区 | 欧美激情精品一区 | 色婷婷狠狠五月综合天色拍 | 成人一级黄色片 | 91免费看黄色 | 色吊丝av中文字幕 | 91黄色小网站 | 亚洲 欧洲av | 亚州国产精品视频 | 友田真希x88av | 激情视频国产 | 国产在线1区 | 毛片随便看 | 国产97视频 | 在线观看视频日韩 | 国产999精品久久久久久绿帽 | 亚洲a资源| 黄色的视频网站 | 91原创在线观看 | 久久精品成人热国产成 | 91色视频| 美女久久久久久久 | 国内视频| 色悠悠久久综合 | 久久高清精品 | 国产一区免费 | 九九视频在线播放 | 美女视频黄在线观看 | 人人看人人做人人澡 | 三级a毛片| 国产高清区 | 97精品在线 | 亚洲性视频| 黄色小说在线观看视频 | 制服丝袜亚洲 | 黄色大片国产 | 欧美日韩免费一区二区 | 99视频在线精品 | 婷婷色网视频在线播放 | 又大又硬又黄又爽视频在线观看 | 久久成人一区二区 | 视频一区久久 | 婷婷色网视频在线播放 | 伊人六月 | 五月婷婷激情五月 | 久草网免费 | 欧美一级电影在线观看 | 免费av高清 | 久久黄色网页 | 亚洲激情综合 | 亚洲另类在线视频 | 亚洲午夜小视频 | 久久成人午夜 | 国产综合婷婷 | 狠狠色狠狠色合久久伊人 | 国产原创在线观看 | 少妇超碰在线 | 亚洲国产av精品毛片鲁大师 | 久久久av电影 | 96av在线| 91视频久久久久久 | 99久久国产免费,99久久国产免费大片 | 日韩区欧美久久久无人区 | 日韩a在线| 亚洲欧美视频在线播放 | 国产超碰97 | 中文国产成人精品久久一 | 婷婷六月色 | 天天舔夜夜操 | 中文字幕在线观看第二页 | 黄色一二级片 | 午夜久久影视 | 国内精品久久久久久久久久清纯 | 日韩手机在线观看 | 天天色天天上天天操 | 天天操比| 婷婷丁香色 | 在线精品视频免费播放 | 欧美成人在线网站 | 精一区二区| 国产精品专区在线观看 | 久草视频免费播放 | 久久麻豆视频 | 91手机视频在线 | 色综合亚洲精品激情狠狠 | 手机在线欧美 | 国产精彩在线视频 | 丁香视频在线观看 | 黄色av一区| 在线中文字幕视频 | 国产91成人在在线播放 | 久久久久久麻豆 | 亚洲天天做 | 婷婷色狠狠 | 国产精品久久99 | 夜夜操夜夜干 | 免费看wwwwwwwwwww的视频 久久久久久99精品 91中文字幕视频 | 国产日韩欧美视频在线观看 | 国产午夜精品一区二区三区 | 天天干天天射天天爽 | 久草免费在线观看视频 | 久久免费视频这里只有精品 | 91成人在线视频 | 91免费网| 日韩丝袜 | av视屏在线 | 久久婷婷激情 | 四虎永久国产精品 | 97超碰在线久草超碰在线观看 | 国产露脸91国语对白 | 日本中文字幕视频 | 日韩电影一区二区三区 | 黄色片网站 | 4438全国亚洲精品在线观看视频 | 91手机视频在线 | 美女网站视频久久 | 国产第一福利网 | 色综合中文字幕 | 日韩在线视频一区二区三区 | 亚洲作爱视频 | 国产不卡精品 | 中文字幕丰满人伦在线 | 九九九在线| 午夜私人影院久久久久 | av三级在线免费观看 | 99久久精品免费看国产免费软件 | 国产一区二区在线播放 | 免费国产一区二区视频 | 看片网站黄 | 亚洲欧美日韩中文在线 | 亚洲视频播放 | 国产又粗又硬又爽的视频 | 黄色网址中文字幕 | 97超碰人人澡人人爱学生 | 亚洲精品乱码久久久久 | 精品亚洲免费 | 日韩精品 在线视频 | 欧美日韩视频在线 | 日日干美女 | 亚洲国产中文字幕在线观看 | 综合天堂av久久久久久久 | 狠色狠色综合久久 | 日韩一区二区三区免费视频 | 亚洲欧洲美洲av | 狠狠色丁香九九婷婷综合五月 | 草久久久久久 | 婷婷六月综合网 | 日韩在线观看不卡 | 天天干,天天干 | 亚洲天堂网在线播放 | 国产欧美精品在线观看 | 成人va视频 | 高清不卡一区二区在线 | 亚洲激情久久 | 激情综合国产 | wwwwwww色| 亚洲欧洲精品视频 | 免费在线日韩 | 色综合久久久久综合 | 亚洲人av免费网站 | www日韩欧美 | 精品国产91亚洲一区二区三区www | 欧美黑人性猛交 | 中文字幕av最新更新 | 久久国产亚洲 | 免费观看国产精品 | 久久免费视频7 | 91cn国产在线 | 友田真希av| 九九热久久久 | 在线国产福利 | 手机av在线免费观看 | 中文字幕久久亚洲 | 国产九九热视频 | 99久久精品免费看 | 国产一区久久 | 成人在线免费观看视视频 | 国产日韩欧美在线观看视频 | 激情av五月婷婷 | 一本一本久久a久久精品牛牛影视 | 久久精品久久99 | 色综合久久悠悠 | 久久久久久久久影院 | 激情丁香 | 国产在线中文 | 日韩大片在线看 | 在线免费中文字幕 | 国产网站av | 99免费看片 | 国产精品 中文在线 | 亚洲毛片视频 | 久久视频精品在线 |