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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.21 03:37:32