bod*_*ous 6 mkmapview ios xcode4 mkmapviewdelegate
我创建了一个测试应用程序,只有一个包含MKMapView的视图和一个充当MapView委托的控制器.
当我进行全新构建(在重新安装之前完全从设备中删除)并记录回调时,我可以看到mapView:didUpdateUserLocation在用户指示是否希望显示其当前位置之前调用两次.
传递给回调的MKUserLocation对象无效:
2012-03-13 08:20:17.518 MapTest[3325:707] Did update user location: 0.000000,0.000000
2012-03-13 08:20:17.581 MapTest[3325:707] Did update user location: 0.000000,0.000000
Run Code Online (Sandbox Code Playgroud)
这是MKMapKit或bug的预期行为吗?
我在我的iPhone 4上运行它,而不是模拟器.这是控制器代码:
#import "ViewController.h"
@implementation ViewController
@synthesize mapView;
- (void)viewDidLoad
{
[super viewDidLoad];
self.mapView.showsUserLocation = YES;
self.mapView.delegate = self;
}
- (void)viewDidUnload
{
[super viewDidUnload];
// Release any retained subviews of the main view.
}
-(IBAction)trackButtonTapped:(id)sender
{
self.mapView.showsUserLocation = !self.mapView.showsUserLocation;
}
#pragma mark - MKMapKitDelegate
-(void)mapView:(MKMapView *)mapView didUpdateUserLocation:(MKUserLocation *)userLocation
{
NSLog(@"Did update user location: %f,%f", userLocation.coordinate.latitude, userLocation.coordinate.longitude);
}
-(void)mapViewWillStartLoadingMap:(MKMapView *)mapView
{
NSLog(@"Will start loading map");
}
-(void)mapViewDidFinishLoadingMap:(MKMapView *)mapView
{
NSLog(@"Did finish loading map");
}
-(void)mapViewWillStartLocatingUser:(MKMapView *)mapView
{
NSLog(@"Will start locating user");
}
-(void)mapViewDidStopLocatingUser:(MKMapView *)mapView
{
NSLog(@"Did stop locating user");
}
-(void)mapViewDidFailLoadingMap:(MKMapView *)mapView withError:(NSError *)error
{
NSLog(@"Did fail loading map");
}
-(void)mapView:(MKMapView *)mapView didFailToLocateUserWithError:(NSError *)error
{
if (error.code == kCLErrorDenied){
NSLog(@"User refused location services");
} else {
NSLog(@"Did fail to locate user with error: %@", error.description);
}
}
@end
Run Code Online (Sandbox Code Playgroud)
小智 10
我的观点是,这是一个错误.
当用户甚至没有授予权限时,地图视图如何说用户位置已更新?
我使用的解决方法是检查是否userLocation.location是nil:
- (void)mapView:(MKMapView *)mapView didUpdateUserLocation:(MKUserLocation *)userLocation
{
if (userLocation.location == nil)
return;
//do something with userLocation...
}
Run Code Online (Sandbox Code Playgroud)
而是检查nil userlocation(其中0,0坐标实际上可以有效),你应该使用:
if([CLLocationManager authorizationStatus] == kCLAuthorizationStatusAuthorized) {
// do something with the coords
} else {
// the coords are invalid
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
4815 次 |
| 最近记录: |