ios图片局部拉伸

article/2025/9/14 19:05:48

转载自http://justsee.iteye.com/blog/1973358


下面张图片,本来是设计来做按钮背景的:


  button.png,尺寸为:24x60

现在我们把它用作为按钮背景,按钮尺寸是150x50:

C代码   收藏代码
  1. // 得到view的尺寸  
  2. CGSize viewSize = self.view.bounds.size;  
  3.   
  4. // 初始化按钮  
  5. UIButton *button = [[UIButton alloc] init];  
  6. // 设置尺寸  
  7. button.bounds = CGRectMake(0, 0, 150, 50);  
  8. // 设置位置  
  9. button.center = CGPointMake(viewSize.width * 0.5f, viewSize.height * 0.5f);  
  10.   
  11. // 加载图片  
  12. UIImage *image = [UIImage imageNamed:@"button"];  
  13. // 设置背景图片  
  14. [button setBackgroundImage:image forState:UIControlStateNormal];  
  15.   
  16. // 添加按钮  
  17. [self.view addSubview:button];  

 

运行效果图:



 

可以看到,效果非常地差。原因很简单,因为原图大小为24x60,现在整张图片被全方位拉伸为150x50,比较严重的是图片的4个角。

有些人可能马上想到一个解决方案,你叫美工把图片做大一点不就好了么,怎么拉伸都没事。没错,这是一种解决方案,不过不建议采取。原因很简单:1.图片大,导致安装包也大,加载到内存中也大;2.有更好的解决方案。

细看一下图片,其实图片会变得难看,完全是因为4个角被拉伸了,中间的拉伸并没有明显地丑化外观。因此要想小图片被拉伸后不会变得难看,在图片拉伸的时候,我们只需拉伸图片的中间一块矩形区域即可,不要拉伸边缘部分。

比如只拉伸下图的矩形区域,上下左右的边缘都不拉伸:



 

iOS中提供很好用的API帮我们实现上述功能。到iOS 6.0为止,iOS提供了3种图片拉伸的解决方案,接下来分别详细介绍这些方案。

一、iOS 5.0之前

iOS中有个叫端盖(end cap)的概念,用来指定图片中的哪一部分不用拉伸。比如下图中,黑色代表需要被拉伸的矩形区域,上下左右不需要被拉伸的边缘就称为端盖。



 

使用UIImage的这个方法,可以通过设置端盖宽度返回一个经过拉伸处理的UIImage对象

Java代码   收藏代码
  1. - (UIImage *)stretchableImageWithLeftCapWidth:(NSInteger)leftCapWidth topCapHeight:(NSInteger)topCapHeight;  

 

这个方法只有2个参数,leftCapWidth代表左端盖宽度,topCapHeight代表顶端盖高度。系统会自动计算出右端盖宽度(rightCapWidth)和底端盖高度(bottomCapHeight),算法如下:

Java代码   收藏代码
  1. // width为图片宽度  
  2. rightCapWidth = width - leftCapWidth - 1;  
  3.   
  4. // height为图片高度  
  5. bottomCapHeight = height - topCapHeight - 1  

 

经过计算,你会发现中间的可拉伸区域只有1x1

Java代码   收藏代码
  1. // stretchWidth为中间可拉伸区域的宽度  
  2. stretchWidth = width - leftCapWidth - rightCapWidth = 1;  
  3.       
  4. // stretchHeight为中间可拉伸区域的高度  
  5. stretchHeight = height - topCapHeight - bottomCapHeight = 1;  

 

因此,使用这个方法只会拉伸图片中间1x1的区域,并不会影响到边缘和角落。

下面演示下方法的使用:

Java代码   收藏代码
  1. // 左端盖宽度  
  2. NSInteger leftCapWidth = image.size.width * 0.5f;  
  3. // 顶端盖高度  
  4. NSInteger topCapHeight = image.size.height * 0.5f;  
  5. // 重新赋值  
  6. image = [image stretchableImageWithLeftCapWidth:leftCapWidth topCapHeight:topCapHeight];  

 

调用这个方法后,原来的image并不会发生改变,会产生一个新的经过拉伸的UIImage,所以第6行中需要将返回值赋值回给image变量

运行效果:




 可以发现,图片非常美观地显示出来了

注意:

1.这个方法在iOS 5.0出来后就过期了

2.这个方法只能拉伸1x1的区域

 

二、iOS 5.0

在iOS 5.0中,UIImage又有一个新方法可以处理图片的拉伸问题

Java代码   收藏代码
  1. - (UIImage *)resizableImageWithCapInsets:(UIEdgeInsets)capInsets  

 

