IOS 中图片 (UIImage) 拉伸技巧
iOS中图片拉伸技巧与方法总结
一、了解几个图像拉伸的函数和方法
1、直接拉伸法
简单暴力,却是最最常用的方法,直接将图片设置为ImageView的image属性,图片便会随UIImageView对象的大小做自动拉伸。这种拉伸的方法有一个致命的缺陷,它会使图像发生失真与形变。
2、像素点的拉伸
- (UIImage *)stretchableImageWithLeftCapWidth:(NSInteger)leftCapWidth topCapHeight:(NSInteger)topCapHeight;
这个函数我们可以用来拉伸类似QQ,微信的聊天气泡背景图,它的两个参数分别leftCapWidth和topCapHeight,这两个参数给定一个坐标,比如:
UIImage * img= [UIImage imageNamed:@"11.png"]; img = [img stretchableImageWithLeftCapWidth:1 topCapHeight:1];
这段代码的意思是将图片从左起第2列,上起第2行,坐标为(2,2)的像素点进行复制。将图片进行拉伸。这个方法和上面的方法比起来似乎灵活性更多了,但其也有它的一些局限,如果被拉伸的图片中间也有需要拉伸的像素,这个方法就无能为力了,例如,如下的一张图片,我们需要将其拉伸放大:
https://yqfile.alicdn.com/bff2a31b10e4628a78ab37aca0bd3d61aa4df93c.png
" >
便会出现这样的效果:
这明显和我们的意图是不符的,那么,我们可以使用下面的方法。
3、区域的拉伸
- (UIImage *)resizableImageWithCapInsets:(UIEdgeInsets)capInsets;
这个函数需要设置一个UIEdgeInsets参数,UIEdgeInsets结构体如下:
typedef struct UIEdgeInsets { CGFloat top, left, bottom, right; } UIEdgeInsets;
它分别对用了图片进行拉伸的区域距离顶部、左部、下部、右部的像素。比如,一个1010像素的图片,将UIEdgeInsets参数全部设置为1,则实际拉伸的部分就是中间的88的区域的像素。有一点需要注意,这个方法默认使用的拉伸模式是区域复制,比如还是上面的图案,如下代码拉伸:
UIImage * img= [UIImage imageNamed:@"11.png"]; img = [img resizableImageWithCapInsets:UIEdgeInsetsMake(1, 1, 1, 1)];
结果如下:
可以明显的看到中间的虚线,这便是区域复制的杰作。
那么问题又来了,如果某些图片中间有渐变,我们该怎么处理了,来看下一个函数。
4、拉伸模式的设置
- (UIImage *)resizableImageWithCapInsets:(UIEdgeInsets)capInsets resizingMode:(UIImageResizingMode)resizingMode;
这个函数和上一个函数相比,唯一的差别是多了一个参数。这个参数是个枚举,如下:
typedef NS_ENUM(NSInteger, UIImageResizingMode) { UIImageResizingModeTile,//进行区域复制模式拉伸 UIImageResizingModeStretch,//进行渐变复制模式拉伸 };
现在就明了了,我们只需要设置一下模式,就可以实现渐变拉伸了:
UIImage * img= [UIImage imageNamed:@"11.png"]; img = [img resizableImageWithCapInsets:UIEdgeInsetsMake(1, 1, 1, 1) resizingMode:UIImageResizingModeStretch];
来看一下效果:
https://yqfile.alicdn.com/9357a98907810896f21614fdc3cfd9a1b3d13312.png" >
二、拉伸的用武之地
圆角按钮,空心按钮,渐变的背景,内容可变的标签,聊天气泡等等这样的素材在APP中很可能会多次出现,并且每次出现的尺寸可能还会略微有些差异,如果仅仅依靠美工的素材,恐怕不仅很难达到要求,也会额外增加软件的内存开销,这时,我们使用恰当的拉伸技巧,能使我们的代码更加健壮,APP更加高效。
三、一点小经验
你是否注意观察过最细的线?
看到上面的问句,你可能有些差异。最细的线不就是一像素么?确实,能绘图画出来的最细的实心线确实是一像素,但在一个项目中,我们优秀的美工察觉到无论她把线做的多么细,无论我怎样控制拉伸方法,绘制出的登录框总是没有QQ的细,QQ的框线看起来更加干脆利索。后来索性用绘图画出登录框,结果很不幸,我依然无法将线做到像QQ登录框那样细致。后来偶然试了一种方法,不知原理是否正确,效果总算达到了,当然这也要归功于我们的美工,她将一个图片做的很大,适配最大的分辨率,然后让我手动缩,如此一来,那线就变得非常细。
文章转载自 开源中国社区 [http://www.oschina.net]

低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
谈 Windows 的伪开源
最近一则 Windows 未来可能走向开源的报道,在业内引起了强烈反响。多数评论认为这是传统PC产业疲软下自救的选择,但事实真的如此吗? https://yqfile.alicdn.com/fa00965d11e107e601a3f3f02d4dcb0225898eba.png" > PC市场的疲软,和在智能手机市场表现不佳,并不是因为Windows闭源。PC市场疲软的原因很多,其中用户需求的疲软及平板电脑和智能手机的衝击,是比较重要的因素。但从整个PC软生态环境看,Windows 仍然佔据著不可替代的位置和优势,儘管有Mac OS X和Chrome OS与其竞争,但目前收效甚微。再看智能手机市场,微软之所以在这个市场的表现不佳,是因为之前对移动市场战略不重视。微软意识到移动市场重要性之后,採取了所谓「系统融合」策略。融合的想法很好,但从 Windows 10推出之前,微软的融合策略实际上都不是真正融合,没有採用统一的 Windows 核心。传统PC和以智能手机和平板电脑为代表的移动市场,是完全不同的应用场景和方式。这就决定了用同一个系统,要兼顾跨界体验的技术是困难的,这也是为何...
- 下一篇
Android 的指纹识别,比你想象中还要不安全?
https://yqfile.alicdn.com/e156dbe9072f5217624c6d9a712f4bd080670797.png" > 系统的开放与隐患永远是相伴相生,近日就有研究把矛头指向了 Android 系统的指纹识别。确切来说,主要指 Galaxy S5 的安全漏洞。 据福布斯报道,安全研究机构 FireEye 发布的报告称,黑客很容易利用 Galaxy S5 上的指纹识别功能盗取用户信息,尽管三星会将用户的指纹存储在不同的“信任区域”(Trusted Zone)内。 研究者表示,攻击者只需创建需要系统级访问权限的恶意程序,一旦攻破 Android 内核,就可以长驱直入,无需访问信任区域的情况下也能读取指纹传感器。盗取信息后,黑客便可逆推生成指纹图像。 报告不单单针对 Galaxy S5,包括一些未指明的 Android 手机都有一样的漏洞。FireEye 的两位中国研究者 Tao Wei 和 Yulong Zhang 说:“用户每一次使用指纹识别器,黑客就能获取用户信息。生成指纹图像后,他们就可以为所欲为了。” 两位研究者已经将漏洞报告给三星,他们还为收到任...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- CentOS7,CentOS8安装Elasticsearch6.8.6
- Docker使用Oracle官方镜像安装(12C,18C,19C)
- SpringBoot2配置默认Tomcat设置,开启更多高级功能
- Red5直播服务器,属于Java语言的直播服务器
- CentOS7设置SWAP分区,小内存服务器的救世主
- CentOS7安装Docker,走上虚拟化容器引擎之路
- SpringBoot2编写第一个Controller,响应你的http请求并返回结果
- CentOS关闭SELinux安全模块
- Jdk安装(Linux,MacOS,Windows),包含三大操作系统的最全安装
- Linux系统CentOS6、CentOS7手动修改IP地址