使用蘋果自帶地圖獲取當前位置及周圍信息

天朝的網(wǎng)絡在XXX的干預下,我們很多內(nèi)容都不能正常訪問,需要翻墻惠啄。處在這樣一個大的局域網(wǎng)環(huán)境之下,作為IT行業(yè)的我們很是苦惱,如果做的應用要世界通用,那就是痛苦了,需要考慮很多饿敲。例如:如果我們做一個地圖應用,兼容中國和外國。要么使用國內(nèi)地圖+Google困介,要么就是使用蘋果自帶地圖。今天主要介紹使用蘋果自帶地圖獲取用戶當前位置及用戶周圍信息,地圖移動時,地圖中間大頭針一直在中間,移動結束后有下落定位的動畫效果并更新當前位置及用戶周圍信息疫剃。需要真機測試查看效果仍侥。

先看效果:
gif動畫是在模擬器上錄制,由于模擬器不能獲取周圍信息捉偏,所以一直在轉(zhuǎn)菊花雷激。要看實際效果需要真機查看替蔬。

IMG_2365.PNG

步驟

  1. 添加庫MapKit.framework告私。

    模擬器效果展示

  2. 打開地圖功能屎暇。


    真機截圖
  3. 代碼實現(xiàn)。

  • 在用戶位置顯示完成后添加一個固定的ImageView在地圖正中間驻粟。
-(void)mapView:(MKMapView *)mapView didUpdateUserLocation:(MKUserLocation *)userLocation
{
    NSLog(@"userLocation:longitude:%f---latitude:%f",userLocation.location.coordinate.longitude,userLocation.location.coordinate.latitude);
    if (!haveGetUserLocation) {
        if (self.mapView.userLocationVisible) {
            haveGetUserLocation = YES;
            [self getAddressByLatitude:userLocation.coordinate.latitude longitude:userLocation.coordinate.longitude];
            [self addCenterLocationViewWithCenterPoint:self.mapView.center];
        }
        
    }
}


-(void)addCenterLocationViewWithCenterPoint:(CGPoint)point
{
    if (!imgView) {
        imgView = [[UIImageView alloc]initWithFrame:CGRectMake([UIScreen mainScreen].bounds.size.width/2, 100, 18, 38)];
        imgView.center = point;
        imgView.image = [UIImage imageNamed:@"map_location"];
        imgView.center = self.mapView.center;
        [self.view addSubview:imgView];
    }
    
}

  • 獲取當前位置周圍信息,蘋果提供了一個請求方法,MKLocalSearch根悼。其官方介紹為:

An MKLocalSearch object initiates a map-based search operation and delivers the results back to your app asynchronously. Search objects are designed to perform one search operation only. To perform several different searches, you must create separate instances of this class and start them separately.
也就是說我們?nèi)绻阉鞑煌念愋托枰謩e創(chuàng)建多個實例進行操作。

如果我們要搜索周圍100米餐廳代碼如下:

    MKCoordinateRegion region = MKCoordinateRegionMakeWithDistance(coordinate,100, 100);
    MKLocalSearchRequest *request = [[MKLocalSearchRequest alloc]init];
    request.region = region;
    request.naturalLanguageQuery = @"Restaurants";
    MKLocalSearch *localSearch = [[MKLocalSearch alloc]initWithRequest:request];
    [localSearch startWithCompletionHandler:^(MKLocalSearchResponse *response, NSError *error){
        if (!error) {
            //do something.
        }else{
            //do something.
        }
    }];

