`

UIButton 背景图拉伸

    博客分类:
  • ios
 
阅读更多

纵观移动市场,一款移动app,要想长期在移动市场立足,最起码要包含以下几个要素:实用的功能、极强的用户体验、华丽简洁的外观。华丽外观的背后,少不了美工的辛苦设计,但如果开发人员不懂得怎么合理展示这些设计好的图片,将会糟蹋了这些设计,功亏一篑。

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

 button.png,尺寸为:24x60

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

[java] view plaincopy
  1. // 得到view的尺寸  
  2. CGSize viewSize = self.view.bounds.size;  
  3.   
  4. // 初始化按钮  
  5. UIButton *button = [[UIButton alloc] init];  
  6. // 设置尺寸  
  7. button.bounds = CGRectMake(0015050);  
  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] view plaincopy
  1. - (UIImage *)stretchableImageWithLeftCapWidth:(NSInteger)leftCapWidth topCapHeight:(NSInteger)topCapHeight;  

 

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

 

[java] view plaincopy
  1. // width为图片宽度  
  2. rightCapWidth = width - leftCapWidth - 1;  
  3.   
  4. // height为图片高度  
  5. bottomCapHeight = height - topCapHeight - 1  

 

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

 

[java] view plaincopy
  1. // stretchWidth为中间可拉伸区域的宽度  
  2. stretchWidth = width - leftCapWidth - rightCapWidth = 1;  
  3.       
  4. // stretchHeight为中间可拉伸区域的高度  
  5. stretchHeight = height - topCapHeight - bottomCapHeight = 1;  

 

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

下面演示下方法的使用:

[java] view plaincopy
  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] view plaincopy
  1. - (UIImage *)resizableImageWithCapInsets:(UIEdgeInsets)capInsets  

 

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

[java] view plaincopy
  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] view plaincopy
  1. - (UIImage *)resizableImageWithCapInsets:(UIEdgeInsets)capInsets resizingMode:(UIImageResizingMode)resizingMode  

 

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

  • UIImageResizingModeStretch:拉伸模式,通过拉伸UIEdgeInsets指定的矩形区域来填充图片
  • UIImageResizingModeTile:平铺模式,通过重复显示UIEdgeInsets指定的矩形区域来填充图片

 

[java] view plaincopy
  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];  

 

运行效果:

 

更多3
分享到:
评论

相关推荐

    iOS 解决按钮背景图片拉伸问题(推荐)

    设置按钮的背景图片被拉伸 解决方案 - (void)awakeFromNib { [super awakeFromNib]; //让背景图片不要拉伸 UIImage *image = _loginRegisterBtn.currentBackgroundImage; image = ...

    ios学习笔记中用到的美化按钮的背景图

    如果背景图需要适应不同尺寸的按钮,可以将其设计为支持九宫格拉伸的图像。在Xcode的Asset Catalog中,可以设置图片的渲染模式为"Template",使其自动拉伸以填充按钮。 5. **调整边框和边距**: 使用`button....

    iOS图片拉伸的方法

    首先,我们来看一个典型的例子:假设我们有一张尺寸为76x40像素的图片,用于作为按钮的背景。当我们将按钮的宽度和高度分别设置为200x50像素时,如果不进行特殊处理,原始图片会被简单地拉伸填充到新的尺寸,导致...

    iOS应用开发中图片的拉伸问题解决方案

    当图片需要适应不同尺寸的界面元素时,如按钮、背景等,不正确的拉伸会导致图像失真,严重影响用户体验。本文将深入探讨如何解决这一问题,特别是如何实现只拉伸图片中间部分而不拉伸两端的策略。 首先,我们要理解...

    iOS中实现图片自适应拉伸效果的方法

    在Android中实现图片的拉伸特别特别简单,甚至不用写一行代码,直接使用.9图片进行划线即可。但是iOS就没这么简单了,比如对于下面的一张图片(原始尺寸:200*103): 我们不做任何处理,直接将它用作按钮的背景...

    ios app的button的图片设置

    - 图片的大小和比例应适合按钮尺寸,否则可能显示不全或拉伸变形。 - 如果图片包含透明区域,记得设置`clipToBounds`为`true`,以确保超出边界的部分不会显示。 - 对于圆角按钮,可以使用`layer.cornerRadius`...

    iOS开发 自定义actionSheet控件

    每个按钮可以是一个UIButton实例,我们可以为其设置自定义的背景图片、文字和边框样式。例如,你可以使用UIImage来加载和设置按钮的背景图片,使用setTitle:forState:方法设置按钮的文字,使用layer的borderWidth和...

    IOS应用源码——ios按钮样式制作大全(20种不同风格的按钮制作方法).zip

    11. **拉伸背景图**:通过设置`contentStretch`属性,可以使按钮的背景图像根据按钮大小进行拉伸或平铺。 12. **悬停效果**:监听按钮的触摸事件,根据触摸状态改变按钮的外观,如改变颜色或透明度。 13. **自定义...

    图片点击放大 Demo

    对于后者,可以创建一个新的ViewController,将大图设置为其背景,并通过UINavigationController的pushViewController:animated:方法将其推入栈中,实现页面间的平滑过渡。 为了优化用户体验,可以考虑以下几点: ...

    iOS 自定义按钮 很漂亮

    - `backgroundColor`属性可以改变按钮的背景颜色,或者使用`setBackgroundImage:`设置背景图片。 3. **使用Auto Layout** - 自定义按钮时,通常需要使用Auto Layout来确保按钮在不同屏幕尺寸和设备方向下的布局...

    UIView相关示例代码

    你可以自定义它的背景颜色、边框、透明度等属性。 - 视图的层次结构:UIView可以通过addSubview方法添加子视图,形成视图层次结构。子视图会覆盖父视图相应位置的部分。 - 视图的布局:可以使用Auto Layout或Size ...

    [DevDiv翻译]iOS_Cookbook_第二章_使用控制器和视图(上)_2012_05_11

    **问题**: 如何在应用中显示图片资源,如产品图片、背景图等。 **方案**: 使用`UIImageView`控件。`UIImageView`是用于显示图片的视图类,支持加载本地资源或网络图片。 **讨论**: `UIImageView`的使用要点: - ...

    IOS应用源码——圆形按钮风格tab标签.zip

    同时,我们还需要更新`UITabBar`的布局,可能需要自定义`UITabBar`的背景图和item间的间距,以适应圆形按钮的布局需求。 圆形按钮风格的tab标签在设计上能够提供更现代、简洁的外观,同时也能提升用户的点击兴趣。...

    经典易读swift UI Demo

    6. **UIImageView**: 显示图像的视图,可以用来展示图标、背景图片或者用户的照片。学习如何调整图片大小、裁剪和拉伸是重要的技巧。 7. **Auto Layout**: 自动布局系统允许你定义视图之间的关系,确保在不同尺寸的...

    pngButton的实现

    - **九宫格拉伸**:为了适应不同尺寸的屏幕和按钮大小,可以考虑使用九宫格拉伸技术,保持按钮图像的角落不变,中间部分可伸缩。 - **动画效果**:增加点击反馈,比如按钮按下时轻微下陷或改变颜色,这需要通过...

    NGUI3.0.8API帮助文档

    11. **UIMask**:遮罩组件,可以隐藏指定区域外的UI元素,常用于对话框或菜单等需要半透明背景的效果。 12. **UITween**:动画系统,用于平滑地改变Widget的属性,如位置、大小、颜色等。支持线性、缓进缓出等多种...

    IOS UI学习教程之使用UIImageView控件制作动画

    此外,本教程还提到了其他可能感兴趣的文章,例如iOS实现顶部标签式导航栏、下拉分类菜单、购物分类模块、UIImageView的点击事件处理、图片自动拉伸、UIImageView的常用操作和自定义UIImageView等,这些都是iOS开发...

Global site tag (gtag.js) - Google Analytics