IOS中图片拉伸技巧与方法总结(转载)
以下内容转载自:http://my.oschina.net/u/2340880/blog/403996
IOS中图片拉伸技巧与方法总结
一、了解几个图像拉伸的函数和方法
1、直接拉伸法
简单暴力,却是最最常用的方法,直接将图片设置为ImageView的image属性,图片便会随UIImageView对象的大小做自动拉伸。这种拉伸的方法有一个致命的缺陷,它会使图像发生失真与形变。
2、像素点的拉伸
- (UIImage *)stretchableImageWithLeftCapWidth:(NSInteger)leftCapWidth topCapHeight:(NSInteger)topCapHeight;
这个函数我们可以用来拉伸类似QQ,微信的聊天气泡背景图,它的两个参数分别leftCapWidth和topCapHeight,这两个参数给定一个坐标,比如:
1
2
|
UIImage * img= [UIImage imageNamed:@ "11.png" ]; img = [img stretchableImageWithLeftCapWidth:1 topCapHeight:1]; |
这段代码的意思是将图片从左起第2列,上起第2行,坐标为(2,2)的像素点进行复制。将图片进行拉伸。这个方法和上面的方法比起来似乎灵活性更多了,但其也有它的一些局限,如果被拉伸的图片中间也有需要拉伸的像素,这个方法就无能为力了,例如,如下的一张图片,我们需要将其拉伸放大:
便会出现这样的效果:
这明显和我们的意图是不符的,那么,我们可以使用下面的方法。
3、区域的拉伸
- (UIImage *)resizableImageWithCapInsets:(UIEdgeInsets)capInsets;
这个函数需要设置一个UIEdgeInsets参数,UIEdgeInsets结构体如下:
1
2
3
|
typedef struct UIEdgeInsets { CGFloat top, left, bottom, right; } UIEdgeInsets; |
它分别对用了图片进行拉伸的区域距离顶部、左部、下部、右部的像素。比如,一个10*10像素的图片,将UIEdgeInsets参数全部设置为1,则实际拉伸的部分就是中间的8*8的区域的像素。有一点需要注意,这个方法默认使用的拉伸模式是区域复制,比如还是上面的图案,如下代码拉伸:
1
2
|
UIImage * img= [UIImage imageNamed:@ "11.png" ]; img = [img resizableImageWithCapInsets:UIEdgeInsetsMake(1, 1, 1, 1)]; |
结果如下:
可以明显的看到中间的虚线,这便是区域复制的杰作。
那么问题又来了,如果某些图片中间有渐变,我们该怎么处理了,来看下一个函数。
4、拉伸模式的设置
- (UIImage *)resizableImageWithCapInsets:(UIEdgeInsets)capInsets resizingMode:(UIImageResizingMode)resizingMode;
这个函数和上一个函数相比,唯一的差别是多了一个参数。这个参数是个枚举,如下:
1
2
3
4
|
typedef NS_ENUM(NSInteger, UIImageResizingMode) { UIImageResizingModeTile, //进行区域复制模式拉伸 UIImageResizingModeStretch, //进行渐变复制模式拉伸 }; |
现在就明了了,我们只需要设置一下模式,就可以实现渐变拉伸了:
1
2
|
UIImage * img= [UIImage imageNamed:@ "11.png" ]; img = [img resizableImageWithCapInsets:UIEdgeInsetsMake(1, 1, 1, 1) resizingMode:UIImageResizingModeStretch]; |
来看一下效果:
二、拉伸的用武之地
圆角按钮,空心按钮,渐变的背景,内容可变的标签,聊天气泡等等这样的素材在APP中很可能会多次出现,并且每次出现的尺寸可能还会略微有些差异,如果仅仅依靠美工的素材,恐怕不仅很难达到要求,也会额外增加软件的内存开销,这时,我们使用恰当的拉伸技巧,能使我们的代码更加健壮,APP更加高效。
三、一点小经验
你是否注意观察过最细的线?
看到上面的问句,你可能有些差异。最细的线不就是一像素么?确实,能绘图画出来的最细的实心线确实是一像素,但在一个项目中,我们优秀的美工察觉到无论她把线做的多么细,无论我怎样控制拉伸方法,绘制出的登录框总是没有QQ的细,QQ的框线看起来更加干脆利索。后来索性用绘图画出登录框,结果很不幸,我依然无法将线做到像QQ登录框那样细致。后来偶然试了一种方法,不知原理是否正确,效果总算达到了,当然这也要归功于我们的美工,她将一个图片做的很大,适配最大的分辨率,然后让我手动缩,如此一来,那线就变得非常细。
IOS中图片拉伸技巧与方法总结(转载)的更多相关文章
- ios中图片拉伸用法
- (UIImage *)stretchableImageWithLeftCapWidth:(NSInteger)leftCapWidth topCapHeight:(NSInteger)topCap ...
- iOS中图片拉伸,类似Android中的点9图片
UIImage* img=[UIImage imageNamed:@"name.png"];//原图 UIEdgeInsets edge=UIEdgeInsetsMake(, , ...
- 谈谈 iOS 中图片的解压缩
原文 对于大多数 iOS 应用来说,图片往往是最占用手机内存的资源之一,同时也是不可或缺的组成部分.将一张图片从磁盘中加载出来,并最终显示到屏幕上,中间其实经过了一系列复杂的处理过程,其中就包括了对图 ...
- 【转】谈谈 iOS 中图片的解压缩
转自:http://blog.leichunfeng.com/blog/2017/02/20/talking-about-the-decompression-of-the-image-in-ios/ ...
- ios中图片的绘画和截图
ios中图片的绘画和截图 CGImageCreateWithImageInRect截图和UIGraphicsGetImageFromCurrentImageContext绘画图片 使用CGImageC ...
- iOS图片拉伸技巧
纵观移动市场,一款移动app,要想长期在移动市场立足,最起码要包含以下几个要素:实用的功能.极强的用户体验.华丽简洁的外观.华丽外观的背后,少不了美工的辛苦设计,但如果开发人员不懂得怎么合理展示这些设 ...
- (转)iOS图片拉伸技巧
( 原文博客地址: http://blog.csdn.net/q199109106q/article/details/8615661) 纵观移动市场,一款移动app,要想长期在移动市场立足,最起码要 ...
- 李洪强iOS开发之图片拉伸技巧
纵观移动市场,一款移动app,要想长期在移动市场立足,最起码要包含以下几个要素:实用的功能.极强的用户体验.华丽简洁的外观.华丽外观的背后,少不了美工的辛苦设计,但如果开发人员不懂得怎么合理展示这些设 ...
- iOS图片拉伸技巧-李明杰分享
http://bbs.itcast.cn/thread-21436-1-1.html 本文目录 "一.iOS5.0之前------------------------------------ ...
随机推荐
- (Python)导出指定文件夹中as文件的完全限定类名
AS3程序在编译的过程中,有一个特点是这样的,不管是项目中的类,还是标准库或者第三方库的类,编译的时候只会把用到的那些类文件编译进去,也就是说,某一些类,只要没有被主程序引用到,那这个文件是不会被编译 ...
- JavaScipt的秘密花园
对象使用和属性 JavaScript 中所有变量都可以当作对象使用,除了两个例外 null 和undefined. false.toString(); // 'false'[1, 2, 3].toSt ...
- iOS开发UI篇—Quartz2D简单使用(三)
iOS开发UI篇—Quartz2D简单使用(三) 一.通过slider控制圆的缩放 1.实现过程 新建一个项目,新建一个继承自UIview的类,并和storyboard中自定义的view进行关联. 界 ...
- 1238. Folding
http://acm.timus.ru/problem.aspx?space=1&num=1238 DP+记忆化搜索 思路不难,关键是最优结果的储存问题,为了编写方便,直接用string储存最 ...
- CPU寄存器
CPU寄存器主要的有 CS:IP这是代码段,主要是执行代码的: SS:SP这是栈段,很多时候数据都要用它, ds:si,这是一个数据段, 还有一个标志寄存器flag,中断的时候要保存它的信息,以便中断 ...
- c#新手之1-如何组织类及相互调用
不知道这个文章的名字起的对不对,姑且这么叫吧.我在这之前用c语言写程序几乎很少用函数调用来解决问题,都是用全局变量然后面向过程对数据做简单的处理,这就造成了我在学习c@之后仍有这个毛病,好点的时候有个 ...
- Android 自动生成表格
Layout.xml <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:a ...
- Logistic回归小结
1.梯度上升优化 1). 伪代码: 所有回归系数初始化为1-------------------weights = ones((colNum,1)) 重复r次: 计算整个数据集的梯度gradient ...
- VC++ 文件系统
using namespace System; using namespace System::IO; void ShowHelpMsg(){ Console::WriteLine(L"本程 ...
- html、css、js注释
HTML注释 <!--注释的内容--> CSS注释 /* 注释内容 */ JS注释 单行注释以 // 开头. 多行注释以 /* 开始,以 */ 结尾.