UIEdgeInsets
是一個結構體,用來表示矩形的邊距。它通常在視圖佈局中使用,用於修改視圖的框架(frame)。邊距值可以是正數或負數,這會對矩形的大小產生不同的影響。
UIEdgeInsets 結構體
UIEdgeInsets
結構體包含四個屬性:
top
:矩形頂部的邊距left
:矩形左側的邊距bottom
:矩形底部的邊距right
:矩形右側的邊距
正值和負值的影響
- 正值:正值會使矩形縮小,即向內縮進指定的邊距值。例如,如果你設置
top
為 10,矩形的頂部會向下移動 10 點,縮小矩形的高度。 - 負值:負值會使矩形擴大,即向外擴展指定的邊距值。例如,如果你設置
top
為 -10,矩形的頂部會向上移動 10 點,增加矩形的高度。 - 正值和負值的影響
示例
假設你有一個矩形,其初始框架是 (x: 0, y: 0, width: 100, height: 100)。使用正值的邊距
let insets = UIEdgeInsets(top: 10, left: 10, bottom: 10, right: 10)
let rect = CGRect(x: 0, y: 0, width: 100, height: 100)
let insetRect = rect.inset(by: insets)
結果:
- insetRect 的框架會是 (x: 10, y: 10, width: 80, height: 80)。
- 矩形的每一邊都向內縮進了 10 點,因此寬度和高度都減少了 20 點。
使用負值的邊距
let insets = UIEdgeInsets(top: -10, left: -10, bottom: -10, right: -10)
let rect = CGRect(x: 0, y: 0, width: 100, height: 100)
let insetRect = rect.inset(by: insets)
結果:
- insetRect 的框架會是 (x: -10, y: -10, width: 120, height: 120)。
- 矩形的每一邊都向外擴展了 10 點,因此寬度和高度都增加了 20 點。
在視圖佈局中的應用
UIEdgeInsets
通常在設置視圖的邊距(例如,內容邊距或安全區域邊距)時使用。例如:
let button = UIButton(frame: CGRect(x: 0, y: 0, width: 100, height: 50))
button.contentEdgeInsets = UIEdgeInsets(top: 10, left: 20, bottom: 10, right: 20)
這樣設置後,按鈕的內容(如標題或圖片)會有 10 點的頂部和底部邊距,以及 20 點的左右邊距。
- 負值:負值會使矩形擴大,即向外擴展指定的邊距值。例如,如果你設置
top
為 -10,矩形的頂部會向上移動 10 點,增加矩形的高度。
正值是縮小?負值是擴大?

正值的邊距
當你給 UIEdgeInsets
設置正值時,這些值表示從矩形的邊緣向內縮進的距離。換句話說,正值表示你要從矩形的每一個邊緣向內移動,這樣就會使矩形變小。
視覺化理解
假設你有一個初始矩形,框架為 (x: 0, y: 0, width: 100, height: 100)
。
正值邊距的應用
如果你設置 UIEdgeInsets(top: 10, left: 10, bottom: 10, right: 10)
,這意味著:
- 頂部:矩形的頂部邊緣向下移動 10 點。
- 左側:矩形的左邊邊緣向右移動 10 點。
- 底部:矩形的底部邊緣向上移動 10 點。
- 右側:矩形的右邊邊緣向左移動 10 點。
這樣一來,矩形的每一邊都向內縮進了 10 點,導致矩形的寬度和高度都減少了 20 點(每邊 10 點,共兩邊)。
結果,新的矩形框架變為 (x: 10, y: 10, width: 80, height: 80)
。
總結
正值使矩形縮小的原因在於,這些值表示從矩形的邊緣向內縮進的距離。這樣做會減少矩形的總寬度和高度,使其變得更小。
實際應用
把button的圖片從預設的置左改成置右
extension UIButton {
func configRightImage() {
self.titleEdgeInsets = UIEdgeInsets(top: 0, left: -(self.imageView?.frame.size.width ?? 0), bottom: 0, right: self.imageView?.frame.size.width ?? 0)
self.imageEdgeInsets = UIEdgeInsets(top: 0, left: (self.titleLabel?.frame.size.width ?? 0) - 10, bottom: 0, right: -(self.titleLabel?.frame.size.width ?? 0))
}
}