我们可以为iOS中的用户当前位置设置自定义注释视图吗?
我需要使用自己的自定义视图(例如一些ping引脚)删除蓝点(带圆圈)。是否有可能做到这一点?
如果我们这样做,当用户位置发生变化时,此引脚是否会移动到新位置?或者我们需要以编程方式处理它吗?
我观察到如果我们对用户的当前位置使用默认蓝点,那么当用户位置发生变化时,它会在地图中更新。
我只想知道是否可以使用我们自己的自定义视图完成此操作。
答案 0 :(得分:14)
是的,您可以拥有用户位置的自定义视图。
不幸的是,它实现起来比应该更难,因为即使documentation for the viewForAnnotation delegate method声称如果注释类是MKUserLocation
你可以提供自己的视图,那么自定义视图就不会继续随用户的位置移动。实际上,当为MKUserLocation
返回自定义视图时,地图视图会完全停止更新用户位置(地图视图的didUpdateUserLocation
委托方法不再触发)。我相信这是一个错误。
解决方法是使用CLLocationManager
和自定义注释...
确保showsUserLocation
为NO
或在地图视图中取消选中。
使用实现CLLocationManager
协议的自定义类声明MKAnnotation
和自定义注释的属性(或者您可以使用通用MKPointAnnotation
类)。
在viewDidLoad
或其他适当的位置,创建CLLocationManager
,设置其delegate
并致电startUpdatingLocation
。
在location manager's didUpdateToLocation
delegate method(不地图视图的didUpdateUserLocation
委托方法)中,创建或更新自定义注释:
-(void)locationManager:(CLLocationManager *)manager didUpdateToLocation:(CLLocation *)newLocation fromLocation:(CLLocation *)oldLocation
{
if (myUserLocAnnot == nil)
{
self.myUserLocAnnot = [[[MyUserLocClass alloc] init] autorelease];
//remove the autorelease if using ARC
myUserLocAnnot.title = @"You are here";
myUserLocAnnot.coordinate = newLocation.coordinate;
[mapView addAnnotation:myUserLocAnnot];
}
else
{
myUserLocAnnot.coordinate = newLocation.coordinate;
}
}
最后,在地图视图的viewForAnnotation
委托方法中,如果注释是您的自定义用户位置注释,则会返回自定义注释视图。
答案 1 :(得分:0)
这是 2021 年的答案。
Swift 5,XCode 12。
if annotation.isKind(of: MKUserLocation.self) {
let userIdentifier = "user_location"
if let existingView = mapView
.dequeueReusableAnnotationView(withIdentifier: userIdentifier) {
return existingView
} else {
let view = MKAnnotationView(annotation: annotation, reuseIdentifier: userIdentifier)
view.image = #imageLiteral(resourceName: "dark_haulerIcon")
return view
}
}
而且您不需要编写移动注释的逻辑。来吧,它会自动完成。就用上面的逻辑。