iOS Xamarin中PictureMarkerSymbol无法加载本地/MainBundle图片求助
解决iOS上ArcGIS Runtime 100.2.1加载本地图片作为PictureMarkerSymbol的问题
我之前在使用ArcGIS Runtime SDK 100.x版本开发iOS应用时也遇到过几乎一样的问题,你的代码逻辑本身没问题,但在iOS平台上直接用文件路径创建PictureMarkerSymbol很容易因为路径格式或SDK的资源加载逻辑踩坑,这里给你几个可行的解决方案:
方案1:使用Bundle的URL而非文件路径
ArcGIS Runtime在iOS上加载本地资源时,用NSBundle提供的URL资源路径比文件系统字符串路径更可靠,修改代码如下:
var imageBundleUrl = NSBundle.MainBundle.GetUrlForResource("StreetsIconSmall", "png", "Images"); if (imageBundleUrl == null) return null; // 直接用NSUrl的绝对字符串创建Uri return new Esri.ArcGISRuntime.Symbology.PictureMarkerSymbol(new Uri(imageBundleUrl.AbsoluteString));
方案2:通过UIImage中转加载(更推荐)
利用iOS原生的UIImage.FromBundle方法加载图片,再通过PictureMarkerSymbol.FromImageAsync转换,这种方式能避开大部分路径相关的坑,兼容性更好:
// 注意路径格式是"子文件夹/文件名",不需要加后缀 var uiImage = UIImage.FromBundle("Images/StreetsIconSmall"); if (uiImage == null) return null; // 异步转换为PictureMarkerSymbol var markerSymbol = await Esri.ArcGISRuntime.Symbology.PictureMarkerSymbol.FromImageAsync(uiImage); return markerSymbol;
必查的项目配置项
除了代码调整,还要确认你的项目配置没出错:
- 图片文件的Build Action必须设置为
BundleResource - 图片所在的
Images文件夹在Xamarin.iOS项目中是文件夹引用(不是普通的组),这样编译后才会在bundle中保留目录结构 - 确认文件名和后缀完全匹配(iOS文件系统区分大小写,比如
streetsiconsmall.png和StreetsIconSmall.png会被识别为两个不同文件)
内容的提问来源于stack exchange,提问作者Oscar Azmitia
相关产品推荐
相关产品推荐

