設置各個值得含義
//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 表示據(jù)原來的頂部 為0? //10 表示左邊框右移 10? (同理 -10 表示左邊框左移 10)//40 表示下邊框上移 40 //10 表示右邊框左移 10 (同理 -10 表示右邊框右移 10)
總之:這些參數(shù) 正值都是表示 向相反的方向移動相應的距離(例如:對top正值表示向下移動,負值表示向上移動)
這樣我們就可以在UIButton的外部輕松設置想要的樣式
titleEdgeInsets & imageEdgeInsets
這兩個屬性的效果是相輔相成的蝎困。如果給一個按鈕同事設置了title和image录语,他們默認的狀態(tài)是圖片在左,標題在右难衰,而且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()
? ? ? ? //根據(jù)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
? ? }
}