楼主: z74646
1051 1

[程序分享] UIKit之UIImage详解(二) [推广有奖]

  • 0关注
  • 1粉丝

本科生

75%

还不是VIP/贵宾

-

威望
0
论坛币
300 个
通用积分
0
学术水平
0 点
热心指数
1 点
信用等级
0 点
经验
890 点
帖子
55
精华
0
在线时间
12 小时
注册时间
2014-2-26
最后登录
2016-7-2

+2 论坛币
k人 参与回答

经管之家送您一份

应届毕业生专属福利!

求职就业群
赵安豆老师微信:zhaoandou666

经管之家联合CDA

送您一个全额奖学金名额~ !

感谢您参与论坛问题回答

经管之家送您两个论坛币!

+2 论坛币

前面我们介绍了关于UIImage的知识点,相信大家对他有了了解,这里继续为大家讲解UIkit框架http://www.maiziedu.com/course/18/中的UIImage。

图片拉伸

当我们的图片比所要填充的区域小时,会导致图片变形。如以下图片,原始大小为100*30,将其放到一个300*50UIImageView中时,整个图片被拉伸。

原始图片

拉伸后的图片

这时我们就需要做特殊的处理。

Android的同学应该都知道.9图,这种图片可以只拉伸中间的部分,而保持四个角不变形。在iOS中也支持这种操作。在早期的iOS版本中,UIImage提供了如下方法来执行此操作:

func stretchableImageWithLeftCapWidth(_ leftCapWidth: Int, topCapHeight topCapHeight: Int) -> UIImage

这个方法通过leftCapWidthtopCapHeight两个参数来定义四个角的大小。不过这个方法在iOS 5中就被Deprecated了,对应的两个属性leftCapWidthtopCapHeight也是相同的命运。所以现在不建议使用它们。另外,对于如何解释leftCapWidthtopCapHeight,大家可以参考一下@M了个J的iOS图片拉伸技巧

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)

其得到的结果如下所示:

iOS 6Apple又为我们提供了一个新的方法,相较于上面这个方法,只是多一个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格式。

原文来自:南峰子的技术博客


二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

关键词:image IIM Age ima Kit Android 知识点 图片 变形

沙发
Akybat 发表于 2016-6-19 18:31:11 |只看作者 |坛友微信交流群
图片看不到

使用道具

您需要登录后才可以回帖 登录 | 我要注册

本版微信群
加好友,备注cda
拉您进交流群

京ICP备16021002-2号 京B2-20170662号 京公网安备 11010802022788号 论坛法律顾问:王进律师 知识产权保护声明   免责及隐私声明

GMT+8, 2024-5-1 04:56