其中naturalLanguageQuery就是要搜索的關鍵字,我試過的所有關鍵字有cafe, supermarket,village,Community蜀撑,Shop,Restaurant挤巡,School,hospital酷麦,Company矿卑,Street,Convenience store沃饶,Shopping Centre母廷,Place names,Hotel糊肤,Grocery store每個關鍵字搜索返回結果只有10條琴昆,如果當前范圍無搜索結果,則擴散搜索范圍。如果你想列出周圍所有相關位置信息馆揉,我認為需要盡可能的把所有的能夠想到的關鍵字都舉例出來進行搜索业舍,搜索完成后進行經(jīng)緯度比較然后刷選出范圍內(nèi)的相關位置。而且由于數(shù)據(jù)來源問題升酣,很多位置信息都沒有舷暮!當然如果你只兼容國內(nèi),還是使用百度或者騰訊地圖算了噩茄。

  • 根據(jù)經(jīng)緯度獲取位置相關信息下面。
    CLLocation *location=[[CLLocation alloc]initWithLatitude:latitude longitude:longitude];
    [geocoder reverseGeocodeLocation:location completionHandler:^(NSArray *placemarks, NSError *error) {
        if (!error) {
            dispatch_async(dispatch_get_main_queue(), ^{
            //do something.
            });
        }else{
            //do something.
        }
        
    }];
  • 下落定位動畫效果
     imgView.center = CGPointMake(mapCenter.x, mapCenter.y-15);
     [UIView animateWithDuration:0.2 animations:^{
            imgView.center = mapCenter;
        }completion:^(BOOL finished){
            if (finished) {
                [UIView animateWithDuration:0.05 animations:^{
                    imgView.transform = CGAffineTransformMakeScale(1.0, 0.8);
                    
                }completion:^(BOOL finished){
                    if (finished) {
                        [UIView animateWithDuration:0.1 animations:^{
                            imgView.transform = CGAffineTransformIdentity;
                        }];
                    }
                }];
            }
      }];

這里我的思路是三個動畫效果組合以達到大頭針下落定位的效果。

  • 獲取用戶滑動地圖操作巢墅。
    MKMapViewDelegate中有個方法在滑動結束后可以回調(diào)如下所示:
- (void)mapView:(MKMapView *)mapView regionDidChangeAnimated:(BOOL)animated

因為回調(diào)是在展示的地圖區(qū)域改變后調(diào)用诸狭,所以使用它有個缺點就是在最開始初始化地圖并定位到用戶所在位置時,它會被反復回調(diào)。所以很難確定用戶是否是滑動君纫。所以這里我們需要知道用戶是否和地圖有過滑動后導致它的回調(diào)驯遇。如何做呢?這里有兩種方法以供參考蓄髓。
方法一:這里你是否想起UIScrollView,如果我們想獲取touch事件叉庐,我們應該怎么做,沒錯就是繼承后重寫touch方法会喝,然后把toush事件傳遞下去陡叠。代碼如下:

@implementation ZHMapView

