如何设置uiimageview 拉伸中图像不是拉伸的

UIView背景图片设置
一般设置UIImage的方法有:
&&& UIImage *image = [UIImage imageNamed:fileName];//不释放内存,要缓存
&&& UIImage *image = [UIImage imageWithContentsOfFile:path];//会释放内存
本文分析对比了各种更改UIView背景的方法。当然,背景是根据一个图片来的(非纯色)。
一.加一个uiimageview在uiview上面(可以)
&&& UIImageView* imageView = [[UIImageView alloc] initWithFrame:view.bounds];
&&& imageView.image = [[UIImage imageNamed:@"name.png"] stretchableImageWithLeftCapWidth:left topCapHeight:top];
&&& [view addSubview:imageView];
这种方式,如果原始图片大小不够(小于view的大小),可以拉伸,在view释放后也没有什么内存保留。
二.通过图片来生成UIColor设置view的backgroundColor(不推荐)
1.imageNamed方式
&&& view.backgroundColor = [UIColor colorWithPatternImage:[UIImage imageNamed:@"name.png"]];
2.contentOfFile方式
&&& NSString* path = [[NSBundle mainBundle] pathForResource:@"name" ofType:@"png"];
&&& view.backgroundColor = [UIColor colorWithPatternImage:[UIImage imageWithContentsOfFile:path];
这两种方式都会在生成color时占用大量的内存(原始图片的n倍,这个n可能会达到几千的程度)。而且如果图片大小不够,就会按照原始大小一个一个u画过去,也就是不会自动拉伸。1和2的区别在于,view释放后,1中的color并不会跟着释放,而是一直存在于内存中(当然,再次根据这个图片生成color时并不会再次申请内存了),而2中的color就会随着view的释放而释放。
三.quartzCore方式(推荐)
&&& UIImage *image = [UIImage imageNamed:@"name.png"];//这里推荐使用这种方式UIImage *image = [UIImage imageWithContentsOfFile:path];
&&& view.layer.contents = (id) image.CGI
&&& // 如果需要背景透明加上下面这句
&&& view.layer.backgroundColor = [UIColor clearColor].CGC
综上,推荐第三种方式来根据图片设置背景色。
阅读(...) 评论()IOS中图片(UIImage)拉伸技巧
IOS中图片拉伸技巧与方法总结
一、了解几个图像拉伸的函数和方法
1、直接拉伸法
简单暴力,却是最最常用的方法,直接将图片设置为ImageView的image属性,图片便会随UIImageView对象的大小做自动拉伸。这种拉伸的方法有一个致命的缺陷,它会使图像发生失真与形变。
2、像素点的拉伸
- (UIImage&*)stretchableImageWithLeftCapWidth:(NSInteger)leftCapWidth
topCapHeight:(NSInteger)topCapH
这个函数我们可以用来拉伸类似QQ,微信的聊天气泡背景图,它的两个参数分别leftCapWidth和topCapHeight,这两个参数给定一个坐标,比如:
&&&&UIImage&*&img=&[UIImage&imageNamed:@"11.png"];
&&&&img&=&[img&stretchableImageWithLeftCapWidth:1&topCapHeight:1];
这段代码的意思是将图片从左起第2列,上起第2行,坐标为(2,2)的像素点进行复制。将图片进行拉伸。这个方法和上面的方法比起来似乎灵活性更多了,但其也有它的一些局限,如果被拉伸的图片中间也有需要拉伸的像素,这个方法就无能为力了,例如,如下的一张图片,我们需要将其拉伸放大:
便会出现这样的效果:
这明显和我们的意图是不符的,那么,我们可以使用下面的方法。
3、区域的拉伸
*)resizableImageWithCapInsets:(UIEdgeInsets)capI
这个函数需要设置一个UIEdgeInsets参数,UIEdgeInsets结构体如下:
typedef&struct&UIEdgeInsets&{
&&&&CGFloat&top,&left,&bottom,&&
它分别对用了图片进行拉伸的区域距离顶部、左部、下部、右部的像素。比如,一个10*10像素的图片,将UIEdgeInsets参数全部设置为1,则实际拉伸的部分就是中间的8*8的区域的像素。有一点需要注意,这个方法默认使用的拉伸模式是区域复制,比如还是上面的图案,如下代码拉伸:
&&&&UIImage&*&img=&[UIImage&imageNamed:@"11.png"];
&&&&img&=&[img&resizableImageWithCapInsets:UIEdgeInsetsMake(1,&1,&1,&1)];
结果如下:
可以明显的看到中间的虚线,这便是区域复制的杰作。
那么问题又来了,如果某些图片中间有渐变,我们该怎么处理了,来看下一个函数。
4、拉伸模式的设置
(UIImage *)resizableImageWithCapInsets:(UIEdgeInsets)capInsets
resizingMode:(UIImageResizingMode)resizingM
这个函数和上一个函数相比,唯一的差别是多了一个参数。这个参数是个枚举,如下:
typedef&NS_ENUM(NSInteger,&UIImageResizingMode)&{
&&&&UIImageResizingModeTile,//进行区域复制模式拉伸
&&&&UIImageResizingModeStretch,//进行渐变复制模式拉伸
现在就明了了,我们只需要设置一下模式,就可以实现渐变拉伸了:
&&&&UIImage&*&img=&[UIImage&imageNamed:@"11.png"];
&&&&img&=&[img&resizableImageWithCapInsets:UIEdgeInsetsMake(1,&1,&1,&1)&resizingMode:UIImageResizingModeStretch];
来看一下效果:
二、拉伸的用武之地
圆角按钮,空心按钮,渐变的背景,内容可变的标签,聊天气泡等等这样的素材在APP中很可能会多次出现,并且每次出现的尺寸可能还会略微有些差异,如果仅仅依靠美工的素材,恐怕不仅很难达到要求,也会额外增加软件的内存开销,这时,我们使用恰当的拉伸技巧,能使我们的代码更加健壮,APP更加高效。
原文地址:
——————————————————App 广
&告————————————————
扫描二维码:
——————————————————广 告 结
束————————————————
已投稿到:
以上网友发言只代表其个人观点,不代表新浪网的观点或立场。在iOS开发中,经常会遇到控件尺寸和图片大小不匹配的情况. 一些情况下, 我们需要对图片进行拉伸, 以满足美观需求.
总的来说, 图片的拉伸方式可以分为两种, 一种是通过Xcode自带的Show Slicing功能, 一种是通过代码进行拉伸.
首先, 介绍Xcode自带的Show Slicing 功能.
1. 如下图所示的图片, 如果不进行拉伸, 直接设置给一个长度比较长的button以后,其运行效果如图所示.
& & & & & &&
2. 用Show Slicing 进行拉伸.
1)选中Assets中的图片,右下角有一个Show Slicing ,如图所示.
& & & & & &
2)点击Show Slicing 以后, 会显示如下界面, 点击图中的Start Slicing&
& & & & & &
3)拖动虚线,调整拉伸区域, 虚线内的白色区域会被拉伸, 注意要保留住四周的圆角,选择好拉伸区域以后, 点击右下角的Show Overview,就会保存拉伸后的效果了.
& & & & & &
4)这个时候,在给button设置这张背景图片,运行效果如图,这样就比原先美观多了.
5)当给UIImageView设置尺寸大小不匹配的背景图片时,还可以通过Stretching 功能,当设置了Image以后, 在Stretching的四个参数中,填入0-1的数值, 调整拉伸效果.
3. 用代码进行拉伸
1)第一种拉伸方法
- (UIImage *)stretchableImageWithLeftCapWidth:(NSInteger)leftCapWidth
topCapHeight:(NSInteger)topCapHeight
__TVOS_PROHIBITED;
& & 使用示例:
& &&UIImage *image = [UIImage
imageNamed:@&RedButton&];
& & image = [image stretchableImageWithLeftCapWidth:image.size.width *
0.5 topCapHeight:image.size.height *
& & [self.loginButton
setBackgroundImage:image forState:UIControlStateNormal];
& &使用效果:
2)第二种拉伸方法
- (UIImage *)resizableImageWithCapInsets:(UIEdgeInsets)capInsets
NS_AVAILABLE_IOS(5_0);
// create a resizable version of this image. the interior is tiled when drawn.
& & & 使用示例:
& &&UIImage *image = [UIImage
imageNamed:@&RedButton&];
& & image = [image resizableImageWithCapInsets:UIEdgeInsetsMake(image.size.height *
0.5, image.size.width *
0.5, image.size.height *
0.5, image.size.width *
& & [self.loginButton
setBackgroundImage:image forState:UIControlStateNormal];
4.在我们经常使用的微信, QQ中,聊天内容会有一个类似于气泡的背景图,如图所示
有的时候,一次回复了几百个字, 这个图片就会根据内容的多少进行拉伸,要实现这种效果就可以使用代码拉伸的方式.
参考知识库
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:169次
排名:千里之外UIImage的几种初始化方式以及在UIImageView中内容模式的设置 - cityingMa - 博客园
& & 1,使用&imageWithContentsOfFile:初始化
& & UIImage *image = [UIImage imageWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"1.png" ofType:nil]];
& & UIImageView *imageView = [[UIImageView alloc]init];
& & imageView.frame = CGRectMake(50, 50, 275, 275);
& & imageView.image =
& & imageView.backgroundColor = [UIColor yellowColor];
& & [self.view addSubview:imageView];
& & 2,使用initWithContentsOfFile:初始化
& & UIImage *image1 = [[UIImage alloc]initWithContentsOfFile:[NSString stringWithFormat:@"%@/1.png",[[NSBundle mainBundle] resourcePath]]] ;
& & UIImageView *imageView1 = [[UIImageView alloc]init];
& & imageView1.frame = CGRectMake(50, 350, 275, 275);
& & imageView1.image = image1;
& & imageView1.backgroundColor = [UIColor yellowColor];
& & [self.view addSubview:imageView1];
& & 使用这两种方式初始化 都可以成功运行出来 下图是运行效果的一个截图
& & 3,使用imageNamed:初始化
& & UIImage *image2 = [UIImage imageNamed:@"1.png"];
& & UIImageView *imageView2 = [[UIImageView alloc]init];
& & imageView2.frame = CGRectMake(50, 350, 275, 275);
& & imageView2.image = image2;
& & imageView2.backgroundColor = [UIColor yellowColor];
& & [self.view addSubview:imageView2];
我主要想讲一下imageNamed:和前两种分别的使用情况:
当一些图片占十几KB而已并且常用的时候,建议使用imageNamed:
imageNamed:这个方法会将图片缓存到内存中 ,使用图片时会去寻找缓存,如果找不到才去NSBundle中找,找到后缓存,返回对象。找不到返回nil&
但是有个弊端:程序结束的时候,这个图片才被释放掉,所以占用的内存很多。
前两种是真接找路径中的图片,找不到返回nil.若使用的图片是高清大图不常用的时候,建议使用&imageWithContentsOfFile:或者initWithContentsOfFile:
需要的时候 再加载。
使用图片时一般会按照载体也就是UIImageView的大小进行拉伸,要使用原图大小的图片,可以在宽/高设置为image的实际宽高,也就是image.size.width/image.size.height。
UIImage *image2 = [UIImage imageNamed:@"1.png"];
& & UIImageView *imageView2 = [[UIImageView alloc]init];
& & imageView2.frame = CGRectMake(50, 350, image2.size.width, image2.size.height);
& & imageView2.image = image2;
& & imageView2.backgroundColor = [UIColor yellowColor];
& & [self.view addSubview:imageView2];
& & 上面这种情况有一个没有解决的问题, 我们以及能使用原图大小的图片,但是载体的大小也只能是原图的大小,这样使用起来比较受限。使用内容模式能解决这类问题:
& & 下面讲讲内容模式
& & // 内容模式
&& & UIViewContentModeScaleToFill& 拉伸充满整个载体
&& & UIViewContentModeScaleAspectFit & & 拉伸但不改变比例,充满最小的一边
&& & UIViewContentModeScaleAspectFill 拉伸但不改变比例,充满最大的一边
&& & UIViewContentModeRedraw,
&& & UIViewContentModeCenter
& & 我们不需要UIImageView的frame中将宽/高设置为image的实际宽高,只要设置imageView的内容模式:
& & imageView.contentMode = UIViewContentModeCenter;
下面的第一张是设置了imageView的内容模式,可以见到使用了原图而且imageView的大小可以随意设置。第二张是将imageView宽/高设置为image的实际宽高,才达到使用原图的目的。
总结:当你使用图片的时候,有两点需要考虑一下,第一点:你的图片是否高清?是否常用?第二点:你是不是不希望你的图片被拉伸或者被拉伸比例?
当你考虑到这两点的时候,我的这篇文章可能会对你有点小帮助。&UIImage&*image = [UIImage&imageNamed:@"RedButton"];
& &&//&通过一张原始图片生成一张可拉伸的图片
& &&CGFloat&imageW = image.size.width&*&0.5;
& &&CGFloat&imageH = image.size.height&*&0.5;
& &&UIImage&*newImage = [image&resizableImageWithCapInsets:UIEdgeInsetsMake(imageH, imageW, imageH, imageW)&resizingMode:UIImageResizingModeStretch];
& & [self.loginBtn&setBackgroundImage:newImage&forState:UIControlStateNormal];
& &&UIImage&*selImage = [UIImage&imageNamed:@"RedButtonPressed"];
& &&CGFloat&selImageW = selImage.size.width&*&0.5;
& &&CGFloat&selImageH = selImage.size.height&*&0.5;
& &&UIImage&*selNewImage = [selImage&resizableImageWithCapInsets:UIEdgeInsetsMake(selImageH, selImageW, selImageH, selImageW)&resizingMode:UIImageResizingModeStretch];
& & [self.loginBtn&setBackgroundImage:selNewImage&forState:UIControlStateHighlighted];
阅读(...) 评论()

我要回帖

更多关于 uiimageview不拉伸 的文章

 

随机推荐