`
iaiai
  • 浏览: 2194593 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

iOS图片拉伸技巧

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

button.png,尺寸为:24x60

现在我们把它用作为按钮背景,按钮尺寸是150x50:
// 得到view的尺寸  
CGSize viewSize = self.view.bounds.size;  
  
// 初始化按钮  
UIButton *button = [[UIButton alloc] init];  
// 设置尺寸  
button.bounds = CGRectMake(0, 0, 150, 50);  
// 设置位置  
button.center = CGPointMake(viewSize.width * 0.5f, viewSize.height * 0.5f);  
  
// 加载图片  
UIImage *image = [UIImage imageNamed:@"button"];  
// 设置背景图片  
[button setBackgroundImage:image forState:UIControlStateNormal];  
  
// 添加按钮  
[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对象
- (UIImage *)stretchableImageWithLeftCapWidth:(NSInteger)leftCapWidth topCapHeight:(NSInteger)topCapHeight;

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

经过计算,你会发现中间的可拉伸区域只有1x1
// stretchWidth为中间可拉伸区域的宽度  
stretchWidth = width - leftCapWidth - rightCapWidth = 1;  
      
// stretchHeight为中间可拉伸区域的高度  
stretchHeight = height - topCapHeight - bottomCapHeight = 1;

因此,使用这个方法只会拉伸图片中间1x1的区域,并不会影响到边缘和角落。
下面演示下方法的使用:
// 左端盖宽度  
NSInteger leftCapWidth = image.size.width * 0.5f;  
// 顶端盖高度  
NSInteger topCapHeight = image.size.height * 0.5f;  
// 重新赋值  
image = [image stretchableImageWithLeftCapWidth:leftCapWidth topCapHeight:topCapHeight];

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

可以发现,图片非常美观地显示出来了
注意:
1.这个方法在iOS 5.0出来后就过期了
2.这个方法只能拉伸1x1的区域


二、iOS 5.0
在iOS 5.0中,UIImage又有一个新方法可以处理图片的拉伸问题
- (UIImage *)resizableImageWithCapInsets:(UIEdgeInsets)capInsets

这个方法只接收一个UIEdgeInsets类型的参数,可以通过设置UIEdgeInsets的left、right、top、bottom来分别指定左端盖宽度、右端盖宽度、顶端盖高度、底端盖高度
CGFloat top = 25; // 顶端盖高度  
CGFloat bottom = 25 ; // 底端盖高度  
CGFloat left = 10; // 左端盖宽度  
CGFloat right = 10; // 右端盖宽度  
UIEdgeInsets insets = UIEdgeInsetsMake(top, left, bottom, right);  
// 伸缩后重新赋值  
image = [image resizableImageWithCapInsets:insets];

运行效果:


三、iOS 6.0
在iOS6.0中,UIImage又提供了一个方法处理图片拉伸
- (UIImage *)resizableImageWithCapInsets:(UIEdgeInsets)capInsets resizingMode:(UIImageResizingMode)resizingMode

对比iOS5.0中的方法,只多了一个UIImageResizingMode参数,用来指定拉伸的模式:
  • UIImageResizingModeStretch:拉伸模式,通过拉伸UIEdgeInsets指定的矩形区域来填充图片
  • UIImageResizingModeTile:平铺模式,通过重复显示UIEdgeInsets指定的矩形区域来填充图片

CGFloat top = 25; // 顶端盖高度  
CGFloat bottom = 25 ; // 底端盖高度  
CGFloat left = 10; // 左端盖宽度  
CGFloat right = 10; // 右端盖宽度  
UIEdgeInsets insets = UIEdgeInsetsMake(top, left, bottom, right);  
// 指定为拉伸模式,伸缩后重新赋值  
image = [image resizableImageWithCapInsets:insets resizingMode:UIImageResizingModeStretch];

运行效果:
  • 大小: 5.7 KB
  • 大小: 9.2 KB
  • 大小: 6.9 KB
  • 大小: 48.4 KB
  • 大小: 7.5 KB
  • 大小: 7.5 KB
  • 大小: 7.5 KB
分享到:
评论

相关推荐

    iOS图片拉伸技巧(iOS5.0、iOS6.0)

    在iOS应用开发中,图片拉伸是一项重要的技术,它能够帮助开发者在保持图像质量的同时适应不同尺寸的界面元素。本文将详细讲解如何在iOS 5.0和iOS 6.0版本中进行图片拉伸,以提高用户体验并优化资源利用。 首先,...

    iOS图片拉伸技巧小结

    总之,iOS图片拉伸技巧是提高应用界面适配性和用户体验的重要手段。通过正确地设置图片的可拉伸区域和选择合适的拉伸模式,开发者可以轻松地实现界面元素的动态调整,使得界面更加灵活且不失美观。

    iOS图片拉伸小技巧

    在iOS开发中,图片拉伸是一项重要的技巧,它关乎到应用界面的美观度和用户体验。本文将深入探讨如何在iOS中有效地进行图片拉伸,确保图片在不同尺寸和形状的视图中保持良好的视觉效果。 首先,我们来看一个常见的...

    iOS图片拉伸的4种方法

    本文将详细介绍四种iOS图片拉伸的方法,帮助开发者理解如何有效地处理图像的缩放问题。 首先,我们来看一个典型的例子:一个原始尺寸为128x112像素的按钮背景图片被设置到一个宽200像素、高50像素的按钮上。如果...

    iOS iPhone 图片拉伸源代码

    在iOS开发中,图片拉伸是一项常见的需求,特别是在创建自适应用户界面时,为了实现图片在不同尺寸设备上的平滑显示。"iOS iPhone 图片拉伸源代码"这个主题主要涉及如何在iPhone应用中处理图片的伸缩和自适应。在这个...

    iOS实现图片边缘拉伸.zip

    通过这个代码类别,开发者可以轻松地在iOS应用中实现自定义的图片拉伸效果,使得图片能够适应各种屏幕尺寸和布局变化,提高了用户体验。不过,使用前需要理解代码的工作原理,以及如何正确地应用9-patch图像格式,...

    iOS图片拉伸的方法

    在iOS开发中,图片拉伸是一项常见的需求,特别是在创建自定义UI组件时,如按钮、滑块等。图片拉伸的目的是保持图片某些部分的原始比例不变,而其他部分则可自由扩展,以适应控件的大小变化。本文将详细介绍如何在iOS...

    ios-TableView头部图片拉伸.zip

    在“ios-TableView头部图片拉伸.zip”这个项目中,开发者将实现一个特殊的TableView效果,即在滚动时,头部图片能够随着滚动动态拉伸,并且导航栏会实现透明渐变的效果。这种效果在很多应用中都很常见,如新闻应用、...

    iOS开发之自定义图片拉伸功能

    总的来说,自定义图片拉伸功能在iOS开发中是一个实用的技巧,它可以提高应用的性能和用户体验,尤其是在处理可变尺寸的界面元素时。正确设置图片的拉伸区域和模式,能够有效地防止图片失真,满足设计要求。开发者在...

    iOS核心动画高级技巧以及源码

    4. **延展动画**:通过改变视图的`contents`属性,可以实现内容拉伸或缩放的动画效果,这对于图片或者视频的动态展示尤其有效。 5. **自定义动画**:如果你需要更精细的控制,可以实现`CAMediaTiming`协议并扩展`...

    iOS核心动画高级技巧

    iOS核心动画高级技巧中涵盖了从基础到高级的各种动画技术和概念。为了深入理解iOS动画的高级技巧,首先需要了解图层树的概念和视图与图层的关系。图层树是UIKit和iOS应用程序在屏幕上展示内容的基础,所有的视图都...

    ios-tableView头部拉伸效果.zip

    在iOS应用开发中,创建富有吸引力的用户界面是至关重要的,而`tableView`的头部拉伸效果就是一个很好的增强用户体验的技巧。本项目“ios-tableView头部拉伸效果”旨在实现当用户下拉表格视图时,头部背景图片能够...

    iOS核心动画技巧

    ### iOS核心动画技巧详解 #### Introduction Core Animation 的名字或许会让人误以为它仅专注于动画效果,实际上,它源自 LayerKit 这一原本并不强调动画功能的系统。Core Animation 是一个复杂的渲染引擎,其主要...

    iOS动画高级技巧

    ### iOS动画高级技巧 #### 图层树 **图层与视图** 如果你曾参与过iOS或macOS平台的应用程序开发工作,那么对于“视图”的概念应该不会感到陌生。一个视图基本上就是一个矩形区域(如图片、文本或视频),它可以...

    IOS开发的关于图片和frame的分类

    以上四个分类涵盖了iOS开发中图片处理和视图布局的基本技巧,理解并熟练运用这些知识,能够帮助开发者创建更精美、响应更佳的用户界面。在实际项目中,还需要根据具体需求灵活应用,结合AutoLayout、StackView等现代...

    IOS7呈现IOS6水滴刷新效果修正版本

    在iOS 6中,苹果引入了一种风格化的水滴动画,当用户执行下拉动作时,一个水滴形状的图标会逐渐拉伸并回弹,模拟水滴下落的过程,从而告知用户数据正在加载。 在iOS 7的设计语言中,苹果对整体界面进行了扁平化改革...

Global site tag (gtag.js) - Google Analytics