#pragma mark - touchs
-(void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event
{
    [super touchesBegan:touches withEvent:event];
    [[self nextResponder] touchesBegan:touches withEvent:event];
}

-(void)touchesMoved:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event
{
    [super touchesMoved:touches withEvent:event];
    [[self nextResponder] touchesMoved:touches withEvent:event];
}

-(void)touchesEnded:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event
{
    [super touchesEnded:touches withEvent:event];
    [[self nextResponder] touchesEnded:touches withEvent:event];
  
}

- (void)touchesCancelled:(NSSet<UITouch *> *)touches withEvent:(nullable UIEvent *)event
{
     [super touchesCancelled:touches withEvent:event];
    [[self nextResponder]touchesCancelled:touches withEvent:event];
}

方法二:我在修改 navigationBar 底部線條顏色總結這篇文章中有用到查看View層次結構找到隱藏屬性并對它進行操作玩郊。沒錯這里也是一樣的道理,先看mapview層次結構例如如下所示:


這里我們可以發(fā)現(xiàn)_MKMapContentView里面有個手勢數(shù)組枉阵,沒錯就是它了译红。我們獲取它并對他進行操作,代碼如下所示:

//打印完后我們發(fā)現(xiàn)有個View帶有手勢數(shù)組其類型為_MKMapContentView獲取Span手勢
    for (UIView *view in self.mapView.subviews) {
        NSString *viewName = NSStringFromClass([view class]);
        if ([viewName isEqualToString:@"_MKMapContentView"]) {
            UIView *contentView = view;//[self.mapView valueForKey:@"_contentView"];
            for (UIGestureRecognizer *gestureRecognizer in contentView.gestureRecognizers) {
                if ([gestureRecognizer isKindOfClass:[UIPanGestureRecognizer class]]) {
                    [gestureRecognizer addTarget:self action:@selector(mapViewSpanGesture:)];
                }
            }

        }
    }

  • 加載時UITableView頂部展示菊花展示兴溜,這個原理和我們做分頁展示時侦厚,滑動到底部或頂部有個菊花展示的道理一樣。代碼如下
#pragma mark - Private Methods
-(void)resetTableHeadView
{
    if (infoArray.count>0) {
        self.showTableView.tableHeaderView = nil;
    }else{
        UIView *view = [[UIView alloc]initWithFrame:CGRectMake(0, 0, [UIScreen mainScreen].bounds.size.width, 30.0)];
        view.backgroundColor = self.showTableView.backgroundColor;
        UIActivityIndicatorView *indicatorView = [[UIActivityIndicatorView alloc]initWithActivityIndicatorStyle:UIActivityIndicatorViewStyleGray];
        indicatorView.center = view.center;
        [indicatorView startAnimating];
        [view addSubview:indicatorView];
        self.showTableView.tableHeaderView = view;
        
    }
}

下載地址

GitHub

最后編輯于
?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末拙徽,一起剝皮案震驚了整個濱河市刨沦,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌膘怕,老刑警劉巖想诅,帶你破解...
    沈念sama閱讀 212,542評論 6 493
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異岛心,居然都是意外死亡来破,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,596評論 3 385
  • 文/潘曉璐 我一進店門鹉梨,熙熙樓的掌柜王于貴愁眉苦臉地迎上來讳癌,“玉大人,你說我怎么就攤上這事存皂∩卫ぃ” “怎么了?”我有些...
    開封第一講書人閱讀 158,021評論 0 348
  • 文/不壞的土叔 我叫張陵旦袋,是天一觀的道長骤菠。 經(jīng)常有香客問我,道長疤孕,這世上最難降的妖魔是什么商乎? 我笑而不...
    開封第一講書人閱讀 56,682評論 1 284
  • 正文 為了忘掉前任,我火速辦了婚禮祭阀,結果婚禮上鹉戚,老公的妹妹穿的比我還像新娘。我一直安慰自己专控,他們只是感情好抹凳,可當我...
    茶點故事閱讀 65,792評論 6 386
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著伦腐,像睡著了一般赢底。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,985評論 1 291
  • 那天幸冻,我揣著相機與錄音粹庞,去河邊找鬼。 笑死洽损,一個胖子當著我的面吹牛庞溜,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播趁啸,決...
    沈念sama閱讀 39,107評論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼强缘,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了不傅?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 37,845評論 0 268
  • 序言:老撾萬榮一對情侶失蹤赏胚,失蹤者是張志新(化名)和其女友劉穎访娶,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體觉阅,經(jīng)...
    沈念sama閱讀 44,299評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡崖疤,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,612評論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了典勇。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片劫哼。...
    茶點故事閱讀 38,747評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖割笙,靈堂內(nèi)的尸體忽然破棺而出权烧,到底是詐尸還是另有隱情,我是刑警寧澤伤溉,帶...
    沈念sama閱讀 34,441評論 4 333
  • 正文 年R本政府宣布般码,位于F島的核電站,受9級特大地震影響乱顾,放射性物質(zhì)發(fā)生泄漏板祝。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 40,072評論 3 317
  • 文/蒙蒙 一走净、第九天 我趴在偏房一處隱蔽的房頂上張望券时。 院中可真熱鬧,春花似錦伏伯、人聲如沸橘洞。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,828評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽震檩。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間抛虏,已是汗流浹背博其。 一陣腳步聲響...
    開封第一講書人閱讀 32,069評論 1 267
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留迂猴,地道東北人慕淡。 一個月前我還...
    沈念sama閱讀 46,545評論 2 362
  • 正文 我出身青樓,卻偏偏與公主長得像沸毁,于是被迫代替她去往敵國和親峰髓。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 43,658評論 2 350

推薦閱讀更多精彩內(nèi)容

  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 171,849評論 25 707
  • 發(fā)現(xiàn) 關注 消息 iOS 第三方庫息尺、插件携兵、知名博客總結 作者大灰狼的小綿羊哥哥關注 2017.06.26 09:4...
    肇東周閱讀 12,066評論 4 62
  • 那天我和老友們接他放假,他在我們那所城市最好的高中就讀搂誉,說實話在和他商量好要接他之前的幾個小時里我心里特別激...
    夏嗯閱讀 251評論 0 1
  • 一 宇宙一何衰徐紧,興亡皆稊米。 草木知吾醉炭懊,深深封石肆并级。 二 故園植新韭,采采與人依侮腹。 向無春日暖嘲碧,安得清嫩毗。 復...
    專治各種嘚瑟閱讀 298評論 1 2
  • 你們曾經(jīng)吃過最棒的秘制雞腿飯究竟有多好吃呢?照燒的口感至非,鮮嫩的雞肉钠署,松脆的表皮,烤的金黃的雞肉上刷著一層濃稠的焦糖...
    味庫美食視頻閱讀 345評論 1 4