iOS中图片(UIImage)拉伸技巧

iOS中图片拉伸技巧与方法总结

1、了解几个图像拉伸的函数和方法

一、直接拉伸法

简单暴力,倒是最最经常使用的方法,直接将图片设置为ImageView的image属性,图片便会随UIImageView对象的大小作自动拉伸。这种拉伸的方法有一个致命的缺陷,它会使图像发生失真与形变。微信

二、像素点的拉伸

 

- (UIImage *)stretchableImageWithLeftCapWidth:(NSInteger)leftCapWidth topCapHeight:(NSInteger)topCapHeight;函数

这个函数咱们能够用来拉伸相似QQ,微信的聊天气泡背景图,它的两个参数分别leftCapWidth和topCapHeight,这两个参数给定一个坐标,好比:spa

    UIImage * img= [UIImage imageNamed:@"11.png"];
    img = [img stretchableImageWithLeftCapWidth:1 topCapHeight:1];

这段代码的意思是将图片从左起第2列,上起第2行,坐标为(2,2)的像素点进行复制。将图片进行拉伸。这个方法和上面的方法比起来彷佛灵活性更多了,但其也有它的一些局限,若是被拉伸的图片中间也有须要拉伸的像素,这个方法就无能为力了,例如,以下的一张图片,咱们须要将其拉伸放大:code

便会出现这样的效果:对象

这明显和咱们的意图是不符的,那么,咱们可使用下面的方法。图片

三、区域的拉伸

- (UIImage *)resizableImageWithCapInsets:(UIEdgeInsets)capInsets;内存

这个函数须要设置一个UIEdgeInsets参数,UIEdgeInsets结构体以下:it

typedef struct UIEdgeInsets {
    CGFloat top, left, bottom, right; 
} UIEdgeInsets;

它分别对用了图片进行拉伸的区域距离顶部、左部、下部、右部的像素。好比,一个10*10像素的图片,将UIEdgeInsets参数所有设置为1,则实际拉伸的部分就是中间的8*8的区域的像素。有一点须要注意,这个方法默认使用的拉伸模式是区域复制,好比仍是上面的图案,以下代码拉伸:登录

    UIImage * img= [UIImage imageNamed:@"11.png"];
    img = [img resizableImageWithCapInsets:UIEdgeInsetsMake(1, 1, 1, 1)];

结果以下:原理

能够明显的看到中间的虚线,这即是区域复制的杰做。

那么问题又来了,若是某些图片中间有渐变,咱们该怎么处理了,来看下一个函数。

四、拉伸模式的设置

- (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];

来看一下效果:

2、拉伸的用武之地

圆角按钮,空心按钮,渐变的背景,内容可变的标签,聊天气泡等等这样的素材在APP中极可能会屡次出现,而且每次出现的尺寸可能还会略微有些差别,若是仅仅依靠美工的素材,恐怕不只很难达到要求,也会额外增长软件的内存开销,这时,咱们使用恰当的拉伸技巧,能使咱们的代码更加健壮,APP更加高效。

3、一点小经验

你是否注意观察过最细的线?

看到上面的问句,你可能有些差别。最细的线不就是一像素么?确实,能绘图画出来的最细的实心线确实是一像素,但在一个项目中,咱们优秀的美工察觉到不管她把线作的多么细,不管我怎样控制拉伸方法,绘制出的登陆框老是没有QQ的细,QQ的框线看起来更加干脆利索。后来索性用绘图画出登陆框,结果很不幸,我依然没法将线作到像QQ登陆框那样细致。后来偶然试了一种方法,不知原理是否正确,效果总算达到了,固然这也要归功于咱们的美工,她将一个图片作的很大,适配最大的分辨率,而后让我手动缩,如此一来,那线就变得很是细。

专一技术,热爱生活,交流技术,也作朋友。

——珲少 QQ群:203317592

相关文章
相关标签/搜索