注:本文翻译自国外iOS开发者Natasha The Robot的一篇博文,链接在此。
在iOS应用中,经常会有很多Button有相同的背景图片,却由于处在不同的位置而大小不同(尽管在iOS7中Button已经没有背景图片了)。比如,一个功能为“Save”的Button要比功能为“Submit”要窄一些,但是他们都可以拥有紫色背景。
在这篇文章中,你不需要为每个button准备不同的背景图片。你很幸运,因为iOS的UIEdgeInsetsMake方法可以很方便的把这张图片: 

变成这张:

解决办法很简单:较小的图片的四个圆角保持不变,中间部分可以在竖直与水平方向上复制,这样,图片的中间部分就可以按照你的要求来放大了。
可以通过UIEdgeInsets来实现这个功能:你可以在拉伸图片时,在图片中上、左、下、右四个边缘指定出不允许拉伸的部分。UIEdgeInsets本身是一个结构体,包含四个float类型的浮点数:

  1. typedef struct {
  2. CGFloat top, left, bottom, right;
  3. } UIEdgeInsets;

代替全部
我新建了一个项目:在stordboard中我添加了一个自定义的Button,然后在ViewController中为其创建了一个Outlet。在我的ViewDidLoad:方法中,我调用了私有方法configureButton,它通过UIEdgeInsetsMake(0,0,0,0)来构建了一个UIEdgeInsets:

  1. - (void)configureButton
  2. {
  3. UIEdgeInsets edgeInsets = UIEdgeInsetsMake(0, 0, 0, 0);
  4. UIImage *backgroundButtonImage = [[UIImage imageNamed:@"purple_button.png"]
  5. resizableImageWithCapInsets:edgeInsets];
  6. [self.purpleButton setBackgroundImage:backgroundButtonImage
  7. forState:UIControlStateNormal];
  8. }

由于没有为指定不拉伸区域(四个方向上不允许拉伸的区域都设置为0),所以是整个图片在水平和竖直方向上复制,结果如下:

竖直限定
给图片添加竖直限定,我们需要向下面这个示意图一样忽略掉左右两个边缘:

在两条竖线间的区域可以在水平方向上复制。可以忽略掉左右两边各留8个像素的距离,将UIEdgeInsets设置为UIEdgeInsetsMake(0,8,0,8):

  1. - (void)configureButton
  2. {
  3. UIEdgeInsets edgeInsets = UIEdgeInsetsMake(0, 0, 0, 0);
  4. UIImage *backgroundButtonImage = [[UIImage imageNamed:@"purple_button.png"]
  5. resizableImageWithCapInsets:edgeInsets];
  6. [self.purpleButton setBackgroundImage:backgroundButtonImage
  7. forState:UIControlStateNormal];
  8. }

结果看起来好多了:

水平限定
相似的,如果你想为图片添加水平方向的限定,可以忽略掉距上下边缘各8个像素的距离,仅复制两条线之间的区域:

将UIEdgeInsets设置为UIEdgeInsetsMake(8,0,8,0):

  1. - (void)configureButton
  2. {
  3. UIEdgeInsets edgeInsets = UIEdgeInsetsMake(8, 0, 8, 0);
  4. UIImage *backgroundButtonImage = [[UIImage imageNamed:@"purple_button.png"]
  5. resizableImageWithCapInsets:edgeInsets];
  6. [self.purpleButton setBackgroundImage:backgroundButtonImage
  7. forState:UIControlStateNormal];
  8. }

结果如下:

在两个方向上进行限定
如果希望在水平和竖直方向上都对可以复制区域加以限定,我们需要将上、下、左、右四个边缘的内侧8个像素的区域都忽略掉:

将UIEdgeInsets设置为UIEdgeInsetsMake(8,8,8,8):

  1. - (void)configureButton
  2. {
  3. UIEdgeInsets edgeInsets = UIEdgeInsetsMake(8, 8, 8, 8);
  4. UIImage *backgroundButtonImage = [[UIImage imageNamed:@"purple_button.png"]
  5. resizableImageWithCapInsets:edgeInsets];
  6. [self.purpleButton setBackgroundImage:backgroundButtonImage
  7. forState:UIControlStateNormal];
  8. }

太棒了!我们现在有一个正确显示的Button了:

现在,如果你需要其他紫色的button,你只需要把刚才那个小正方形的图片的四个边忽略掉,然后将图片中间部分按照你希望的大小进行复制就可以了。Enjoy!

转:http://blog.csdn.net/xiaoyulong007/article/details/25658815

