UILabel에 공간/패딩 추가
는 나나 a a a가 있다UILabel위쪽과 아래쪽 공간을 추가할 수 있습니다.구속조건의 최소 높이를 사용하여 다음과 같이 수정했습니다.

이 작업을 위해 사용한 것은 다음과 같습니다.
override func drawTextInRect(rect: CGRect) {
var insets: UIEdgeInsets = UIEdgeInsets(top: 0.0, left: 10.0, bottom: 0.0, right: 10.0)
super.drawTextInRect(UIEdgeInsetsInsetRect(rect, insets))
}
하지만 두 줄 이상 쓰면 문제가 같기 때문에 다른 방법을 찾아야 합니다.

Swift 4.2로 시험해 봤는데 잘 됐으면 좋겠네요!
@IBDesignable class PaddingLabel: UILabel {
@IBInspectable var topInset: CGFloat = 5.0
@IBInspectable var bottomInset: CGFloat = 5.0
@IBInspectable var leftInset: CGFloat = 7.0
@IBInspectable var rightInset: CGFloat = 7.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 {
// ensures this works within stack views if multi-line
preferredMaxLayoutWidth = bounds.width - (leftInset + rightInset)
}
}
}
또는 https://github.com/levantAJ/PaddingLabel에서 코코아팟을 사용할 수 있습니다.
pod 'PaddingLabel', '1.2'
만약 당신이 UILABEL을 하위 분류하지 않고 고수하고 싶다면, Mundi는 당신에게 명확한 해결책을 주었다.
UILabel을 UIView로 래핑하는 것을 피하고 싶다면 UITextView를 사용하여 UIEdgeInset(패딩) 또는 서브클래스 UILabel을 사용하여 UIEdgeInset을 지원할 수 있습니다.
UITextView를 사용하는 경우 필요한 것은 inset(Objective-C):
textView.textContainerInset = UIEdgeInsetsMake(10, 0, 10, 0);
또는 UILabel을 서브클래스로 하는 경우 이 접근법의 예로는 drawTextInRect 메서드를 덮어쓰는 것이 있습니다.
표c-C)
- (void)drawTextInRect:(CGRect)uiLabelRect {
UIEdgeInsets myLabelInsets = {10, 0, 10, 0};
[super drawTextInRect:UIEdgeInsetsInsetRect(uiLabelRect, myLabelInsets)];
}
또한 TOP, LEFT, BOTH 및 RIGHT에 대한 삽입 변수를 새 하위 클래스 UILabel에 제공할 수 있습니다.
예를 들어 다음과 같은 코드가 있습니다.
인 .h (Objective-C)
float topInset, leftInset,bottomInset, rightInset;
.m(객관-C)
- (void)drawTextInRect:(CGRect)uiLabelRect {
[super drawTextInRect:UIEdgeInsetsInsetRect(uiLabelRect, UIEdgeInsetsMake(topInset,leftInset,bottomInset,rightInset))];
}
제가 본 바로는 UILabel의 intrent Content Size를 서브클래스 할 때 덮어쓰셔야 할 것 같습니다.
따라서 다음과 같이 intrenticContentSize를 재정의해야 합니다.
- (CGSize) intrinsicContentSize {
CGSize intrinsicSuperViewContentSize = [super intrinsicContentSize] ;
intrinsicSuperViewContentSize.height += topInset + bottomInset ;
intrinsicSuperViewContentSize.width += leftInset + rightInset ;
return intrinsicSuperViewContentSize ;
}
또, 인스톨을 개별적으로 편집하는 대신에, 다음의 방법을 추가해 주세요.
- (void) setContentEdgeInsets:(UIEdgeInsets)edgeInsets {
topInset = edgeInsets.top;
leftInset = edgeInsets.left;
rightInset = edgeInsets.right;
bottomInset = edgeInsets.bottom;
[self invalidateIntrinsicContentSize] ;
}
그러면 UILabel 크기가 엣지 삽입과 일치하도록 업데이트되고 참조한 여러 줄의 필요성이 해결됩니다.
조금 검색해 본 결과, IPInset Label이 붙어 있는 이 Gist를 발견했습니다.이러한 솔루션 중 어느 것도 효과가 없는 경우는, 시험해 보세요.
이 건에 대해 비슷한 질문이 있었다.
사용 가능한 솔루션의 전체 목록은 다음 답변을 참조하십시오.UILabel 텍스트 여백
스위프트 3
import UIKit
class PaddingLabel: UILabel {
@IBInspectable var topInset: CGFloat = 5.0
@IBInspectable var bottomInset: CGFloat = 5.0
@IBInspectable var leftInset: CGFloat = 5.0
@IBInspectable var rightInset: CGFloat = 5.0
override func drawText(in rect: CGRect) {
let insets = UIEdgeInsets(top: topInset, left: leftInset, bottom: bottomInset, right: rightInset)
super.drawText(in: UIEdgeInsetsInsetRect(rect, insets))
}
override var intrinsicContentSize: CGSize {
get {
var contentSize = super.intrinsicContentSize
contentSize.height += topInset + bottomInset
contentSize.width += leftInset + rightInset
return contentSize
}
}
}
IB에서 올바르게 실행할 수 있습니다.
- 텍스트를 속성으로 변경하다
- 드롭다운 리스트로 이동하다
- 행, 단락 및 텍스트 변경 들여쓰기 첫 줄 또는 원하는 모든 항목에 대한 패딩 속성을 볼 수 있습니다.
- 결과를 확인하다
이미 내장된 UIButton을 사용합니다.추가 버튼 기능을 모두 끄면 엣지 설치를 설정할 수 있는 라벨이 표시됩니다.
let button = UIButton()
button.contentEdgeInsets = UIEdgeInsets(top: 5, left: 5, bottom: 5, right: 5)
button.setTitle("title", for: .normal)
button.tintColor = .white // this will be the textColor
button.isUserInteractionEnabled = false
사용하세요.UIView슈퍼뷰로 자동 레이아웃을 사용하여 라벨에 고정 여백을 정의합니다.
SWIFT 4
사용하기 쉬운 솔루션으로 프로젝트의 모든 UILabel 자녀가 사용할 수 있습니다.
예:
let label = UILabel()
label.<Do something>
label.padding = UIEdgeInsets(top: 0, left: 16, bottom: 0, right: 0)
UILabel 확장
import UIKit
extension UILabel {
private struct AssociatedKeys {
static var padding = UIEdgeInsets()
}
public var padding: UIEdgeInsets? {
get {
return objc_getAssociatedObject(self, &AssociatedKeys.padding) as? UIEdgeInsets
}
set {
if let newValue = newValue {
objc_setAssociatedObject(self, &AssociatedKeys.padding, newValue as UIEdgeInsets?, objc_AssociationPolicy.OBJC_ASSOCIATION_RETAIN_NONATOMIC)
}
}
}
override open func draw(_ rect: CGRect) {
if let insets = padding {
self.drawText(in: rect.inset(by: insets))
} else {
self.drawText(in: rect)
}
}
override open var intrinsicContentSize: CGSize {
guard let text = self.text else { return super.intrinsicContentSize }
var contentSize = super.intrinsicContentSize
var textWidth: CGFloat = frame.size.width
var insetsHeight: CGFloat = 0.0
var insetsWidth: CGFloat = 0.0
if let insets = padding {
insetsWidth += insets.left + insets.right
insetsHeight += insets.top + insets.bottom
textWidth -= insetsWidth
}
let newSize = text.boundingRect(with: CGSize(width: textWidth, height: CGFloat.greatestFiniteMagnitude),
options: NSStringDrawingOptions.usesLineFragmentOrigin,
attributes: [NSAttributedString.Key.font: self.font], context: nil)
contentSize.height = ceil(newSize.size.height) + insetsHeight
contentSize.width = ceil(newSize.size.width) + insetsWidth
return contentSize
}
}
스택 뷰, 동적 셀, 동적 줄 수, 컬렉션 뷰, 애니메이션 패딩, 모든 문자 수 및 기타 모든 상황을 포함한 모든 경우에 적합한 완전하고 올바른 솔루션을 마침내 찾아냈습니다.
의 패딩UILabel풀 , 풀풀 , , 。2021년에 되었습니다.
세 가지 해야 할 일이 있다는 것을 알게 되었다.
1. 새로운 작은 사이즈로 textRect#forBounds를 호출해야 합니다.
2. drawText를 새로운 작은 사이즈로 덮어쓸 필요가 있습니다.
3. 동적 크기의 셀인 경우 intrent Content Size를 조정해야 합니다.
아래 일반적인 예에서 텍스트 단위는 테이블 뷰, 스택 뷰 또는 이와 유사한 구조에 있으며, 이 구성에서는 고정된 너비를 제공합니다.이 예에서는 60, 20, 20, 24의 패딩이 필요합니다.
따라서 "기존" intrent Content Size를 사용하여 높이에 80을 추가합니다.
다시 말씀드리면...
말 그대로 엔진에 의해 "지금까지" 계산된 높이를 얻은 후 값을 변경해야 합니다.
저는 그 과정이 혼란스럽다고 생각합니다만, 그렇게 되어 있습니다.저로서는, Apple이 「잠정 높이 계산」이라고 하는 이름의 콜을 공개해야 합니다.
다음으로 새로운 소형 사이즈로 텍스트Rect#forBounds 콜을 실제로 사용해야 합니다.
따라서 textRect#forBounds에서는 먼저 크기를 작게 하고 다음으로 super를 호출합니다.
경고! 슈퍼폰은 그전에 하지 말고 나중에 해!
이 페이지의 모든 시도와 논의를 주의 깊게 살펴보면, 그것이 바로 문제입니다.
「통상적으로 기능하는 것처럼 보인다」라고 하는 솔루션에 주의해 주세요.이것이 바로 그 이유입니다.혼란스럽지만, 그 전에가 아니라, 「super after」라고 전화해야 합니다.
super를 「잘못된 순서로 호출」하면, 통상은 동작합니다만, 특정의 텍스트 길이에 대해서는 실패합니다.
다음은 "잘못된 슈퍼퍼스트 실행"의 정확한 시각적 예입니다.
60, 20, 20, 24 여백은 맞지만 크기 계산은 실제로 잘못되어 있습니다.이는 텍스트Rect#forBounds의 "super first" 패턴을 사용하여 이루어졌기 때문입니다.
수정:
이제 textRect#forBounds 엔진이 계산을 올바르게 수행하는 방법을 알 수 있게 되었습니다.
드디어!
이 예에서는 폭이 고정된 일반적인 상황에서 UILabel이 사용되고 있습니다.따라서 integrent Content Size에서는 필요한 전체 높이를 "추가"해야 합니다(폭에 "추가"할 필요는 없습니다.고정되어 있기 때문에 의미가 없습니다).
그런 다음 textRect#forBounds에서 autolayout에 의해 "지금까지 제안된" 한계를 얻고 마진을 뺀 다음 textRect#forBounds 엔진을 다시 호출합니다.즉, 슈퍼로 말하면 결과가 나타납니다.
마지막으로 간단하게 drawText 같은 작은 상자에 그립니다.
휴!
let UIEI = UIEdgeInsets(top: 60, left: 20, bottom: 20, right: 24) // as desired
override var intrinsicContentSize:CGSize {
numberOfLines = 0 // don't forget!
var s = super.intrinsicContentSize
s.height = s.height + UIEI.top + UIEI.bottom
s.width = s.width + UIEI.left + UIEI.right
return s
}
override func drawText(in rect:CGRect) {
let r = rect.inset(by: UIEI)
super.drawText(in: r)
}
override func textRect(forBounds bounds:CGRect,
limitedToNumberOfLines n:Int) -> CGRect {
let b = bounds
let tr = b.inset(by: UIEI)
let ctr = super.textRect(forBounds: tr, limitedToNumberOfLines: 0)
// that line of code MUST be LAST in this function, NOT first
return ctr
}
다시한번.이 QA 및 기타 "거의" 정답은 위의 첫 번째 이미지에서 "슈퍼가 잘못된 위치에 있습니다"라는 문제를 겪고 있습니다.integrent Content Size에서 크기를 강제로 크게 한 다음 textRect#forBounds에서 첫 번째 제안의 경계를 축소하고 다음으로 super를 호출해야 합니다.
개요: textRect#forBounds에서 "super last"를 호출해야 합니다.
그게 비결이에요.
invalidate, sizeThatFits, needsLayout 또는 기타 강제 호출을 추가로 호출할 필요도 없고 호출할 필요도 없습니다.정상적인 자동 레이아웃 그리기 사이클에서는 올바른 솔루션이 올바르게 동작해야 합니다.
스토리보드 미포함:
class PaddingLabel: UILabel {
var topInset: CGFloat
var bottomInset: CGFloat
var leftInset: CGFloat
var rightInset: CGFloat
required init(withInsets top: CGFloat, _ bottom: CGFloat,_ left: CGFloat,_ right: CGFloat) {
self.topInset = top
self.bottomInset = bottom
self.leftInset = left
self.rightInset = right
super.init(frame: CGRect.zero)
}
required init?(coder aDecoder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}
override func drawText(in rect: CGRect) {
let insets = UIEdgeInsets(top: topInset, left: leftInset, bottom: bottomInset, right: rightInset)
super.drawText(in: UIEdgeInsetsInsetRect(rect, insets))
}
override var intrinsicContentSize: CGSize {
get {
var contentSize = super.intrinsicContentSize
contentSize.height += topInset + bottomInset
contentSize.width += leftInset + rightInset
return contentSize
}
}
}
사용방법:
let label = PaddingLabel(8, 8, 16, 16)
label.font = .boldSystemFont(ofSize: 16)
label.text = "Hello World"
label.backgroundColor = .black
label.textColor = .white
label.textAlignment = .center
label.layer.cornerRadius = 8
label.clipsToBounds = true
label.sizeToFit()
view.addSubview(label)
결과:

