1.总结Button是所有UI系统中非常重要的组件。iOS中按钮UIButton的使用也非常灵活。本文将从以下几点介绍UIButton的使用(基于Swift2.0):UIButton基础知识UIButton图片使用圆角按钮复选框按钮倒计时按钮(闪烁问题也轻松解决)贪心按钮(父控件事件也归属于我,展开事件响应区)2.UIButton基础2.1创建UIButton提供了一个简单的结构方法convenienceinit(typebuttonType:UIButtonType)在这个方法中,我们需要传入一个UIButtonType枚举类型,使用代码如下:funccreateButton(){letbutton=UIButton(类型:UIButtonType.System)button.frame=CGRectMake(50,50,100,50)button.setTitle("OK",forState:UIControlState.Normal)button.addTarget(self,action:"buttonPressed:",forControlEvents:UIControlEvents.TouchUpInside)self.view.addSubview(button)}funcbuttonPressed(button:UIButton){}Tips:1.设置按钮标题时,一定要使用funcsetTitleColor(color:UIColor?,forStatestate:UIControlState)而不是button.titleLabel?.text="OK"这个方法Normal状态下点击Text时会自动将标题改为setTitleColor方法。2.2ImageusingUIButton提供了以下两个接口来使用图片:funcsetImage(image:UIImage?,forStatestate:UIControlState)funcsetBackgroundImage(image:UIImage?,forStatestate:UIControlState)(1)接口setImage用于设置按钮的图像。默认情况下,它会与按钮文字水平线性排列(2)接口setBackgroundImage用于设置按钮的背景图片。setImage和按钮文字都会显示在背景图片上,这里重点介绍setBackgroundImage接口。在许多情况下,按钮看起来像这样:这些按钮具有相同的背景,但大小不同。下面我们就来说说如何复用这类图片资源。2.2.1编码方法2.2.1.1原理说明在UIImage接口中,有如下方法funcresizableImageWithCapInsets(_capInsets:UIEdgeInsets)->UIImage使用该方法时,需要将UIEdgeInsets作为参数传入,创建接口如下:funcUIEdgeInsetsMake(_top:CGFloat,_left:CGFloat,_bottom:CGFloat,_right:CGFloat)->UIEdgeInsets该方法提供了上、下、左、右参数来创建一个可变区域,如下图所示(提示:下图中所指的可变区域为与视图内边距不同的概念)。可变区,绿色标记为常量区。UIEdgeInsets结构的top属性和bottom属性是一对指定垂直可变区域(黑色虚线矩形),left和right是一对指定水平可变区域(白色虚线矩形)。当UIButton/UIImageView的尺寸大于UIImage的尺寸时,图像中可变区域的尺寸将被调整以覆盖整个控件。具体调整规则如下:(1)控件的宽度大于图片的宽度,白色虚线矩形被拉伸(2)控件的高度如果大于图片的高度,拉伸黑色虚线矩形。(3)当控件宽度小于图片宽度时,水平方向整体收缩(可变区域和不变区域的比例不变)(4)当控件高度小于图片高度时,垂直方向整体收缩(可变区域和不变区域的比例保持不变)iOS系统会根据设备的分辨率自动加载1x图、2x图、3x图,并且上下左右在methodresizableImageWithCapInsets是以像素为单位的,需要在使用的时候,根据x折图设置相应的边距,例如:letimage=UIImage(named:"image_name")//1折图,上,下,左,右边距都是25letpadding=25*(image?.scale)!letedge=UIEdgeInsetsMake(padding,padding,padding,padding)letresizeImage=image?.resizableImageWithCapInsets(edge)button.setBackgroundImage(resizeImage!,forState:UIControlState.正常)#p#2.2.1.2The性能与可变区域大小的关系(1)性能***:当可变区域为1像素宽或高时,绘制时拉伸1像素(2)性能较好:可变区域是整个图像,方法resizableImageWithCapInsets参数为UIEdgeInsetsZero,绘制时被压扁图片方法(3)性能较差:当可变区域的宽度或高度大于1像素时,绘制时使用tile方法。这种方式性能较差,但是这种方式在实际开发中也是用的最多的。.提示在某些应用程序中,应用程序有一些非纯色背景。此背景将在多个界面中使用。由于设备分辨率和界面控件大小的差异,会要求制作多种尺寸的图片,导致ipa包较大,内存损耗。使用增加。结合上述(2),将可变区域设置为整幅图像即可解决该问题。原理参考无缝纹理示例代码如下:letimage=UIImage(named:"tile")letresizeImage=image?.resizableImageWithCapInsets(UIEdgeInsetsZero)self.bkImageView.image=resizeImage2.2.2AssetCatalogs方法(推荐)Xcode提供了AssetCatalogs方法来管理图片资源。AssetCatalogs提供可视化界面来设置图片的可变区域,操作简单易上手。点击右下角的ShowSlicing进入编辑模式后,图片中间会有一个StartSlicing按钮。点击后会让我们选择拉伸方式,如下图:三个按钮的作用123按钮1只做水平方向的拉伸按钮2在水平方向和垂直方向都进行拉伸。按钮3仅进行垂直拉伸。area可变区域:操作线1和操作线2指定的区域,拉伸时,这个区域的大小会根据最终的大小变化。删除区域:操作线2和操作线3指定的区域(白色半透明层),可以简单理解为拉伸时直接删除该区域。使用方法和普通图片一样,代码如下:letimage=UIImage(named:"image_asset_name")button.setBackgroundImage(image,forState:UIControlState.Normal)#p#3。UIButton的其他用法3.1圆角按钮有时候,我们需要一个圆形的按钮,比如头像:letimage=UIImage(named:"user_avatar")self.button.setImage(image,forState:UIControlState.Normal)self.button.imageView?.layer.cornerRadius=self.button.frame.width/23.2复选框按钮UIKit中没有复选框组件怎么办?funccheckBoxButton(){letframe=CGRectMake(68,79,300,128)letbutton=UIButton(type:UIButtonType.Custom)button.setTitleColor(UIColor.whiteColor(),forState:UIControlState.Normal)button.frame=framebutton.titleLabel?.font=UIFont.systemFontOfSize(30)button.contentHorizo??ntalAlignment=UIControlContentHorizo??ntalAlignment.Leftbutton.setTitle("Checkboxbutton",forState:UIControlState.Normal)//上面是样式的设置,下面是和checkbox相关的button.addTarget(self,action:"buttonPressed:",forControlEvents:UIControlEvents.TouchUpInside)button.setImage(UIImage(named:"check"),forState:UIControlState.Normal)button.setImage(UIImage(named:"uncheck"),forState:UIControlState.Selected)self.view.addSubview(button)}funcbuttonPressed(button:UIButton){button.selected=!button.selected}3.3倒计时按钮(闪烁的问题也迎刃而解)在很多应用中,发送短信的倒计时功能一般都是结合NSTimer和UIButton来实现的。如果UIButton是这样初始化的:1letbutton=UIButton(type:UIButtonType.System)会发现当定时器每秒改变标题时,会出现闪烁现象。将UIButtonType.System更改为UIButtonType.Custom以提供打包的倒计时按钮。可以直接下载使用:http://00red.com/Download/Swift的贪心UIButton/ILCountDownButton.swift使用示例如下:letframe=CGRectMake(50,50,100,40)letcountButton=ILCountDownButton(count:5)countButton.frame=framecountButton.setBackgroundImageForCount(UIImage(named:"bk_count")!)countButton.setBackgroundImageForRestart(UIImage(named:"bk_restart")!)countButton.setTitleForRestart("Resend")self.view.addSubview(countButton)四、贪婪按钮UIButton的框架将直接影响至于setImage和setBackgroundImage的显示效果,有时候我们只需要扩大UIButton的点击区域,不想直接修改UIButton的frame影响显示。这时候UIButton的父视图(superView)的点击事件可以通过下面的方法Possession来处理,所有的触摸操作都传递给UIButton控件。iOS在处理事件分发时,分为两步:第一步是寻找哪个UI组件响应了这个事件,第二步是事件处理和响应者链。实现事件的传递,可以在第一步进行处理,代码如下:就会出现点击父view和响应事件的UIButton的效果
