设置各个值得含义
//UIEdgeInsetsMake(<#T##top: CGFloat##CGFloat#>, <#T##left: CGFloat##CGFloat#>, <#T##bottom: CGFloat##CGFloat#>, <#T##right: CGFloat##CGFloat#>)
testBtn.imageEdgeInsets =UIEdgeInsetsMake(0,10,40,10);
//0 表示据原来的顶部 为0 //10 表示左边框右移 10 (同理 -10 表示左边框左移 10)//40 表示下边框上移 40 //10 表示右边框左移 10 (同理 -10 表示右边框右移 10)
总之:这些参数 正值都是表示 向相反的方向移动相应的距离(例如:对top正值表示向下移动,负值表示向上移动)
这样我们就可以在UIButton的外部轻松设置想要的样式
titleEdgeInsets & imageEdgeInsets
这两个属性的效果是相辅相成的。如果给一个按钮同事设置了title和image,他们默认的状态是图片在左,标题在右,而且image和title之间没有空隙;那就这就引出一个问题,title和image的UIEdgeInsets属性分别的相对于谁而言的?
image的UIEdgeInsets属性的top,left,bottom都是相对于按钮的,right是相对于title;
title的UIEdgeInsets属性的top,bottom,right都是相对于按钮的,left是相对于image;
contentEdgeInsets
我们都知道,UIButton按钮可以只设置一个UILabel或者一个UIImageView,还可以同时具有UILabel和UIImageView;如果给按钮设置contentEdgeInsets属性,就是按钮的内容整体(包含UILabel和UIImageView)进行偏移。
按钮内容整体向右下分别移动10像素:
代码如下
/*
typedef NS_ENUM(NSUInteger, MKButtonEdgeInsetsStyle) {
MKButtonEdgeInsetsStyleTop, // image在上,label在下
MKButtonEdgeInsetsStyleLeft, // image在左,label在右
MKButtonEdgeInsetsStyleBottom, // image在下,label在上
MKButtonEdgeInsetsStyleRight // image在右,label在左
};
*/
//MARK: -定义button相对label的位置
enumYWButtonEdgeInsetsStyle {
caseTop
caseLeft
caseRight
caseBottom
}
extension UIButton {
funclayoutButton(style:YWButtonEdgeInsetsStyle, imageTitleSpace:CGFloat) {
//得到imageView和titleLabel的宽高
letimageWidth:CGFloat=self.imageView?.frame.size.width??0
letimageHeight:CGFloat=self.imageView?.frame.size.height??0
let labelWidth:CGFloat = self.titleLabel?.intrinsicContentSize.width ?? 0
let labelHeight:CGFloat = self.titleLabel?.intrinsicContentSize.height ?? 0
//初始化imageEdgeInsets和labelEdgeInsets
varimageEdgeInsets =UIEdgeInsets.init()
varlabelEdgeInsets =UIEdgeInsets.init()
//根据style和space得到imageEdgeInsets和labelEdgeInsets的值
switchstyle {
case.Top:
//上 左 下 右
imageEdgeInsets =UIEdgeInsets(top: -labelHeight-imageTitleSpace/2, left:0, bottom:0, right: -labelWidth)
labelEdgeInsets =UIEdgeInsets(top:0, left: -imageWidth, bottom: -imageHeight-imageTitleSpace/2, right:0)
break
case.Left:
imageEdgeInsets =UIEdgeInsets(top:0, left: -imageTitleSpace/2, bottom:0, right: imageTitleSpace)
labelEdgeInsets =UIEdgeInsets(top:0, left: imageTitleSpace/2, bottom:0, right: -imageTitleSpace/2)
break
case.Bottom:
imageEdgeInsets =UIEdgeInsets(top:0, left:0, bottom: -labelHeight-imageTitleSpace/2, right: -labelWidth)
labelEdgeInsets =UIEdgeInsets(top: -imageHeight-imageTitleSpace/2, left: -imageWidth, bottom:0, right:0)
break
case.Right:
imageEdgeInsets =UIEdgeInsets(top:0, left: labelWidth+imageTitleSpace/2, bottom:0, right: -labelWidth-imageTitleSpace/2)
labelEdgeInsets =UIEdgeInsets(top:0, left: -imageWidth-imageTitleSpace/2, bottom:0, right: imageWidth+imageTitleSpace/2)
break
}
self.titleEdgeInsets= labelEdgeInsets
self.imageEdgeInsets= imageEdgeInsets
}
}
网友评论