开发过程中,难免会遇到这种情况,图片需按照文本长度进行拉伸,这时候需要设计师给我们切一张尽可能短的图片,否则可能会出现压缩的情况,尽可能短是为了方便只做拉伸处理。
解决问题方法一(不推荐)
我们将图片资源拖进项目图片资源文件夹,点击Show Slicing,然后点击Start Slicing,出现如下 几种选择
这时候就根据你的需要,选择拉伸方式。我这里以横向拉伸为例:
会出现三条虚线,我们需要将三条虚线都拖到我们想要拉伸的区域里,如下图
这样,图片就会按照我们想要的方式进行拉伸,并且两边的图形不会被拉伸变形。
这里还有需要注意的地方,假如我们的@2x的图片,像素是30 * 30 的,那么我们控件的逻辑点的高度就必须小于等于15,如果大于15了,那么图片纵向将会有问题,所以我们还需要配置一些东西
这里Slices我们刚选择是横向拉伸,所以这里是Horizontal。而Center默认是Tiles,表示按照瓷砖样式,拷贝原图像,进行拼接,stretches表示拉伸。
如果我们控件的高度大于@2x 的像素30 / 2,假设是20,而center选择的是Tiles,那么就会出现拷贝拼接的问题,在最下面拷贝了原来的图片,进行了拼接,所以我们Center选项也要选择stretches拉伸。但即时如此,图片纵向也就被拉伸变形了。所以我们需要让设计师切的图片尽量是和控件高度相对应最好。
解决问题方法二(推荐):
//iOS5 推出的方法
/*
capInsets,设置保护区域,这个区域内的部分不会被拉伸处理
*/
- (UIImage *)resizableImageWithCapInsets:(UIEdgeInsets)capInsets resizingMode:(UIImageResizingMode)resizingMode;
这里需要特别注意的是,UIImage的这个方法是有返回值的,原UIImage对象是没有修改的,所以需要指定控件的Image为返回值,而不是原对象
//还是以上图为例,图片逻辑点是15*15,我们这里还是横向拉伸就可以通过以下处理
UIImageView *imageView = [UIImageView new];
[self.view addSubview:imageView];
imageView.frame = CGRectMake(100, 250, 100, 14); //宽度设置为100
UIImage *image = [UIImage imageNamed:@"icon_tag_border"];
// 设置capInsets的左右保护区域,大致左右各6就够了
imageView.image = [image resizableImageWithCapInsets:UIEdgeInsetsMake(0, 6, 0, 6) resizingMode:UIImageResizingModeStretch];