文档章节

UIImage图片拉伸

Karlon
 Karlon
发布于 2014/07/12 18:03
字数 591
阅读 76
收藏 0

一个带边框的UIImage如果使用常规的缩放,边框部分将被按照缩放比例拉伸或压缩,有些时候这并不是我们所期望的..比如这个边框是根据图片大小变化的外框。比如下面的类似按钮的不明物体图片:主体为渐变蓝色,边框为外圈白色,灰色底板为背景。

常见的按钮添加和背景设置如下:

UIButton *button = [[UIButton alloc] initWithFrame:CGRectMake(80, 130, 160, 44)];  
[button setTitle:@”Test Button” forState:UIControlStateNormal];// Image with without cap insetsUIImage *buttonImage = [UIImage imageNamed:@”blueButton”];  
[button addTarget:self action:@selector(buttonPressed:) forControlEvents: UIControlEventTouchUpInside];
[button setBackgroundImage:buttonImage forState:UIControlStateNormal];
[[self view] addSubview:button];

所得到的按钮会相当悲剧…

边框,特别是左右边框由于按钮frame过大被惨烈拉伸… iOS5中提供了一个新的UIImage方法,resizableImageWithCapInsets:,可以将图片转换为以某一偏移值为偏移的可伸缩图像(偏移值内的图像将不被拉伸或压缩)。

用法引述如下:

resizableImageWithCapInsets:  
  Creates and returns a new image object with the specified cap insets.
  - (UIImage *)resizableImageWithCapInsets:(UIEdgeInsets)capInsets
    Parameters
      capInsets
      The values to use for the cap insets.
    Return Value
      A new image object with the specified cap insets.
    Discussion
      You use this method to add cap insets to an image or to change the existing cap insets of an image. In both cases, you get back a new image and the original image remains untouched.

      During scaling or resizing of the image, areas covered by a cap are not scaled or resized. Instead, the pixel area not covered by the cap in each direction is tiled, left-to-right and top-to-bottom, to resize the image. This technique is often used to create variable-width buttons, which retain the same rounded corners but whose center region grows or shrinks as needed. For best performance, use a tiled area that is a 1x1 pixel area in size.

输入参数为一个capInsets结构体:

//Defines inset distances for views.typedef struct {  
CGFloat top, left, bottom, right;  
} UIEdgeInsets;

分别表示上左下右四个方向的偏移量。于是把上面按钮的UIImage改为如下形式:

// Image with cap insetsUIImage *buttonImage = [[UIImage imageNamed:@”blueButton”]  
resizableImageWithCapInsets:UIEdgeInsetsMake(0, 16, 0, 16)];

可以得到如下按钮:

问题得到解决。

但是值得注意的是该方法需要至少iOS5的运行环境,因此对于需要开发支持iOS5之前的App来说是不可行的。替代方案是stretchableImageWithLeftCapWidth:topCapHeight:,但是在iOS5中,这已经是被Deprecated的方法了,而且该方法只能以1px作为重复铺满拉伸区域,无法做到类似渐变等图片效果,是存在一定局限的。


本文转载自:http://onevcat.com/2011/12/uiimage/

Karlon
粉丝 10
博文 13
码字总数 3930
作品 0
深圳
程序员
私信 提问
iPhone 图片拉伸不变形的方法

如果一个椭圆图片,原图大小为3030,而我们让它显示10030,那么这个图片就会被拉伸,而且效果很难看。用下边的方法可以创建一个局部不被拉伸的图片。 UIImage * buttonBg = [[UIImage image...

vane_
2013/08/08
1K
1
iOS图片拉伸技巧

纵观移动市场,一款移动app,要想长期在移动市场立足,最起码要包含以下几个要素:实用的功能、极强的用户体验、华丽简洁的外观。华丽外观的背后,少不了美工的辛苦设计,但如果开发人员不懂...

长平狐
2013/03/28
1K
0
iOS图片拉伸三种方式

图片拉伸 1.第一种图形界面 第一步第二步 第三步 图形设置只需要点点就行,至于拉伸大小,系统已替你算好 2.代码方式 第一种 第二种 3.github地址 github

AppleDream
2016/06/05
37
0
xcode遇见很奇怪的语法错误

请问这个错误要怎么处理啊 附上源代码: #import @interface UIImage (DZ) /** * 加载最原始的图片,没有经过渲染 * */ +(instancetype)imageWithRenderingOriginalName:(NSString *)imageName...

Chars-D
2015/11/28
410
2
stretchableImageWithLeftCapWidth:topCapHeight:函...

1、- (UIImage *)stretchableImageWithLeftCapWidth:(NSInteger)leftCapWidth topCapHeight:(NSInteger)topCapHeight 这个函数是UIImage的一个实例函数,它的功能是创建一个内容可拉伸,而边...

宇宙执政
2013/04/28
247
0

没有更多内容

加载失败,请刷新页面

加载更多

只需一步,在Spring Boot中统一Restful API返回值格式与统一处理异常

统一返回值 在前后端分离大行其道的今天,有一个统一的返回值格式不仅能使我们的接口看起来更漂亮,而且还可以使前端可以统一处理很多东西,避免很多问题的产生。 比较通用的返回值格式如下:...

晓月寒丶
昨天
59
0
区块链应用到供应链上的好处和实际案例

区块链可以解决供应链中的很多问题,例如记录以及追踪产品。那么使用区块链应用到各产品供应链上到底有什么好处?猎头悬赏平台解优人才网小编给大家做个简单的分享: 使用区块链的最突出的优...

猎头悬赏平台
昨天
28
0
全世界到底有多少软件开发人员?

埃文斯数据公司(Evans Data Corporation) 2019 最新的统计数据(原文)显示,2018 年全球共有 2300 万软件开发人员,预计到 2019 年底这个数字将达到 2640万,到 2023 年达到 2770万。 而来自...

红薯
昨天
65
0
Go 语言基础—— 通道(channel)

通过通信来共享内存(Java是通过共享内存来通信的) 定义 func service() string {time.Sleep(time.Millisecond * 50)return "Done"}func AsyncService() chan string {retCh := mak......

刘一草
昨天
58
0
Apache Flink 零基础入门(一):基础概念解析

Apache Flink 的定义、架构及原理 Apache Flink 是一个分布式大数据处理引擎,可对有限数据流和无限数据流进行有状态或无状态的计算,能够部署在各种集群环境,对各种规模大小的数据进行快速...

Vincent-Duan
昨天
60
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部