欢迎加入QQ讨论群258996829
麦子学院 头像
苹果6袋
6
麦子学院

深入理解UIImage(二)

发布时间:2016-06-16 23:37  回复:0  查看:3233   最后回复:2016-06-16 23:37  
前面我们介绍了关于UIImage的知识点,相信大家对他有了了解,这里继续为大家讲解 UIkit 中的 UIImage
图片拉伸
当我们的图片比所要填充的区域小时,会导致图片变形。如以下图片,原始大小为 100*30 ,将其放到一个 300*50 UIImageView 中时,整个图片被拉伸。
原始图片
深入理解UIImage(二) 
拉伸后的图片
深入理解UIImage(二)
这时我们就需要做特殊的处理。
Android 的同学应该都知道 .9 图,这种图片可以只拉伸中间的部分,而保持四个角不变形。在 iOS 中也支持这种操作。在早期的 iOS 版本中, UIImage 提供了如下方法来执行此操作:
func stretchableImageWithLeftCapWidth(_ leftCapWidth: Int, topCapHeight topCapHeight: Int) -> UIImage
这个方法通过 leftCapWidth topCapHeight 两个参数来定义四个角的大小。不过这个方法在 iOS 5 中就被 Deprecated 了,对应的两个属性 leftCapWidth topCapHeight 也是相同的命运。所以现在不建议使用它们。另外,对于如何解释 leftCapWidth topCapHeight ,大家可以参考一下 @M了个JiOS图片拉伸技巧
iOS 5 中,我们可以使用以下方法来执行相同的操作:
func resizableImageWithCapInsets(_ capInsets: UIEdgeInsets) -> UIImage
这个方法通过一个 UIEdgeInsets 来指定上下左右不变形的宽度或高度。它会返回一个新的图像。而如果图像被拉伸,则会以平铺的方式来处理中间的拉伸区域。
我们对上面的图片做如下处理:
let resizedButtonImageView = UIImageView(image: normalButtonImage?.resizableImageWithCapInsets(UIEdgeInsets(top: 15, left: 15, bottom: 15, right: 15)))
resizedButtonImageView.frame = CGRectMake(0, 60, 300, 50)
其得到的结果如下所示:
深入理解UIImage(二) 
iOS 6 Apple 又为我们提供了一个新的方法,相较于上面这个方法,只是多一个 resizingMode 参数,允许我们指定拉伸模式。
func resizableImageWithCapInsets(_ capInsets: UIEdgeInsets, resizingMode resizingMode: UIImageResizingMode) -> UIImage
这个方法的拉伸模式分两种:平铺 (Tile) 和拉伸 (Stretch) 。如果是平铺模式,则跟前一个方法是一样的效果。
动效图片对象
如果我们有一组大小和缩放因子相同的图片,就可以将这些图片加载到同一个 UIImage 对象中,形成一个动态的 UIImage 对象。为此, UIImage 提供了以下方法:
class func animatedImageNamed(_ name: String, duration duration: NSTimeInterval) -> UIImage?
这个方**加载以 name 为基准文件名的一系列文件。如,假设我们的 name 参数值为 ”swift” ,则这个方**加载诸如 ”swift0”, “swift1”,…, “swift1024” 这样的一系列的文件。
这里有两个问题需要注意:
文件的序号必须是从 0 开始的连续数字,如果不从 0 开始,则在 Playground 中是会报错的。而如果中间序号有断,而中断后的图片是不会被加载的。
所有文件的大小和缩放因子应该是相同的,否则显示时会有不可预期的结果,这种结果主要表现为播放的顺序可能是杂乱的。
如果我们有一组基准文件名不同的文件,但其大小和缩放因子相同,则可能使用以下方法:
class func animatedImageWithImages(_ images: [UIImage], duration duration: NSTimeInterval) -> UIImage?
传入一个 UIImage 数组来拼装一个动效 UIImage 对象。
另外, UIImage 也提供了 resizable 版本的动效方法,如下所示:
class func animatedResizableImageNamed(_ name: String, capInsets capInsets: UIEdgeInsets, duration duration: NSTimeInterval) -> UIImage?
class func animatedResizableImageNamed(_ name: String, capInsets capInsets: UIEdgeInsets, resizingMode resizingMode: UIImageResizingMode, duration duration: NSTimeInterval) -> UIImage?
第一个方法的 UIImageResizingMode 默认是 UIImageResizingModeTile ,所以如果想对图片做拉伸处理,可以使用第二个的方法,并传入 UIImageResizingModeStretch
图片大小的限制
UIImage 对象使用的图片大小尽量小于 1024*1024 。因为这么大的图片消耗的内存过大,在将其作为 OpenGL 中的贴图或者是绘制到 view/layer 中时,可以会出现问题。如果仅仅是代码层面的操作的话,则没有这个限制。比如,将一个大于 1024*1024 的图片绘制到位图图形上下文中以重新设定其大小。事实上,我们需要通过这种操作来改变图片大小,以将其绘制到视图中。
支持的图片格式
UIImage 支持的图片格式在 UIImage Class Reference中列出来了,大家可以直接参考。
需要注意的一点是 RGB-565 格式的 BMP 文件在加载时会被转换成 ARGB-1555 格式。
原文来自:南峰子的技术博客
您还未登录,请先登录

热门帖子

最新帖子