这个方法只接收一个UIEdgeInsets类型的参数,可以通过设置UIEdgeInsets的left、right、top、bottom来分别指定左端盖宽度、右端盖宽度、顶端盖高度、底端盖高度

Java代码   收藏代码
  1. CGFloat top = 25// 顶端盖高度  
  2. CGFloat bottom = 25 ; // 底端盖高度  
  3. CGFloat left = 10// 左端盖宽度  
  4. CGFloat right = 10// 右端盖宽度  
  5. UIEdgeInsets insets = UIEdgeInsetsMake(top, left, bottom, right);  
  6. // 伸缩后重新赋值  
  7. image = [image resizableImageWithCapInsets:insets];  

 

运行效果:




 
 

 

三、iOS 6.0

在iOS6.0中,UIImage又提供了一个方法处理图片拉伸

 

Java代码   收藏代码
  1. - (UIImage *)resizableImageWithCapInsets:(UIEdgeInsets)capInsets resizingMode:(UIImageResizingMode)resizingMode  

 

对比iOS5.0中的方法,只多了一个UIImageResizingMode参数,用来指定拉伸的模式:

  • UIImageResizingModeStretch:拉伸模式,通过拉伸UIEdgeInsets指定的矩形区域来填充图片
  • UIImageResizingModeTile:平铺模式,通过重复显示UIEdgeInsets指定的矩形区域来填充图片
Java代码   收藏代码
  1. CGFloat top = 25// 顶端盖高度  
  2. CGFloat bottom = 25 ; // 底端盖高度  
  3. CGFloat left = 10// 左端盖宽度  
  4. CGFloat right = 10// 右端盖宽度  
  5. UIEdgeInsets insets = UIEdgeInsetsMake(top, left, bottom, right);  
  6. // 指定为拉伸模式,伸缩后重新赋值  
  7. image = [image resizableImageWithCapInsets:insets resizingMode:UIImageResizingModeStretch];  

运行效果:



 



http://chatgpt.dhexx.cn/article/K6yFwW3Z.shtml

相关文章

Qt部分拉伸的背景图片

目录 引言代码实现 引言 QSS是Qt客户端开发中非常重要的一环,也是非常容易被忽略的一环。因为网上有太多的博文直接给出了相对美观的样式,导致多数人只是将样式表拷贝使用,而没有细究其中的语法。这也是我在面试时分辨Qt界面开发经验的重要标…

android 九宫格 拉伸,CAScale9ImageView(九宫格图片拉伸)

