今天总结一下在实际开发中关于图片拉伸的问题,希望对大家有所帮助。
在开发中,我们经常会遇到关于设置背景图片的问题,当图片比较小的时候,我们直接用[UIImage imageNamed:@"xxx"]这个方法设置背景图片的话,图片会拉伸和失真.
eg :
UIImage *norImage = [UIImage imageNamed:@"btn_nor"];
为了解决这个问题,苹果对UIImage给出了三种方法来处理图片失真的问题 :
第一种方法 (iOS 5 以前的方法),该方法已经弃用,不建议使用
利用 [norImage stretchableImageWithLeftCapWidth:nil topCapHeight:nil]方法来处理:
/*
该方法可以返回一张拉伸指定位置的图片
LeftCapWidth左边多大的距离不可以拉伸(水平方向)
即: default is 0. if non-zero, horiz. stretchable. right cap is calculated as width - leftCapWidth - 1
1 = width - leftCapWidth - right
topCapHeight上边有多大的距离不可以拉伸(垂直方法)
即: default is 0. if non-zero, vert. stretchable. bottom cap is calculated as height - topCapWidth - 1
1 = height - topCapWidth - bottom
*/
UIImage *newImage = [norImage stretchableImageWithLeftCapWidth:30 topCapHeight:30];
第二种方法 (iOS 5 添加的方法,该方法有弊端,不建议使用)
利用 [norImage resizableImageWithCapInsets:UIEdgeInsetsMake(顶部距离,左边距离,底部距离,右边距离)]方法来处理 :
/*
ios5
指定图片的上边,下边,左边,右边 多少距离是不可以拉伸的
默认的拉伸方案是平铺
CGFloat w = norImage.size.width;
CGFloat h = norImage.size.height;
UIImage *newImage = [norImage resizableImageWithCapInsets:UIEdgeInsetsMake(h * 0.5 - 1 , w * 0.5 - 1, h * 0.5 , w * 0.5)];
*/
注意 : 该方法默认的拉伸方案是平铺的方式,如果现在的位置不合适,会出现平铺不合适的位置.
第三种方法 (iOS 6以及以后的方法,相比iOS 5的方法,多了一个指定拉伸模式的参数: 即 : 平铺, 拉伸)
利用[norImage resizableImageWithCapInsets:UIEdgeInsetsMake(h, w, h, w) resizingMode:UIImageResizingModeStretch]方法来处理 :
UIImageResizingModeTile, // 平铺
UIImageResizingModeStretch, // 拉伸
CGFloat w = norImage.size.width * 0.5;
CGFloat h = norImage.size.height * 0.5;
UIImage *newImage = [norImage resizableImageWithCapInsets:UIEdgeInsetsMake(h, w, h, w) resizingMode:UIImageResizingModeStretch];
注意 : 方法3是对方法2的进一步完善,建议在开放中,如果是用纯代码开发的话建议是用方法三
以上是本人对于这三个方法的理解,希望对大家有所帮助,如有不正确的地方,请大家多多指正,如果喜欢这篇文章,麻烦轻轻动一下手指,给一个star.您的鼓励,是我最大的动力.谢谢.