我想在点击后使用注释。我已经查看了Apple的文档并且用google搜索了但是我无法找到为什么这与应该如何完成有什么不同。
基本上;我没有得到println("Pin clicked");
为什么不呢?
func mapView(mapView: MKMapView!, viewForAnnotation annotation: MKAnnotation!) -> MKAnnotationView!
{
if !(annotation is MKPointAnnotation) {
return nil
}
let reuseId = "test"
var anView = mapView.dequeueReusableAnnotationViewWithIdentifier(reuseId)
if anView == nil {
anView = MKAnnotationView(annotation: annotation, reuseIdentifier: reuseId)
anView.canShowCallout = true
}
else {
anView.annotation = annotation
}
return anView
}
func mapView(mapView: MKMapView!, didSelectAnnotationView view: MKAnnotationView!)
{
println("Pin clicked");
}
func setAnnotationPinOnMap(annotation : NSManagedObject)
{
var subject: AnyObject? = annotation.valueForKey("subject")
var desc: AnyObject? = annotation.valueForKey("desc")
var langitude: AnyObject? = annotation.valueForKey("langitude")
var longitude: AnyObject? = annotation.valueForKey("longitude")
println(annotation);
let pin = MKPointAnnotation()
let location = CLLocationCoordinate2D(
latitude: longitude as CLLocationDegrees,
longitude: langitude as CLLocationDegrees
)
println(location.longitude, location.latitude)
pin.setCoordinate(location)
pin.title = subject as String!
pin.subtitle = desc as String!
println( pin.coordinate.longitude)
viewForAnnotation(pin);
mapView.addAnnotation(pin)
}
我已导入地图套件并包含地图视图委托。
答案 0 :(得分:15)
要回答原始问题,didSelectAnnotationView
很可能无法调用,因为未设置地图视图的delegate
属性。另一个常见原因是注释的title
是空白的。
在更新的问题中,引脚不会以viewForAnnotation
的实施方式显示,因为它会创建MKAnnotationView
但不会设置其image
属性。 image
的{{1}}属性默认为MKAnnotationView
,因此引脚位于此处但不可见。
如果要显示标准红色引脚,请执行以下操作:
nil
委托方法,地图视图默认显示红色图钉 。viewForAnnotation
委托方法,然后创建viewForAnnotation
,自动显示" pin"图像。因此,要么将图钉MKPinAnnotationView
设置为某个自定义图像:
image
或创建anView = MKAnnotationView(annotation: annotation, reuseIdentifier: reuseId)
anView.canShowCallout = true
anView.image = UIImage(named:"CustomImage") // <-- add this line
,并可选择设置其MKPinAnnotationView
:
pinColor
答案 1 :(得分:6)
在我的情况下问题是我在YES中设置属性 canShowCallout ,所以如果你在YES中设置这个属性
-(void)mapView:(MKMapView *)mapView didSelectAnnotationView:(MKAnnotationView *)view
未被调用。当我删除此属性时,该方法被调用。
annotationView = [[ClusterAnnotationView alloc] initWithAnnotation:annotation reuseIdentifier:identifier];
annotationView.canShowCallout = YES; //try setting to NO or don't set.
答案 2 :(得分:2)
我想将此添加为对GOrozco58答案的评论,但没有足够的声誉来评论。
如果 canShowCallout 设置为YES, GOrozco58 是正确的,如果标题为零,则不会调用didSelectAnnotation
。
如果您希望调用didSelectAnnotation
并将 canShowCallout 设置为YES,请确保添加标题。
答案 3 :(得分:2)
在最新版本的Swift中,方法声明已经改变了:
func mapView(mapView: MKMapView!, didSelectAnnotationView view: MKAnnotationView!)
到此:
func mapView(_ mapView: MKMapView, didSelect view: MKAnnotationView)
答案 4 :(得分:1)
在我的情况下,我使用的是服装注释,并且由于custom注释的图像属性为空,因此未调用didSelectAnnotationView,因此我将其设置为图像并开始调用didSelectAnnotationView。
- (id)initWithAnnotation:(id <MKAnnotation>)annotation reuseIdentifier:(NSString *)reuseIdentifier{
self = [super initWithAnnotation:annotation reuseIdentifier:reuseIdentifier];
if (self != nil)
{
DoctorCustomeAnnotation *mapItem = (DoctorCustomeAnnotation *)self.annotation;
// offset the annotation so it won't obscure the actual lat/long location
self.centerOffset = CGPointMake(100, 100.0);
self.backgroundColor = [UIColor redColor];
PAImageView* avatarView = [[PAImageView alloc] initWithFrame:CGRectMake(0, 0, 50, 50)
backgroundProgressColor:[UIColor whiteColor]
progressColor:[UIColor colorWithRed:0.092 green:0.383 blue:0.580 alpha:1.000]];
[self addSubview:avatarView];
self.image = [UIImage imageNamed:@"placeholder_male"];
[avatarView setImageURL:@"http://www.straine.com/wp-content/uploads/2015/12/doctor.png"];
}
return self;
}
答案 5 :(得分:0)
安娜关于未分配注释标题的建议是我的问题的解决方案。我花了一分钟来实现这一点,我在gestureRecognizer()函数中做到了这一点。这是我的例子:
@objc func handleLongPress(_ gestureRecognizer : UIGestureRecognizer) {
if gestureRecognizer.state != .began { return }
print("Tap gesture recognized")
// Create the annotation
let touchPoint = gestureRecognizer.location(in: mapView)
let newCoordinate = self.mapView.convert(touchPoint, toCoordinateFrom:self.mapView)
let annotation = MKPointAnnotation()
annotation.coordinate = newCoordinate
annotation.title = "placeholder"
// Add the annotation
mapView.addAnnotation(annotation)
}