MvxImageViewLoader默认图像忽略视网膜资源

时间:2014-01-20 18:38:59

标签: ios xamarin.ios uiimageview mvvmcross retina-display

我有一个MvvmCross项目,它使用MvxImageViewLoader从后台的URL加载图像。我正在使用DefaultImagePath来指定默认图片,以防网址不正确或根本没有指定网址。

问题是此路径忽略了文件系统中的视网膜@2x图像,并始终显示非视网膜图像。

这是代码:

_imageLoader = new MvxImageViewLoader(() => ImageView)
{
    // After loading the Image view, the scale of the image is always 1.0
    DefaultImagePath = NSBundle.MainBundle.PathForResource("image", "png")
};
// At this point, ImageView.Image.CurrentScale is 1.0 (WRONG) on retina devices

其中ImageView是标准UIImageView

但是从路径加载图像直接按预期工作:

// The scale of this image is 2.0 on retina devices (as expected)
var image = UIImage.FromFile(NSBundle.MainBundle.PathForResource("image", "png"));

作为一种解决方法,我添加了这个条件命名:

var imageName = UIScreen.MainScreen.Scale > 1 ? "image@2x" : "image";
_imageLoader = new MvxImageViewLoader(() => ImageView)
{
    DefaultImagePath = NSBundle.MainBundle.PathForResource(imageName, "png")
};
// At this point, ImageView.Image.CurrentScale is 2.0 on retina devices as expected

但这并未考虑其他命名惯例,例如iPad的~ipad和iPad视网膜的@2x~ipad。所以我想知道我做错了什么,或者MvvmCross插件应该使用方便的UIImage初始化方法。

似乎MvxTouchLocalFileImageLoaderalready uses UIImage.FromFile,所以我不确定为什么行为不同。

编辑:这是downloadable sample project重现此问题。

感谢。

1 个答案:

答案 0 :(得分:2)

adding the prefix res: to the file path似乎MvxTouchLocalFileImageLoader to use UIImage.FromFileit reads the file to a MemoryStream,忽略任何比例或设备限定符。

所以,现在按预期工作:

_imageLoader = new MvxImageViewLoader(() => ImageView)
{
    DefaultImagePath = "res:" + NSBundle.MainBundle.PathForResource(imageName, "png")
};

不确定这是否是预期的行为,或者无论如何都是MvxTouchLocalFileImageLoader中的错误。