AP102 2016/5/18-2
按住option加上左鍵可以旋轉地圖
如果沒有出現在模擬器裡面在debug–>location–>切換
none 跟custom location彼此切換即可打開
預設給予一個經緯度
在xcode中是顛倒的
24.986525緯度
121.515312精度
C–>viewcontroller
m–>locationManager(取得位置)
V–>MapView
MapView的delegate指向viewcontroller
viewdidload指向viewcontroller
要用這兩個協定來溝通
MKViewDelegate
CLLocationManager
這兩個其實是protocol,是一種溝通的管道
IOS底層拿到locationManager然後拿到delegate
delegate如果有實作startUpdatingLocation就回傳
假設沒支援就跳過
會日文才能跟日本人(LocationManager)溝通
才能溝通。
protocol就是懂得如何跟LocationManager溝通
delegate是要指定與誰溝通
如果沒有protocol也compiler可以過,但Xcode會出現錯誤訊息。或者可以使用block,用起來輕鬆寫意,但是有些還是無法取代。
接著來實作上方segment control的按鈕選項功能
- (IBAction)mapTypeChanged:(id)sender {
NSInteger targetIndex = [sender selectedSegmentIndex];
switch(targetIndex){
case 0:
_mainMapView.mapType = MKMapTypeStandard;
break;
case 1:
_mainMapView.mapType = MKMapTypeSatellite;
break;
case 2:
_mainMapView.mapType = MKMapTypeHybrid;
break;
default:
break;
}
}
下方segment control 追蹤模式
- (IBAction)trackingModeChanged:(id)sender {
NSInteger targetIndex = [sender selectedSegmentIndex];
switch(targetIndex){
case 0:
_mainMapView.userTrackingMode = MKUserTrackingModeNone;
break;
case 1:
_mainMapView.userTrackingMode = MKUserTrackingModeFollow;
//追蹤你的方向
break;
case 2:
_mainMapView.userTrackingMode = MKUserTrackingModeFollowWithHeading;
//追蹤你的方向與面對的方向
break;
default:
break;
}
}
在模擬器裡面的Debug 內的Location可以選擇 Apple
City bicycle ride
City Run
#pragma mark - CLLocationManagerDelegate Methods
//polocal
-(void) locationManager:(CLLocationManager *)manager didUpdateLocations:(NSArray<CLLocation *> *)locations{
CLLocation * currentLocation = locations.lastObject;//拿到一個Array給你
//所以拿到lastObject是最新的,系統有空閒的時候一有位置出現就回報
//如果系統底層處於忙碌不回報,當他有空時候再回報,一次把多個位置回報
NSLog(@"Current Location: %.6f %.6f",currentLocation.coordinate.latitude,currentLocation.coordinate.longitude);
//Make the region change just once
//GCD
//dispatch_once_t 就是一個Long型別而已
//準備好一個changeRegionOnceTaken變數
static dispatch_once_t changeRegionOnceTaken;
dispatch_once(&changeRegionOnceTaken, ^{
MKCoordinateRegion region = _mainMapView.region;
region.center = currentLocation.coordinate;
region.span.latitudeDelta=0.01;
region.span.longitudeDelta=0.01;
[_mainMapView setRegion:region animated:true];
});
}
看看是否有移動與縮放
這個就是一個MapView與ViewController的溝通
%.6f代表著只顯示小數點以下六位數
%.06f =>1.234000 會補足
%02.6f => 01.234
以上這是C語言的語法
也是JAVA的語法
#pragma mark -
-(void) mapView:(MKMapView *)mapView regionDidChangeAnimated:(BOOL)animated{
MKCoordinateRegion region = mapView.region;
NSLog(@"center changed to : %.6f %.6f",region.center.latitude,region.center.longitude);
}
最後加上一段大頭針的程式碼CLLocationCoordinate2D annotationCoodinate =
currentLocation.coordinate;
annotationCoodinate.latitude += 0.0005;
annotationCoodinate.longitude += 0.0005;
MKPointAnnotation * annotation =[MKPointAnnotation new];
annotation.coordinate=annotationCoodinate;
annotation.title = @"KFC";
annotation.subtitle=@"Good to Eat";
[_mainMapView addAnnotation:annotation];
完整程式碼-(void) locationManager:(CLLocationManager *)manager didUpdateLocations:(NSArray<CLLocation *> *)locations{
CLLocation * currentLocation = locations.lastObject;//拿到一個Array給你
//所以拿到lastObject是最新的,系統有空閒的時候一有位置出現就回報
//如果系統底層處於忙碌不回報,當他有空時候再回報,一次把多個位置回報
NSLog(@"Current Location: %.6f %.6f",currentLocation.coordinate.latitude,currentLocation.coordinate.longitude);
//Make the region change just once
//GCD
//dispatch_once_t 就是一個Long型別而已
//準備好一個changeRegionOnceTaken變數
static dispatch_once_t changeRegionOnceTaken;
dispatch_once(&changeRegionOnceTaken, ^{
//MKCoordinateRegion可以寫入與讀書
//region代表地圖所移動的中心
MKCoordinateRegion region = _mainMapView.region;
//設定region的中心
region.center = currentLocation.coordinate;
//設定縮放比例span latitudeDelta和longitudeDelta的比例
region.span.latitudeDelta=0.01;
region.span.longitudeDelta=0.01;
[_mainMapView setRegion:region animated:true];
CLLocationCoordinate2D annotationCoodinate =
currentLocation.coordinate;
annotationCoodinate.latitude += 0.0005;
annotationCoodinate.longitude += 0.0005;
MKPointAnnotation * annotation =[MKPointAnnotation new];
annotation.coordinate=annotationCoodinate;
annotation.title = @"KFC";
annotation.subtitle=@"Good to Eat";
[_mainMapView addAnnotation:annotation];
});
}
Comments
Post a Comment