You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Xamarin.Forms.Maps iOS C#中如何实现点击地图图钉时修改图标

错误原因

DidSelectAnnotationView是MKMapView的事件委托,原生定义就是无返回值的void类型,你修改方法返回值为MKAnnotationView会和委托签名不匹配,直接触发CS0407报错。而且你不需要在选中事件里新建AnnotationView实例,直接修改当前选中的已有View的属性即可实现图标更换。

实现代码

修正后的选中/取消选中事件代码

// 选中图钉时更换为大尺寸图标
void OnDidSelectAnnotationView(object sender, MKAnnotationViewEventArgs e)
{  
    CustomMKAnnotationView customView = e.View as CustomMKAnnotationView;
    if (customView == null) return;
    
    // 原有业务逻辑保留
    customPinView = new UIView();
    if (customView.Name.Equals("Xamarin"))
    {
        customPinView.Frame = new CGRect(0, 0, 200, 84);
        customPinView.Center = new CGPoint(0, -(e.View.Frame.Height + 75));
        e.View.AddSubview(customPinView);
    }
    int mapCode = customView.MapCode;
    var result = GetDataFromAPI(mapCode);
    var result2 = GetInfoFromStation(mapCode);
    MessagingCenter.Send<object, IEnumerable<AlertLevel>>(this, "PinSelected", result);
    MessagingCenter.Send<object, IEnumerable<StationInfoOnClick>>(this, "StationInfo", result2);

    // 直接修改当前选中View的图标,用同一张图缩放为更大尺寸
    var originalImageName = "";
    switch (customView.AlertLevel)
    {
        case 1: originalImageName = "green.png"; break;
        case 2: originalImageName = "yellow.png"; break;
        case 3: originalImageName = "orange.png"; break;
        case 4: originalImageName = "red.png"; break;
    }
    var originalImage = UIImage.FromFile(originalImageName);
    // 缩放图标到目标尺寸,可根据需求调整数值
    var scaledImage = originalImage.Scale(new CGSize(36, 36));
    customView.Image = scaledImage;
}

// 取消选中时切回原始尺寸图标
void OnDidDeselectAnnotationView(object sender, MKAnnotationViewEventArgs e)
{
    CustomMKAnnotationView customView = e.View as CustomMKAnnotationView;
    if (customView == null) return;
    
    // 移除之前添加的自定义弹窗
    if (customPinView != null)
    {
        customPinView.RemoveFromSuperview();
        customPinView = null;
    }

    // 切回原始小尺寸图标
    var originalImageName = "";
    switch (customView.AlertLevel)
    {
        case 1: originalImageName = "green.png"; break;
        case 2: originalImageName = "yellow.png"; break;
        case 3: originalImageName = "orange.png"; break;
        case 4: originalImageName = "red.png"; break;
    }
    var originalImage = UIImage.FromFile(originalImageName);
    // 恢复默认尺寸,和GetViewForAnnotation里的默认尺寸保持一致即可
    var scaledImage = originalImage.Scale(new CGSize(24, 24));
    customView.Image = scaledImage;
}

无需修改的原有代码

你原来的GetViewForAnnotation、OnElementChanged方法保持原样即可,不需要做调整。


内容的提问来源于stack exchange,提问作者Blagovest Pizhev

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.29 15:54:05