[iOS] UILabel: ์๋ padding์ด ์ ์์ด์..? UILabel์ ํจ๋ฉ ์ ์ฉํ๊ธฐ
์์ด ํจ๋ฉ์ด ์ ์์ด..?
์น ๊ฐ๋ฐ์ ํ๋ค๋ฉด ์ต์ํ, CSS๋ ์ด๊ฒ์ ์ํด ์กด์ฌํ๋ค๊ณ ํด๋ ๊ณผ์ธ์ด ์๋ ์ ๋๋ก ์์ฃผ ์ฌ์ฉํ๋ padding์ด๋ผ๋ ์์ฑ์ด ์์ต๋๋ค. ๊ฐ์ผ๋ก ์ํ์ข์ฐ ์ค ๊ณจ๋ผ์, ์ํ/์ข์ฐ๋ฅผ ๋ฌถ์ด์, ์ฌ์ง์ด๋ ๊ฐ ํ๋๋ก ์ํ์ข์ฐ์ ๋ชจ๋ ์ ์ฉํ๊ฒ ํ ์๋ ์์ต๋๋ค.
ํ์ง๋ง iOS์์ ๋ ์ด๋ธ์ ํ
์คํธ๋ฅผ ๋ฃ๊ณ ์คํํด๋ณด๋ฉด,
์ด๋ ๊ฒ ๊ธ์ ํฌ๊ธฐ์ ๋ง์ถฐ์ ์ฌ์ด์ฆ๊ฐ ๊ฒฐ์ ๋์ด ํจ๋ฉ์ ๋ฃ์ ์๊ฐ ์์ต๋๋ค. ์คํ ๋ฆฌ๋ณด๋์๋ ์๋ฌด๋ฆฌ ์ฐพ์๋ด๋ ์๋๋ผ๊ตฌ์.. ๊ทธ๋์ ๊ตฌ๊ธ๋ง์ ํตํด ๋ฐฉ๋ฒ์ ์ฐพ์ ์๊ฐํด๋๋ฆฌ๋ ค๊ณ ํฉ๋๋ค!
https://stackoverflow.com/questions/27459746/adding-space-padding-to-a-uilabel
์ด ๋ต๋ณ์ ๋ณด๊ณ ํฌ์คํธ๋ฅผ ์ฐ๊ฒ ๋์์ต๋๋ค!
์ปค์คํ UILabel ๋ง๋ค๊ธฐ
UILabel์ ์์ํ๋ ํด๋์ค๋ฅผ ๋ง๋ค์ด์ ํจ๋ฉ์ ์ ์ฉ์์ผ์ฃผ์ด์ผ ํฉ๋๋ค.
class PaddingLabel: UILabel {
}
์ด๋ ๊ฒ ์ ํด๋์ค๋ฅผ ๋จผ์ ํ๋ ๋ง๋ค๊ฒ ์ต๋๋ค.
๊ทธ๋ฆฌ๊ณ ์ด ํด๋์ค๋ฅผ ์ฌ์ฉํ๋๋ก ์คํ ๋ฆฌ๋ณด๋์์ ์์ฑํ๋ ๋ ์ด๋ธ์ ์ฐ๊ฒฐํด์ค๋๋ค.
iOS์์๋ padding์ด๋ผ๋ ์ฉ์ด๋ฅผ ์ฌ์ฉํ์ง ์๊ณ edge inset ์ด๋ผ๋ ์ฉ์ด๋ฅผ ์ฌ์ฉํ๋๋ฐ์, ์ด๋ฅผ ์ค์ ํ ์ ์๋ ๊ฐ์ฒด๊ฐ UIEdgeInset์ผ๋ก ์ ๊ณต๋ฉ๋๋ค.
class PaddingLabel: UILabel {
@IBInspectable var topInset: CGFloat = 4.0
@IBInspectable var bottomInset: CGFloat = 4.0
@IBInspectable var leftInset: CGFloat = 8.0
@IBInspectable var rightInset: CGFloat = 8.0
}
๋ค ๋ฐฉํฅ์ ๋ํ inset ๊ฐ์ ์ง์ ํด์ฃผ๊ณ , ์คํ ๋ฆฌ๋ณด๋์์๋ ๊ฐ์ ๋ณ๊ฒฝํ ์ ์๋๋ก @IBInspectable์ ๋ถ์ฌ์ฃผ์์ต๋๋ค! ์ค์ ํ inset๋ค์ ์ ์ฉํ๋ ์์ ์ ์ธ์ ์ผ๊น์?? ์ง๊ด์ ์ผ๋ก ์๊ฐํด๋ณด๋ฉด, UILabel ๋ฐฐ๊ฒฝ์ด ๊ทธ๋ ค์ง๊ณ , ๊ทธ๋ค์์ ํ ์คํธ๊ฐ ๊ทธ๋ ค์ง ํ ๋ฐ ๋ฑ ๊ทธ ์ ์ ํจ๋ฉ์ ์ ์ฉํด์ ํ ์คํธ๋ฅผ ๊ทธ๋ ค์ฃผ๋ฉด ๋์ง ์์๊น์..! ๊ทธ๋์ ์ฐ๋ฆฌ๋ UILabel์ drawText ๋ฉ์๋๋ฅผ ์ค๋ฒ๋ผ์ด๋ ํด์ ์ฌ์ ์ํด์ค๋๋ค.
class PaddingLabel: UILabel {
@IBInspectable var topInset: CGFloat = 4.0
@IBInspectable var bottomInset: CGFloat = 4.0
@IBInspectable var leftInset: CGFloat = 8.0
@IBInspectable var rightInset: CGFloat = 8.0
override func drawText(in rect: CGRect) {
let insets = UIEdgeInsets(top: topInset, left: leftInset, bottom: bottomInset, right: rightInset)
super.drawText(in: rect.inset(by: insets))
}
}
์ ์ด๋ ๊ฒ CGRect์ UIEdgeInsets ์ ์ ์ฉํด์ ํจ๋ฉ์ด ์ ์ฉ๋ ๋ทฐ์ ํ
์คํธ๋ฅผ ๊ทธ๋ ค์ค๋๋ค.
๊ทธ๋ฐ๋ฐ ์ด๋ ๊ฒ๋ง ํ๊ณ ์คํํด๋ณด๋ฉด,
ํ
์คํธ๊ฐ ์๋ ค๋ฒ๋ฆฝ๋๋ค. ์ด์ ๋ ๋จ์ํฉ๋๋ค. UILabel์ intrinsicContentSize๋ฅผ ์ฌ์ฉํด์ ํ
์คํธ์ ๋์ด์ ๊ธธ์ด์ ๋ฐ๋ผ ๊ฐ๋ก ๋๋น๋ฅผ ๊ฒฐ์ ํฉ๋๋ค. ์ด ๋๋ฌธ์ ์ฐ๋ฆฌ๋ ๋ฐ๋ก UILabel์ ํฌ๊ธฐ๋ฅผ ์ ํด์ฃผ์ง ์์๋ iOS๊ฐ ์๋์ผ๋ก ๋๋น๋ฅผ ์ค์ ํด์ฃผ์์ต๋๋ค. ๊ทธ๋ฐ๋ฐ ์ง๊ธ์ ํ
์คํธ์ ํ
์คํธ๋ฅผ ๋ด๊ณ ์๋ ๋ทฐ์ ๊ธธ์ด๊ฐ ํจ๋ฉ์ผ๋ก ์ธํด ๋ฌ๋ผ์ ธ๋ฒ๋ ธ์ต๋๋ค.
๊ทธ๋์ UILabel์ intrinsicContentSize๋ฅผ ํจ๋ฉ๊น์ง ํฌํจํ๋ ํฌ๊ธฐ๋ก ๊ฒฐ์ ํด์ฃผ์ด์ผ ์ ์์ ์ผ๋ก ๋ ์ด๋ธ์ด ๋ณด์ฌ์ง๊ฒ ํ ์ ์์ต๋๋ค. ์ด ์์
์ UILabel์ intrinsicContentSize ์ฐ์ฐ ํ๋กํผํฐ๋ฅผ ์ค๋ฒ๋ผ์ด๋ ํด์ ๋ฐํ ๊ฐ์ ๋ฐ๊ฟ์ค๋๋ค!
class PaddingLabel: UILabel {
@IBInspectable var topInset: CGFloat = 4.0
@IBInspectable var bottomInset: CGFloat = 4.0
@IBInspectable var leftInset: CGFloat = 8.0
@IBInspectable var rightInset: CGFloat = 8.0
override func drawText(in rect: CGRect) {
let insets = UIEdgeInsets(top: topInset, left: leftInset, bottom: bottomInset, right: rightInset)
super.drawText(in: rect.inset(by: insets))
}
override var intrinsicContentSize: CGSize {
let size = super.intrinsicContentSize
return CGSize(width: size.width + leftInset + rightInset, height: size.height + topInset + bottomInset)
}
}
์ค์ ํ๋ ์ข์ฐ, ์ํ ํจ๋ฉ์ ๊ธฐ์กด intrinsicContentSize์ ๊ฐ๋ก์ ์ธ๋ก ๊ฐ์ ๋ํด์ ๋ฐํํด์ฃผ๋๋ก ์ค๋ฒ๋ผ์ด๋ํ์ต๋๋ค.
๊ทธ๋ฆฌ๊ณ ๋ง์ง๋ง์ผ๋ก ํจ๋ฉ์ด ํฌํจ๋ bounds๋ ์ค์ ํด์ฃผ๊ธฐ ์ํด์
class PaddingLabel: UILabel {
@IBInspectable var topInset: CGFloat = 8.0
@IBInspectable var bottomInset: CGFloat = 8.0
@IBInspectable var leftInset: CGFloat = 16.0
@IBInspectable var rightInset: CGFloat = 16.0
override func drawText(in rect: CGRect) {
let insets = UIEdgeInsets(top: topInset, left: leftInset, bottom: bottomInset, right: rightInset)
super.drawText(in: rect.inset(by: insets))
}
override var intrinsicContentSize: CGSize {
let size = super.intrinsicContentSize
return CGSize(width: size.width + leftInset + rightInset, height: size.height + topInset + bottomInset)
}
override var bounds: CGRect {
didSet { preferredMaxLayoutWidth = bounds.width - (leftInset + rightInset) }
}
}
์ด๋ ๊ฒ bounds ํ๋กํผํฐ๋ ์ค๋ฒ๋ผ์ด๋๋ฅผ ํด์ฃผ๊ณ bounds ๊ฐ์ด ๋ฐ๋ ๋๋ง๋ค ๊ฐ๋ก ๋๋น๋ฅผ ํจ๋ฉ์ ํฌํจํ๋๋ก ์ ์ํ์ต๋๋ค!
๊ทธ๋ผ ์คํํด๋ณผ๊น์?
ํจ๋ฉ์ด ์ ์ ์ฉ๋์์ต๋๋ค~!!
๊ทธ๋ฆฌ๊ณ IBInspectable์ ์ง์ ํด๋์๊ธฐ ๋๋ฌธ์ ์ด๋ ๊ฒ ์คํ ๋ฆฌ๋ณด๋ ์์์๋ ๊ฐ์ ์ ํ ์ ์์ต๋๋ค.
๋ฏธ๋ฆฌ ์ ์ํด๋๊ณ ํ์ํ ๋๋ง๋ค ์ฌ์ฉํ๋ฉด ์ ์ฉํ๊ฒ ์ฃ ? ์ ๋ ์์ฃผ ์ด์ฉํ๊ฒ ๋ ๊ฒ ๊ฐ์ต๋๋ค!
์ ์ฒด ์ฝ๋