스위프트 4 이상
class EdgeInsetLabel: UILabel {
var textInsets = UIEdgeInsets.zero {
didSet { invalidateIntrinsicContentSize() }
}
override func textRect(forBounds bounds: CGRect, limitedToNumberOfLines numberOfLines: Int) -> CGRect {
let textRect = super.textRect(forBounds: bounds, limitedToNumberOfLines: numberOfLines)
let invertedInsets = UIEdgeInsets(top: -textInsets.top,
left: -textInsets.left,
bottom: -textInsets.bottom,
right: -textInsets.right)
return textRect.inset(by: invertedInsets)
}
override func drawText(in rect: CGRect) {
super.drawText(in: rect.inset(by: textInsets))
}
}
사용방법:
let label = EdgeInsetLabel()
label.textInsets = UIEdgeInsets(top: 2, left: 6, bottom: 2, right: 6)
자동 레이아웃만 사용:
let paddedWidth = myLabel.intrinsicContentSize.width + 2 * padding
myLabel.widthAnchor.constraint(equalToConstant: paddedWidth).isActive = true
다 했어요.
구현이 포함된 Swift 3 코드 예시
class UIMarginLabel: UILabel {
var topInset: CGFloat = 0
var rightInset: CGFloat = 0
var bottomInset: CGFloat = 0
var leftInset: CGFloat = 0
override func drawText(in rect: CGRect) {
let insets: UIEdgeInsets = UIEdgeInsets(top: self.topInset, left: self.leftInset, bottom: self.bottomInset, right: self.rightInset)
self.setNeedsLayout()
return super.drawText(in: UIEdgeInsetsInsetRect(rect, insets))
}
}
class LabelVC: UIViewController {
//Outlets
@IBOutlet weak var labelWithMargin: UIMarginLabel!
override func viewDidLoad() {
super.viewDidLoad()
//Label settings.
labelWithMargin.leftInset = 10
view.layoutIfNeeded()
}
}
스토리보드 라벨 오브젝트에 클래스명 UIMarginLabel을 추가하는 것을 잊지 마세요.해피 코딩!
Swift 3의 경우
최선의 간단한 방법
class UILabelPadded: UILabel {
override func drawText(in rect: CGRect) {
let insets = UIEdgeInsets.init(top: 0, left: 5, bottom: 0, right: 5)
super.drawText(in: UIEdgeInsetsInsetRect(rect, insets))
}
}
Swift 4.2(Xcode 10 beta 6)에 따라 "UIEdgeInsetInsetRect"는 권장되지 않습니다.또한 더 유용하게 만들기 위해 반을 공개했습니다.
public class UIPaddedLabel: UILabel {
@IBInspectable var topInset: CGFloat = 5.0
@IBInspectable var bottomInset: CGFloat = 5.0
@IBInspectable var leftInset: CGFloat = 7.0
@IBInspectable var rightInset: CGFloat = 7.0
public override func drawText(in rect: CGRect) {
let insets = UIEdgeInsets.init(top: topInset, left: leftInset, bottom: bottomInset, right: rightInset)
super.drawText(in: rect.inset(by: insets))
}
public override var intrinsicContentSize: CGSize {
let size = super.intrinsicContentSize
return CGSize(width: size.width + leftInset + rightInset,
height: size.height + topInset + bottomInset)
}
public override func sizeToFit() {
super.sizeThatFits(intrinsicContentSize)
}
}
나는 인정된 답변으로 조금 수정했다.가 leftInset ★★★★★★★★★★★★★★★★★」rightInset가, 텍, 스, /, 는, / b/c, /, 라, /, /, /, /, /, /, /, /, /, /, /, /, /, /, /, /, /, /, /, /, /, /, /, /, /, /, /, /, /, /, /, /, /, /,
이 문제를 해결하려면 다음과 같이 텍스트 높이를 다시 계산해야 합니다.
@IBDesignable class PaddingLabel: UILabel {
@IBInspectable var topInset: CGFloat = 20.0
@IBInspectable var bottomInset: CGFloat = 20.0
@IBInspectable var leftInset: CGFloat = 20.0
@IBInspectable var rightInset: CGFloat = 20.0
override func drawTextInRect(rect: CGRect) {
let insets = UIEdgeInsets(top: topInset, left: leftInset, bottom: bottomInset, right: rightInset)
super.drawTextInRect(UIEdgeInsetsInsetRect(rect, insets))
}
override func intrinsicContentSize() -> CGSize {
var intrinsicSuperViewContentSize = super.intrinsicContentSize()
let textWidth = frame.size.width - (self.leftInset + self.rightInset)
let newSize = self.text!.boundingRectWithSize(CGSizeMake(textWidth, CGFloat.max), options: NSStringDrawingOptions.UsesLineFragmentOrigin, attributes: [NSFontAttributeName: self.font], context: nil)
intrinsicSuperViewContentSize.height = ceil(newSize.size.height) + self.topInset + self.bottomInset
return intrinsicSuperViewContentSize
}
}
결과:
저는 저와 같은 상황에 있는 사람들을 돕고 싶습니다.
하위 분류를 사용하지 않는 다른 옵션은 다음과 같습니다.
- " " " 를 설정합니다.
text sizeToFit()그런 다음 라벨 높이를 약간 높여 패딩을 시뮬레이션합니다.
label.text = "someText" label.textAlignment = .center label.sizeToFit() label.frame = CGRect( x: label.frame.x, y: label.frame.y,width: label.frame.width + 20,height: label.frame.height + 8)
다른 답변과 마찬가지로 버그를 수정합니다.
label.width자동 레이아웃으로 제어되며 텍스트가 잘릴 수 있습니다.
@IBDesignable
class InsetLabel: UILabel {
@IBInspectable var topInset: CGFloat = 4.0
@IBInspectable var leftInset: CGFloat = 4.0
@IBInspectable var bottomInset: CGFloat = 4.0
@IBInspectable var rightInset: CGFloat = 4.0
var insets: UIEdgeInsets {
get {
return UIEdgeInsets.init(top: topInset, left: leftInset, bottom: bottomInset, right: rightInset)
}
set {
topInset = newValue.top
leftInset = newValue.left
bottomInset = newValue.bottom
rightInset = newValue.right
}
}
override func sizeThatFits(_ size: CGSize) -> CGSize {
var adjSize = super.sizeThatFits(size)
adjSize.width += leftInset + rightInset
adjSize.height += topInset + bottomInset
return adjSize
}
override var intrinsicContentSize: CGSize {
let systemContentSize = super.intrinsicContentSize
let adjustSize = CGSize(width: systemContentSize.width + leftInset + rightInset, height: systemContentSize.height + topInset + bottomInset)
if adjustSize.width > preferredMaxLayoutWidth && preferredMaxLayoutWidth != 0 {
let constraintSize = CGSize(width: bounds.width - (leftInset + rightInset), height: .greatestFiniteMagnitude)
let newSize = super.sizeThatFits(constraintSize)
return CGSize(width: systemContentSize.width, height: ceil(newSize.height) + topInset + bottomInset)
} else {
return adjustSize
}
}
override func drawText(in rect: CGRect) {
super.drawText(in: rect.inset(by: insets))
}
}
Swift 3, iOS10 솔루션:
open class UIInsetLabel: UILabel {
open var insets : UIEdgeInsets = UIEdgeInsets() {
didSet {
super.invalidateIntrinsicContentSize()
}
}
open override var intrinsicContentSize: CGSize {
var size = super.intrinsicContentSize
size.width += insets.left + insets.right
size.height += insets.top + insets.bottom
return size
}
override open func drawText(in rect: CGRect) {
return super.drawText(in: UIEdgeInsetsInsetRect(rect, insets))
}
}
UILabel 확장을 사용한Swift 5의 예
을 설정하기가 .label.setMargins(15).
extension UILabel {
func setMargins(_ margin: CGFloat = 10) {
if let textString = self.text {
let paragraphStyle = NSMutableParagraphStyle()
paragraphStyle.firstLineHeadIndent = margin
paragraphStyle.headIndent = margin
paragraphStyle.tailIndent = -margin
let attributedString = NSMutableAttributedString(string: textString)
attributedString.addAttribute(.paragraphStyle, value: paragraphStyle, range: NSRange(location: 0, length: attributedString.length))
attributedText = attributedString
}
}
}
서브클래스 UILABEL(파일-새 파일-코코아)UILabel의 TouchClass-make 서브클래스).
// sampleLabel.swift
import UIKit
class sampleLabel: UILabel {
let topInset = CGFloat(5.0), bottomInset = CGFloat(5.0), leftInset = CGFloat(8.0), rightInset = CGFloat(8.0)
override func drawTextInRect(rect: CGRect) {
let insets: UIEdgeInsets = UIEdgeInsets(top: topInset, left: leftInset, bottom: bottomInset, right: rightInset)
super.drawTextInRect(UIEdgeInsetsInsetRect(rect, insets))
}
override func intrinsicContentSize() -> CGSize {
var intrinsicSuperViewContentSize = super.intrinsicContentSize()
intrinsicSuperViewContentSize.height += topInset + bottomInset
intrinsicSuperViewContentSize.width += leftInset + rightInset
return intrinsicSuperViewContentSize
}
}
View Controller의 경우
override func viewDidLoad() {
super.viewDidLoad()
let labelName = sampleLabel(frame: CGRectMake(0, 100, 300, 25))
labelName.text = "Sample Label"
labelName.backgroundColor = UIColor.grayColor()
labelName.textColor = UIColor.redColor()
labelName.shadowColor = UIColor.blackColor()
labelName.font = UIFont(name: "HelveticaNeue", size: CGFloat(22))
self.view.addSubview(labelName)
}
또는 Storyboard의 커스텀 UILabel 클래스를 라벨 클래스로 관련짓습니다.
문디의 답변에 대한 자세한 설명.
을 ,, 벨에 하는 것UIView자동 레이아웃을 통해 패딩을 적용합니다.§:
개요:
작성하다
UIView('패널') (" (" (" (" (" (" (" (" (" (" (" (" (" (" (".작성하다
UILabel패널에 추가합니다.구속조건을 추가하여 패딩을 적용합니다.
보기 계층에 패널을 추가한 다음 패널을 배치하십시오.
세부사항:
패널 뷰를 만듭니다.
let panel = UIView() panel.backgroundColor = .green panel.layer.cornerRadius = 12
라벨을 생성하여 패널에 서브뷰로 추가합니다.
label = UILabel() panel.addSubview(label)로 합니다.
라벨의 모서리와 패널 사이에 구속조건을 추가합니다.이렇게 하면 패널이 라벨에서 거리를 유지하게 됩니다.즉, "패딩"입니다.
편집: 이 모든 것을 손으로 하는 것은 매우 전문적이고 장황하며 오류가 발생하기 쉽습니다.GitHub에서 Auto Layout 래퍼를 선택하거나 직접 작성하는 것이 좋습니다.
label.panel.translatesAutoresizingMaskIntoConstraints = false
label.topAnchor.constraint(equalTo: panel.topAnchor,
constant: vPadding).isActive = true
label.bottomAnchor.constraint(equalTo: panel.bottomAnchor,
constant: -vPadding).isActive = true
label.leadingAnchor.constraint(equalTo: panel.leadingAnchor,
constant: hPadding).isActive = true
label.trailingAnchor.constraint(equalTo: panel.trailingAnchor,
constant: -hPadding).isActive = true
label.textAlignment = .center
- 보기 계층에 패널을 추가한 다음 위치 제약 조건을 추가하십시오.예를 들어, 샘플 이미지와 같이 tableViewCell의 오른쪽을 잡습니다.
참고: 치수 구속조건이 아닌 위치 구속조건만 추가하면 됩니다.은 두 을 모두 으로 레이아웃을 합니다.intrinsicContentSize★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★
hostView.addSubview(panel)
panel.translatesAutoresizingMaskIntoConstraints = false
panel.trailingAnchor.constraint(equalTo: hostView.trailingAnchor,
constant: -16).isActive = true
panel.centerYAnchor.constraint(equalTo: hostView.centerYAnchor).isActive = true
「 」를 사용하고 UILabel
class UILabel : UIKit.UILabel {
var insets = UIEdgeInsets.zero {
didSet { invalidateIntrinsicContentSize() }
}
override func textRect(forBounds bounds: CGRect, limitedToNumberOfLines numberOfLines: Int) -> CGRect {
let textRect = super.textRect(forBounds: bounds, limitedToNumberOfLines: numberOfLines)
let invertedInsets = UIEdgeInsets(top: -insets.top,
left: -insets.left,
bottom: -insets.bottom,
right: -insets.right)
return textRect.inset(by: invertedInsets)
}
override func drawText(in rect: CGRect) {
super.drawText(in: rect.inset(by: insets))
}
}
패딩을 적용하는 동안 텍스트 트리밍 문제가 발생할 경우 이 코드를 사용하십시오.
@IBDesignable class PaddingLabel: UILabel {
@IBInspectable var topInset: CGFloat = 5.0
@IBInspectable var bottomInset: CGFloat = 5.0
@IBInspectable var leftInset: CGFloat = 5.0
@IBInspectable var rightInset: CGFloat = 5.0
override func drawText(in rect: CGRect) {
let insets = UIEdgeInsets.init(top: topInset, left: leftInset, bottom: bottomInset, right: rightInset)
super.drawText(in: UIEdgeInsetsInsetRect(rect, insets))
}
override var intrinsicContentSize: CGSize {
var intrinsicSuperViewContentSize = super.intrinsicContentSize
let textWidth = frame.size.width - (self.leftInset + self.rightInset)
let newSize = self.text!.boundingRect(with: CGSize(textWidth, CGFloat.greatestFiniteMagnitude), options: NSStringDrawingOptions.usesLineFragmentOrigin, attributes: [NSFontAttributeName: self.font], context: nil)
intrinsicSuperViewContentSize.height = ceil(newSize.size.height) + self.topInset + self.bottomInset
return intrinsicSuperViewContentSize
}
}
extension CGSize{
init(_ width:CGFloat,_ height:CGFloat) {
self.init(width:width,height:height)
}
}
SINGLE-LINE 라벨 전용: (2021 구문)
여기에서 검색하여 섹션 제목 또는 기타 목록 항목과 같이 엄격히 단일 라인 레이블에 패딩이 필요한 경우,
구문이 많이 바뀌었어요.인터넷상의 오래된 정보에 주의해 주세요.
복사하여 붙여넣는 정확한 클래스는 다음과 같습니다.
// add 100 above, 50 padding below a SINGLE-LINE label
import UIKit
class SingleLineLabelWithSpacing: UILabel {
// STRICTLY for SINGLE LINE labels
// only works with SINGLE LINE labels
override func drawText(in rect: CGRect) {
let insets: UIEdgeInsets = UIEdgeInsets(
top: 100, left: 0, bottom: 50, right: 0)
super.drawText(in: rect.inset(by: insets))
}
override var intrinsicContentSize: CGSize {
var ic = super.intrinsicContentSize
ic.height = ic.height + 150
return ic
}
}
이 예에서는 100/50보다 위/아래 패딩입니다.
이는 스크롤 목록, 피드 또는 기타 목록이 있을 때 일반적으로 수행하는 작업입니다.
이렇게 하면 머리글, 사용자 이름 등의 위/아래 띄어쓰기를 할 필요가 없습니다.스택 뷰나 케이스에 관계없이 드롭하기만 하면 됩니다.
또한 설계자가 조정하고 싶을 때 모든 곳에서 두 값을 동시에 변경할 수도 있습니다.
주의: 텍스트 줄 수, 동적 크기 조정 셀, 애니메이션 등에 관계없이 완벽하게 작동하도록 UILabel을 실제로 패딩하려면 매우 복잡합니다.정답은 https://stackoverflow.com/a/58876988/294884 뿐입니다.
간단한 패딩 (Swift 3.0, Alvin George 답변):
class NewLabel: UILabel {
override func textRect(forBounds bounds: CGRect, limitedToNumberOfLines numberOfLines: Int) -> CGRect {
return self.bounds.insetBy(dx: CGFloat(15.0), dy: CGFloat(15.0))
}
override func draw(_ rect: CGRect) {
super.drawText(in: self.bounds.insetBy(dx: CGFloat(5.0), dy: CGFloat(5.0)))
}
}
실용적인 해결책 중 하나는 메인 라벨과 동일한 높이와 색상을 가진 빈 라벨을 추가하는 것입니다.메인 라벨의 선두/트레일링 공간을 0으로 설정하고 수직 중심을 정렬한 후 폭을 원하는 여백으로 만듭니다.
Storyboard에서 @IBInspectable / @IBDesignable UILabel을 사용하지 않거나 사용할 필요가 없는 경우(어차피 렌더링 속도가 너무 느리다고 생각됩니다), 4개의 다른 CGFloat 대신 UIEdgeInset을 사용하는 것이 좋습니다.
Swift 4.2의 코드 예:
class UIPaddedLabel: UILabel {
var padding = UIEdgeInsets(top: 0, left: 0, bottom: 0, right: 0)
public override func drawText(in rect: CGRect) {
super.drawText(in: rect.inset(by: padding))
}
public override var intrinsicContentSize: CGSize {
let size = super.intrinsicContentSize
return CGSize(width: size.width + padding.left + padding.right,
height: size.height + padding.top + padding.bottom)
}
}
내 솔루션은 사람들이 대답한 것과 비슷하지만 추가된다.sizeThatFits돕다UIKit정확한 사이즈를 알아내기 위해서요.
class InsetLabel : UILabel {
@objc var textInsets: UIEdgeInsets = .zero
override func drawText(in rect: CGRect) {
super.drawText(in: rect.inset(by: textInsets))
}
override func sizeThatFits(_ size: CGSize) -> CGSize {
var s = super.sizeThatFits(CGSize(width: size.width - (textInsets.left + textInsets.right), height: size.height - (textInsets.top + textInsets.bottom)))
s.height += textInsets.top + textInsets.bottom
return s
}
}
다른 답변과 비슷하지만 패딩을 2진법으로 설정하는 펑크 클래스가 있습니다.
class UILabelExtendedView: UILabel
{
var topInset: CGFloat = 4.0
var bottomInset: CGFloat = 4.0
var leftInset: CGFloat = 8.0
var rightInset: CGFloat = 8.0
override func drawText(in rect: CGRect)
{
let insets: UIEdgeInsets = UIEdgeInsets(top: topInset, left: leftInset, bottom: bottomInset, right: rightInset)
super.drawText(in: UIEdgeInsetsInsetRect(rect, insets))
}
override public var intrinsicContentSize: CGSize
{
var contentSize = super.intrinsicContentSize
contentSize.height += topInset + bottomInset
contentSize.width += leftInset + rightInset
return contentSize
}
func setPadding(top: CGFloat, left: CGFloat, bottom: CGFloat, right: CGFloat){
self.topInset = top
self.bottomInset = bottom
self.leftInset = left
self.rightInset = right
let insets: UIEdgeInsets = UIEdgeInsets(top: top, left: left, bottom: bottom, right: right)
super.drawText(in: UIEdgeInsetsInsetRect(self.frame, insets))
}
}
텍스트Rect 주위에 2px 패딩을 추가하려면 다음 절차를 수행합니다.
let insets = UIEdgeInsets(top: -2, left: -2, bottom: -2, right: -2)
label.frame = UIEdgeInsetsInsetRect(textRect, insets)
언급URL : https://stackoverflow.com/questions/27459746/adding-space-padding-to-a-uilabel
'source' 카테고리의 다른 글
| Swift String의 문자를 대체할 수 있는 방법이 있나요? (0) | 2023.04.19 |
|---|---|
| 열 번호(예: 127)를 Excel 열(예: AA)로 변환하는 방법 (0) | 2023.04.19 |
| 2배 값을 소수점 이하 x 자리로 빠르게 반올림 (0) | 2023.04.19 |
| Flutter에서 배경 이미지를 설정하려면 어떻게 해야 합니까? (0) | 2023.04.19 |
| 블록 선언 구문 목록 (0) | 2023.04.19 |










