iOS:如何通过UIEdgeInsetsMake来制作可伸缩的Button
注:本文翻译自国外iOS开发者Natasha The Robot的一篇博文,链接在此。
在iOS应用中,经常会有很多Button有相同的背景图片,却由于处在不同的位置而大小不同(尽管在iOS7中Button已经没有背景图片了)。比如,一个功能为“Save”的Button要比功能为“Submit”要窄一些,但是他们都可以拥有紫色背景。
在这篇文章中,你不需要为每个button准备不同的背景图片。你很幸运,因为iOS的UIEdgeInsetsMake方法可以很方便的把这张图片: 
变成这张:
解决办法很简单:较小的图片的四个圆角保持不变,中间部分可以在竖直与水平方向上复制,这样,图片的中间部分就可以按照你的要求来放大了。
可以通过UIEdgeInsets来实现这个功能:你可以在拉伸图片时,在图片中上、左、下、右四个边缘指定出不允许拉伸的部分。UIEdgeInsets本身是一个结构体,包含四个float类型的浮点数:
- typedef struct {
- CGFloat top, left, bottom, right;
- } UIEdgeInsets;
代替全部
我新建了一个项目:在stordboard中我添加了一个自定义的Button,然后在ViewController中为其创建了一个Outlet。在我的ViewDidLoad:方法中,我调用了私有方法configureButton,它通过UIEdgeInsetsMake(0,0,0,0)来构建了一个UIEdgeInsets:
- - (void)configureButton
- {
- UIEdgeInsets edgeInsets = UIEdgeInsetsMake(0, 0, 0, 0);
- UIImage *backgroundButtonImage = [[UIImage imageNamed:@"purple_button.png"]
- resizableImageWithCapInsets:edgeInsets];
- [self.purpleButton setBackgroundImage:backgroundButtonImage
- forState:UIControlStateNormal];
- }
由于没有为指定不拉伸区域(四个方向上不允许拉伸的区域都设置为0),所以是整个图片在水平和竖直方向上复制,结果如下:
竖直限定
给图片添加竖直限定,我们需要向下面这个示意图一样忽略掉左右两个边缘:

在两条竖线间的区域可以在水平方向上复制。可以忽略掉左右两边各留8个像素的距离,将UIEdgeInsets设置为UIEdgeInsetsMake(0,8,0,8):
- - (void)configureButton
- {
- UIEdgeInsets edgeInsets = UIEdgeInsetsMake(0, 0, 0, 0);
- UIImage *backgroundButtonImage = [[UIImage imageNamed:@"purple_button.png"]
- resizableImageWithCapInsets:edgeInsets];
- [self.purpleButton setBackgroundImage:backgroundButtonImage
- forState:UIControlStateNormal];
- }
结果看起来好多了:

水平限定
相似的,如果你想为图片添加水平方向的限定,可以忽略掉距上下边缘各8个像素的距离,仅复制两条线之间的区域:
将UIEdgeInsets设置为UIEdgeInsetsMake(8,0,8,0):
- - (void)configureButton
- {
- UIEdgeInsets edgeInsets = UIEdgeInsetsMake(8, 0, 8, 0);
- UIImage *backgroundButtonImage = [[UIImage imageNamed:@"purple_button.png"]
- resizableImageWithCapInsets:edgeInsets];
- [self.purpleButton setBackgroundImage:backgroundButtonImage
- forState:UIControlStateNormal];
- }
结果如下:
在两个方向上进行限定
如果希望在水平和竖直方向上都对可以复制区域加以限定,我们需要将上、下、左、右四个边缘的内侧8个像素的区域都忽略掉:
将UIEdgeInsets设置为UIEdgeInsetsMake(8,8,8,8):
- - (void)configureButton
- {
- UIEdgeInsets edgeInsets = UIEdgeInsetsMake(8, 8, 8, 8);
- UIImage *backgroundButtonImage = [[UIImage imageNamed:@"purple_button.png"]
- resizableImageWithCapInsets:edgeInsets];
- [self.purpleButton setBackgroundImage:backgroundButtonImage
- forState:UIControlStateNormal];
- }
太棒了!我们现在有一个正确显示的Button了:

现在,如果你需要其他紫色的button,你只需要把刚才那个小正方形的图片的四个边忽略掉,然后将图片中间部分按照你希望的大小进行复制就可以了。Enjoy!
转:http://blog.csdn.net/xiaoyulong007/article/details/25658815
iOS:如何通过UIEdgeInsetsMake来制作可伸缩的Button的更多相关文章
- iOS静态库.a文件制作和导入使用
iOS静态库.a文件制作: 1.新建Cocoa Touch Static Library工程 新建工程 - 选择iOS-FrameWork&Libary,选择 Cocoa Touch Stat ...
- iOS开发中静态库制作 之.a静态库制作及使用篇
iOS开发中静态库之".a静态库"的制作及使用篇 一.库的简介 1.什么是库? 库是程序代码的集合,是共享程序代码的一种方式 2.库的类型? 根据源代码的公开情况,库可以分为2种类 ...
- 【转】IOS静态库a文件制作流程
原文网址:http://www.jianshu.com/p/3439598ea61f 1.新建Cocoa Touch Static Library工程 新建工程 2.Xcode的参数设置 " ...
- ios framework通用库的制作
这篇文章是在史上最完整的iOS DIY framework 详细教程(一)的基础上加以修改 1.新建一个静态库工程: 2:取自己喜欢的名字: 3.删除向导所生成工程中的 Target: 3.删除Tes ...
- iOS 推送证书的制作
关于iOS推送证书的P12文件,并非直接从KeyChain导出来的证书文件.而是须要经过openSSL工具制作的.(好在Mac OS 默认就有openSSL命令) 针对不同的Server平台,须要的证 ...
- iOS的Bundle资源束制作
在静态库的制作中,很多时候我们的静态库也是带着文件,图片和多媒体资源的. 若只是直接加入到项目中也是可以,但是,考虑到方便管理(方便插件使用者的管理),我们希望把插件的资源文件打成一个包来管理. 当然 ...
- iOS调试证书/公布证书制作
当已经注冊过applied 开发人员账号后,而且进行付款了,那么接下来就是证书制作了 1.登录membercenter https://developer.apple.com/membercenter ...
- iOS开发--使用lipo命令制作模拟器与真机通用静态库
通常在项目中使用静态库的时候都会有两个版本,一个用于模拟器,一个用于真机,因为Mac和iPhone的CPU不同,才造成了这种情况. 为了模拟器与真机之间切换调试的方便,制作通用版本非常有必要. 现在有 ...
- iOS .a静态库的制作及使用
一.制作.a静态库 1.创建静态库工程,工程命名为BaseSDK,生成的.a文件名变成libBaseSDK.
随机推荐
- Oracle游标带参数
Oracle游标是可以带参数的,而SqlServer的游标就不可以了 create or replace procedure a as cursor b(c_id int)is select * fr ...
- MVC5+EF6 简易版CMS(非接口) 第二章:建数据模型
目录 简易版CMS后台管理系统开发流程 MVC5+EF6 简易版CMS(非接口) 第一章:新建项目 MVC5+EF6 简易版CMS(非接口) 第二章:建数据模型 MVC5+EF6 简易版CMS(非接口 ...
- quick-cocos2d-x之testlua之VisibleRect.lua
require "extern" --这个类找到了可视区域的9个点的坐标:左上.上的中点.右上.左的中点.左下.下的中点.右下.右的中点.一般用于使用相对坐标的场合,解决自适应屏幕 ...
- Java实现多线程的两种方式
实现多线程的两种方式: 方式1: 继承Thread类 A: 自定义MyThread类继承Thread类 B: 在MyThread类中重写run() C: 创建MyThread类的对象 D: 启动线程对 ...
- mui学习笔记
一.页面刷新问题 1.父页面A跳转到子页面B,B页面修改数据后再跳回A页面,刷新A页面数据 (1).父页面A代码 window.addEventListener("pageflowrefre ...
- vnc 登录后只有终端 没有桌面 黑屏
1, start vnc server: vncserver :1 issue: connect it with pc and only display one terminal. 2, stop v ...
- 更换光纤后路由器端口映射 -VPN相关
之前一直是ADSL的线路,使用路由器后,很简单就可以实现端口映射了!外网也可以随意连接,可是最近升级宽带更换了光纤后,发现怎么都不能正常工作了!在光纤猫里显示的IP居然是:10.0.*.*,查询到的外 ...
- 【JSP】自定义标签开发入门
JSP 自定义标签 自定义标签是用户定义的JSP语言元素.当JSP页面包含一个自定义标签时将被转化为servlet,标签转化为对被 称为tag handler的对象的操作,即当servlet执行时We ...
- Mac 系统下类似于 apt-get 的软件包管理器 -- Homebrew
对于一个习惯了在 Ubuntu 的终端上通过 apt-get 来安装工具软件的我来说,也希望在Mac上找到类似的工具,能很方便的一条命令就能安装所需的软件,而不用手工的去查找下载编译,或者是折腾安装所 ...
- 用代码控制UI界面
public class MainActivity extends Activity { //当第一次创建Activity时回调该方法 @Override protected void ...