类说明 CAScale9ImageView是CrossApp提供的一种九宫格拉伸图片的解决方案,我们先来了解一下什么是九宫格图片拉伸。 在App的设计过程中,为了适配不同的手机分辨率,图片大小需要拉伸或者压缩,这样就出现了可以任意调整大小的拉伸样式。 CAScale9ImageView 属性(点击方法名可…

Android自适应拉伸图片

这篇文章是android开发人员的必备知识,内容摘选自网络,友我为大家整理和总结,不求完美,但是有用。 视频教程地址:http://player.youku.com/player.php/sid/XMTMwODc3Njc2/v.swf 1.背景自适应且不失真问题的存在 制作自…

android 图片自动拉伸,解决关于ImageView自适应的问题(拉伸变形,图片模糊)

今天接手一个项目发现有个地方的图片显示非常小,而且还不够清晰,也没办法自适应屏幕的显示,非常的影响美观,于是 就像这优化一下。 先看看优化前的效果和优化后的效果。 修复后 修复前 布局文件修复前: 修复前 布局文件…

html背景图片纵向拉伸,html网页背景图片拉伸 关于html背景图片往下拉伸问题

html 如何让背景图片充满全图,就是拉伸 html语言背景图片拉伸代码:background-size:cover,可以使图片拉伸铺满背景。 拓展资料 背景 (background) 属性定义元素的背景效果 元素的背景区包括前景之下直到边框边界的所有空间。因此,…

android 拉伸图片

Android拉伸图片用的是9.png格式的图片,这种图片可以指定图片的那一部分拉伸,那一部分显示内容,美工给的小图片也能有很好的显示效果。 原背景图片 可以看到原背景图片很小,即使在再长的文字,背景图片的圆角也不会拉伸…

html js 修改img 图片不拉伸,防止图片拉伸的自适应处理

在web开发中,作为前端经常会遇到处理图片拉伸问题的情况。 例如banner、图文列表、头像等所有和用户或客户自主操作图片上传的地方, 而一旦牵扯图片,就会涉及到图片拉伸的问题, 当然,在图片上传时做手动裁切,让用户或客户清晰的感知到图片的有效内容才是最优的解决方案,…

html平铺 拉伸 图片,[CSS]背景图片中平铺与拉伸

在某业务场景下,需要支持背景图的平铺和拉伸,那么在CSS中的这俩属性表现有何区分关系到是否符合业务表现,因此有必要清晰知道其差别。 原本以为只有自己会遇到,没想到群里有小伙伴也问到了。 0x00 background-size 在CSS中有background-size属性,平铺与拉伸可以通过下面两…

html 如何完美的显示图片,不拉伸图片,完整显示等等。

效果图&#xff1a; 代码&#xff1a; <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>Document<…

html插入背景图片如何拉伸,css怎样拉伸背景图片?

在css中可以使用background-size属性来拉伸背景图片。background-size属性规定背景图像的尺寸&#xff0c;此属性可以使用数值、百分比、cover等设置图片拉伸。 background-size属性规定背景图像的尺寸。 语法&#xff1a;background-size: length|percentage|cover|contain; 属…

html如何拉伸一个图片,css怎么拉伸图片?

css可以使用background-size属性设置图片拉伸&#xff0c;background-size属性规定背景图像的尺寸。此属性可以使用数值、百分比、cover等设置图片拉伸。 background-size属性规定背景图像的尺寸。 background-size属性介绍&#xff1a; 语法&#xff1a;background-size: leng…

html 图片纵向拉伸,css如何让图片拉伸?

css设置图片拉伸的方法&#xff1a;1、使用width与height属性强制设置图片大小使图片拉伸。2、使用background-size属性拉伸背景图片。 1、强行设定大小值会导致拉伸 示例&#xff1a;//html .... //css img{ width: 80px; height: 80px; margin-right: 10px; } 效果图&#xf…

Android中Webview显示全屏拉伸图片

需要在一个视频view上叠加一个webview显示一些第三方的内容&#xff0c;例如视频、图片、h5页面等。显示图片时出现了边框和滚动条等不在预期的内容。由于对web相关的技术不甚了解&#xff0c;查询一番后完美解决。图片自适应webview大小显示。 xml布局文件如下&#xff1a; &…

PS调节图片:拉伸、变形

一、对图片进行变形处理 打开PS软件&#xff0c;选中需要处理的图片。 ctrlJ复制一层图层 点击编辑选项&#xff0c;在下拉菜单里找到变换→变形选项 即可对图片进行变形操作 注意变形的图片下边还有一层图形&#xff0c;那即是我们复制图层的效果。&#xff08;复制图层相当…

数组作为函数参数进行传递

今天编程序时发生了个这样的错误&#xff1a; 在头文件里 定义了一个数组&#xff1a; View Code 1 char s[]"1234567890"; 又定义了一个现显示组的函数&#xff1a; View Code 1 void Display(char* c); 通过下面这两条语句分别在现实函数和主函数中现实数组的大小&…

C++关于数组作为函数参数的值传递和指针传递

明确&#xff1a; 数组作为函数参数和普通的参数是有区别的&#xff1b; 函数中普通的参数 如同void insert(int a,int b)之类的传递分为3种方式传递 值传递指针传递&#xff0c;指针值的传递&#xff0c;引用传递&#xff0c;它们的参数的传递是将实参的值赋给形参。 而数…

详谈C++中数组作为函数参数

一、一个例子引发的思考 运行以下代码&#xff0c;请问输出是什么&#xff1f;例子来源于《剑指Offer》&#xff0c;我对书上例子做了修改&#xff0c;让其可以运行。 #include<iostream> using namespace std;int GetSize(int data[]) {return sizeof(data); } int mai…

易懂的数组作为函数参数(C语言)

易懂的数组作为函数参数&#xff08;C语言&#xff09; 目录 易懂的数组作为函数参数&#xff08;C语言&#xff09;1、数组做函数参数2、通过形参数组修改数组元素3、数组排序 1、数组做函数参数 &#xff08;1&#xff09;、若将一个数组作为实际参数传递给函数&#xff0c;…

以数组作为函数参数的函数调用

调用有参函数时需要提供实参&#xff0c;实参可以是常量&#xff0c;变量或者表达式&#xff0c;数组元素就相当于变量&#xff0c;因此数组元素可以用作函数实参&#xff0c;但是不能用作函数形参&#xff08;因为在函数被调用时临时分配存储单元&#xff0c;不可能为一个数组…

数组作为函数参数传递

数组作为函数参数传递 数组作为函数参数传递时&#xff0c;传入的是数组首地址&#xff0c;并非数组本身。今天总算理解了这一点。写了一个打印数组元素的函数&#xff0c;代码如下&#xff1a; void print1(int arr[]) {int len sizeof(arr) / sizeof(arr[0]);cout <<…