我有一个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
初始化方法。
似乎MvxTouchLocalFileImageLoader
类already uses UIImage.FromFile
,所以我不确定为什么行为不同。
编辑:这是downloadable sample project重现此问题。
感谢。
答案 0 :(得分:2)
adding the prefix res:
to the file path似乎MvxTouchLocalFileImageLoader
to use UIImage.FromFile
和it reads the file to a MemoryStream
,忽略任何比例或设备限定符。
所以,现在按预期工作:
_imageLoader = new MvxImageViewLoader(() => ImageView)
{
DefaultImagePath = "res:" + NSBundle.MainBundle.PathForResource(imageName, "png")
};
不确定这是否是预期的行为,或者无论如何都是MvxTouchLocalFileImageLoader
中的错误。