背景
最近写代码的时候。有这么一件事情。ImageView要加载一个URL对应的图片。按理说这事情很简单。但是遇到了一个小小的问题。这个URL对应的图片不存在,需要在这种情况下展示一个默认的资源图片。由此引发了对于图片显示的一番探索
基础
UIImageView是在界面中显示单个图像或动画图像序列的对象。我们可以用来展示一些JPEG、 PNG、和一组用来显示动画的图像文件。
UIImageView自身的ContentMode属性用来控制图像以何种方式填充在view内,这个就不细说了
UIImageView展示的内容透明度:Image属性的内容被合成到UIImageView的背景上,然后合成到Window的其余部分。所以UIImageView之后的内容是否展示取决于UIImageView的透明度和image属性对应的图像的透明度。如果UIImageView的isOpaque属性为true,则图像的像素将合成在UIImageView的背景色之上,并且UIImageView的alpha属性将被忽略。因为这意味着图像下的任何内容都不可见。只有当UIImageView的isOpaque属性为false的时候,图像的每个像素的alpha值才会乘以UIImageView的alpha值作为最后的透明度。
注意:isOpaque属性是false的时候会导致计算很多的图像通道的透明度。所以如果没有需要。我们一般应该将这个属性置为true
触摸事件:默认情况下,UIImageView会忽略用户事件。因为使用UIImageView仅在界面中显示视觉内容。如果希望UIImageView处理用户交互,需要将isUserInteractionEnabled属性的值更改为true。完成后,之后附加手势识别器或使用任何其他事件处理技术来响应触摸事件。
问题解决方案
大家一定用过UITextField用的时候都见到过一个属性PlaceHolder。这可以让用户在什么都没有输入的时候看到一个默认的提示文本。而我们这个问题的解决方法就和它类似,给ImageView添加了一个PlaceHolder。既然需要加载URL那么必然有一个从网络加载完的回调,在这个里面我们可以判断如果失效了,就给他一个默认的图片资源,至于如何写的优雅一些,这个根据大家实际情况来
高效展示
图像展示这个事情本身在各个场景都是一种常见的事情,如何做到高效主要有两点
- 图像缩放和alpha混合是两种相对昂贵的操作,可能会影响应用程序的性能。为了最大化UIImageView的性能,解决办法有一下两点以下提示:
- 缓存常用图像的缩放版本。如果希望在缩略图视图中频繁显示某些大的图像,可以考虑预先创建缩小的图像并将其存储在缩略图缓存中。这样做可以减少每个UIImageView单独缩放它们的需要。
- 使用大小接近UIImageView大小的图像。与其将大图像指定给图像视图,不如创建与图像视图当前大小匹配的缩放版本。还可以使用UIImage创建可调整大小的图像对象。调整大小模式。平铺选项,平铺图像而不是缩放图像。
- 尽可能使UIImageView不透明。除非有意使用包含透明度的图像(例如,图形UI元素),否则尽量确保UIImageView的isOpaque属性设置为true。
初次之外,阴影的展示和离屏渲染都是可以考虑的问题,这个就不细说了。
总结
许多问题的解决都可以参照现有的优秀解决方案。而解决过程中,什么是最优的就需要自己考虑了。图片的显示上无外乎注意重复使用时候的缓存,通道计算的昂贵操作,加载失败时候的异常处理。
网友评论