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
相关产品推荐
相关产品推荐

