iOS:如何通过UIEdgeInsetsMake来制作可伸缩的Button

注:本文翻译自国外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

时间: 2024-10-21 11:14:14

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

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

iOS静态库.a文件制作: 1.新建Cocoa Touch Static Library工程 新建工程 - 选择iOS-FrameWork&Libary,选择 Cocoa Touch Static Library工程. 2.Xcode的参数设置 "Build Active Architecture Only" 设置为"NO" "IOS Deployment Target" 设置为 "IOS 7.0" ,表示支持IOS7

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

原文网址:http://www.jianshu.com/p/3439598ea61f 1.新建Cocoa Touch Static Library工程 新建工程 2.Xcode的参数设置 "Build Active Architecture Only" 设置为"NO" "IOS Deployment Target" 设置为 "IOS 7.0" ,表示支持IOS7.0以上系统版本的编译 Build Active Architec

ios -工具-证书的制作pem的合成

在ios中,通知有两种(提醒轰炸的来源): 第一种是本地通知(UILocalNotification),这一种不需要申请推送证书,也不需要向程序注册,直接使用,这一种不是本文讨论的范围. 第二种是APNS远程推送——远程通知(UIRemoteNotification),这个不仅需要向程序注册,也需要在开发者账号里申请推送证书,下面来介绍一下如何注册和申请证书. 一.远程推送的原理 先看下面一幅图(图片来源于无线互联): 可以看出,远程推送的过程分为6步,下面为大家简单讲解一下: 第一步是在程序上

iOS 推送证书的制作

关于iOS推送证书的P12文件,并非直接从KeyChain导出来的证书文件.而是须要经过openSSL工具制作的.(好在Mac OS 默认就有openSSL命令) 针对不同的Server平台,须要的证书是不同的,先说一下.Net框架开发的Server的证书制作: (开发用.公布用,命令是一样的.仅仅须要提供相应种类的文件即可了) 打开命令终端: // 得到先前制作好的推送证书,制作pem文件 openssl x509 -in aps_production.cer -inform DER -out

ios framework通用库的制作

这篇文章是在史上最完整的iOS DIY framework 详细教程(一)的基础上加以修改 1.新建一个静态库工程: 2:取自己喜欢的名字: 3.删除向导所生成工程中的 Target: 3.删除TestFrameWork对应的工程文件夹: 5:删除bulid 关连项 选择左下角Manager Scheme 选中 Scheme,点击左下角的减号删除: 删除完成后,点击 OK 返回. 5.增加一个新目标.点击 “Add Target”<喎?"http://www.2cto.com/kf/war

iOS 合并.a文件,制作通用静态库

lipo  -create  SQY/iOS/iphoneos/libGamePlusAPI.a  SQY/iOS/iphonesimulator/libGamePlusAPI.a  - output  SQY/iOS/libGamePus.a 其中SQY/iOS/iphoneos/libGamePlusAPI.a //为真机库. SQY/iOS/iphonesimulator/libGamePlusAPI.a //为模拟器库 -output SQY/iOS/libGamePus.a //为两个

iOS预览视频的制作

花了两天折腾这个东西,又是升级iOS8,又是安装Yosemite,终于折腾成功了. 安装Yosemite的时候新划分了一个分区,把它安装到新分区,不影响现在的系统,启动时在系统偏好设置->启动磁盘中选择启动到哪个系统,很方便. 安装iOS8很简单了,在iTunes中按住option键点击检测更新,选择下载的iOS8系统文件,一路安装下去即可. 接下来就是在Yosemite中制作预览视频了,连上iPad mini 2真机,用QuickTime Player录制电影,大小为1200 x 900,用你

iOS中静态库的制作——使用创建静态库项目的方式创建静态库

最近公司要求写SDK,我就想把它弄成静态库的方式 我的理解:所谓静态库,就是把所有的.m文件打包成一个.a文件,这样使分享代码的时候更加简洁,重要的是别人也不会看到你.m文件中的傻B代码了 环境是Xcode6.2 iOS8.2 首先,创建一个静态库项目 删掉Xcode自动创建的同名文件,然后导入你需要做成静态库的文件 在这里我导入一个简单的输出字符串的文件 然后选择运行的设备进行编译,这里我有不理解的地方:在Xcode6.2中,当我首先选择模拟器,然后编译文件的时候,.a文件依然是红色的,说明静

iOS中图片水印的制作

// .获取上下文,之前的上下文都是在view的drawRect方法中获取(跟View相关联的上下文layer上下文) // 目前我们需要绘制图片到新的图片上,因此需要用到位图上下文 // 怎么获取位图上下文,注意位图上下文的获取方式跟layer上下文不一样.位图上下文需要我们手动创建. // 开启一个位图上下文,注意位图上下文跟view无关联,所以不需要在drawRect. - (void)viewDidLoad { [super viewDidLoad]; // 加载图片 UIImage *