iOS:如何通过UIEdgeInsetsMake来制作可伸缩的Button的更多相关文章

  1. iOS静态库.a文件制作和导入使用

    iOS静态库.a文件制作: 1.新建Cocoa Touch Static Library工程 新建工程 - 选择iOS-FrameWork&Libary,选择 Cocoa Touch Stat ...

  2. iOS开发中静态库制作 之.a静态库制作及使用篇

    iOS开发中静态库之".a静态库"的制作及使用篇 一.库的简介 1.什么是库? 库是程序代码的集合,是共享程序代码的一种方式 2.库的类型? 根据源代码的公开情况,库可以分为2种类 ...

  3. 【转】IOS静态库a文件制作流程

    原文网址:http://www.jianshu.com/p/3439598ea61f 1.新建Cocoa Touch Static Library工程 新建工程 2.Xcode的参数设置 " ...

  4. ios framework通用库的制作

    这篇文章是在史上最完整的iOS DIY framework 详细教程(一)的基础上加以修改 1.新建一个静态库工程: 2:取自己喜欢的名字: 3.删除向导所生成工程中的 Target: 3.删除Tes ...

  5. iOS 推送证书的制作

    关于iOS推送证书的P12文件,并非直接从KeyChain导出来的证书文件.而是须要经过openSSL工具制作的.(好在Mac OS 默认就有openSSL命令) 针对不同的Server平台,须要的证 ...

  6. iOS的Bundle资源束制作

    在静态库的制作中,很多时候我们的静态库也是带着文件,图片和多媒体资源的. 若只是直接加入到项目中也是可以,但是,考虑到方便管理(方便插件使用者的管理),我们希望把插件的资源文件打成一个包来管理. 当然 ...

  7. iOS调试证书/公布证书制作

    当已经注冊过applied 开发人员账号后,而且进行付款了,那么接下来就是证书制作了 1.登录membercenter https://developer.apple.com/membercenter ...

  8. iOS开发--使用lipo命令制作模拟器与真机通用静态库

    通常在项目中使用静态库的时候都会有两个版本,一个用于模拟器,一个用于真机,因为Mac和iPhone的CPU不同,才造成了这种情况. 为了模拟器与真机之间切换调试的方便,制作通用版本非常有必要. 现在有 ...

  9. iOS .a静态库的制作及使用

    一.制作.a静态库 1.创建静态库工程,工程命名为BaseSDK,生成的.a文件名变成libBaseSDK.

随机推荐

  1. 使用Resource Owner Password Credentials Grant授权发放Token

    对应的应用场景是:为自家的网站开发手机 App(非第三方 App),只需用户在 App 上登录,无需用户对 App 所能访问的数据进行授权. 客户端获取Token: public string Get ...

  2. shell脚本批量处理字符串

    上周五运营那边给了一份手机号码的excle,要求查询出所有对应于用户编号的用户的信息.这个时候遇到了一个问题就是,需要查询的用户数量很多,不可能一个一个去查,而excle中的格式又不符合sqlquer ...

  3. ns3模拟无线Ad hoc 网络通信

    Ad hoc网络 Ad hoc网是一种多跳的.无中心的.自组织无线网络,又称为多跳网(Multi-hop Network).无基础设施网(Infrastructureless Network)或自组织 ...

  4. CCF 201612-1 最大波动 (水题)

    问题描述 小明正在利用股票的波动程度来研究股票.小明拿到了一只股票每天收盘时的价格,他想知道,这只股票连续几天的最大波动值是多少,即在这几天中某天收盘价格与前一天收盘价格之差的绝对值最大是多少. 输入 ...

  5. Android Studio签名打包的两种方式

    签名打包的两种方式: 注:给我们自己开发的app签名,就代表着我自己的版权,以后要进行升级,也必须要使用相同的签名才行.签名就代表着自己的身份(即keystore),多个app可以使用同一个签名. 如 ...

  6. Service的两种用法及其生命周期

    先来一点基础知识: Service 是android的四大组件之一,与Activity同属于一个级别,它是运行在后台进行服务的组件(例如在后台播放的音乐,播放音乐的同时并不影响其他操作).Servic ...

  7. Ubuntu安装sougou输入法

    1. 按照[1]的步骤进行,完美实现就好. 2. 必须重启后才能实现功能. Reference: [1] http://pinyin.sogou.com/linux/

  8. 移植到Windows CE 的经验

    Windows CE 是微软早期推出的嵌入式设备和移动设备的开发运行平台,虽然目前移动端几乎都是android和ios的天下,但是,在嵌入式设备领域,Windows CE仍然占有一块地盘.很多用户希望 ...

  9. [MFC] 向文本编辑框写入数据与从其中读取数据

    GetDlgItemText(IDC_USER_NAME_EDIT,m_csUserName); SetDlgItemText(IDC_USER_NAME_EDIT,s);

  10. [ACM_数学] Counting Solutions to an Integral Equation (x+2y+2z=n 组合种类)

    http://acm.hust.edu.cn/vjudge/contest/view.action?cid=27938#problem/E 题目大意:Given, n, count the numbe ...