iOS 응용 (swift)
[iOS - swift] padding label (UILabel에 padding값 주는 방법)
jake-kim
2021. 9. 12. 00:41
padding 주는 방법
- 보통 stackView에 label을 넣을때 UIView를 넣고 그 안에 다시 Label을 넣어서 layout을 조절할 수 있지만, UILabel에 따로 padding값을 주어서 사용 가능

Padding 주는 방법 - drawText(in:)에서 padding값 설정
- drawText(in:) 메소드 활용: label의 text값이 그려질때 rect에 관한 값을 수정하고 싶을때 해당 메소드를 override하여 사용

- 사용 방법은 super.drawText(in:)에 변경된 rect값을 인수로 주어 반영

- super를 사용
class BasePaddingLabel: UILabel {
private var padding = UIEdgeInsets(top: 16.0, left: 16.0, bottom: 16.0, right: 16.0)
override func drawText(in rect: CGRect) {
super.drawText(in: rect.inset(by: padding))
}
}
Padding값 설정 후 intrinsicContentSize 수정
- padding을 변경한다고 intrinsicContentSize가 변경되지 않기 때문에, label.text의 내용이 잘리는 현상 발생하거나 top, bottom이 적용 안된 상태로 적용 > intrinsicContentSize 업데이트 필요

- intrinsicContentSize를 재정의하여 적용
override var intrinsicContentSize: CGSize {
var contentSize = super.intrinsicContentSize
contentSize.height += padding.top + padding.bottom
contentSize.width += padding.left + padding.right
return contentSize
}

- convenience init()을 추가하여 생성할때 padding을 설정할 수 있도록 편의를 위해 생성
convenience init(padding: UIEdgeInsets) {
self.init()
self.padding = padding
}
- 최종 코드
class BasePaddingLabel: UILabel {
private var padding = UIEdgeInsets(top: 16.0, left: 16.0, bottom: 16.0, right: 16.0)
convenience init(padding: UIEdgeInsets) {
self.init()
self.padding = padding
}
override func drawText(in rect: CGRect) {
super.drawText(in: rect.inset(by: padding))
}
override var intrinsicContentSize: CGSize {
var contentSize = super.intrinsicContentSize
contentSize.height += padding.top + padding.bottom
contentSize.width += padding.left + padding.right
return contentSize
}
}
* 전체 소스 코드: https://github.com/JK0369/PaddingEx
* 참고
- drawText(in:): https://developer.apple.com/documentation/uikit/uilabel/1620527-drawtext