UILabel文字边距

Ljd*_*son 307 cocoa-touch uikit uilabel ios

我正在设置a的左边插入/边距,UILabel但找不到这样做的方法.标签有一个背景设置,所以只是改变它的起源不会有效.10px左手边左右插入文本是理想的.

Tom*_*ert 443

我通过子类化UILabel和覆盖解决了这个问题drawTextInRect::

- (void)drawTextInRect:(CGRect)rect {
    UIEdgeInsets insets = {0, 5, 0, 5};
    [super drawTextInRect:UIEdgeInsetsInsetRect(rect, insets)];
}
Run Code Online (Sandbox Code Playgroud)

相当于Swift 3.1:

override func drawText(in rect: CGRect) {
    let insets = UIEdgeInsets.init(top: 0, left: 5, bottom: 0, right: 5)
    super.drawText(in: UIEdgeInsetsInsetRect(rect, insets))
}
Run Code Online (Sandbox Code Playgroud)

正如你可能已经聚集的那样,这是对tc.答案的改编.它有两个优点:

  1. 没有必要通过发送sizeToFit消息来触发它
  2. 它会单独留下标签框 - 如果您的标签有背景并且您不希望它缩小,则很方便

  • 您还应该覆盖`intrinsicContentSize`,以便它适用于自动布局.我已将其添加到[@Brody's](http://stackoverflow.com/a/17557490/1693173)答案的示例代码中. (20认同)
  • 您可能想查看[此答案](http://stackoverflow.com/a/21267507/104790),它正确处理sizeToFit和自动布局. (14认同)
  • 我不明白这个答案怎么能得到这么多的赞成?!这种方法很可能会导致很多关于lineBreakingMode和省略号放置的问题.字符串的计算所需大小不等于绘制它的大小,或者我错了? (10认同)
  • 这里"回归"的意义何在? (2认同)
  • 如果要在输入文本时使用插入,则还需要子类化`editingRectForBounds:`. (2认同)

bly*_*roi 142

对于多行文本,可以使用NSAttributedString设置左边距和右边距.

NSMutableParagraphStyle *style =  [[NSParagraphStyle defaultParagraphStyle] mutableCopy];
style.alignment = NSTextAlignmentJustified;
style.firstLineHeadIndent = 10.0f;
style.headIndent = 10.0f;
style.tailIndent = -10.0f;   

NSAttributedString *attrText = [[NSAttributedString alloc] initWithString:title attributes:@{ NSParagraphStyleAttributeName : style}];  

UILabel * label = [[UILabel alloc] initWithFrame:someFrame];
label.numberOfLines = 0;
label.attributedText = attrText;
Run Code Online (Sandbox Code Playgroud)

  • style.tailIndent应设置为-10.0f (4认同)
  • 不能在IB中添加tailIndent = -10,只允许正值:/ (3认同)
  • 也需要一个顶部和底部的解决方案。 (2认同)

Bro*_*son 86

向UILabel添加填充的最佳方法是继承UILabel并添加edgeInsets属性.然后,您可以设置所需的插图,并相应地绘制标签.

OSLabel.h

#import <UIKit/UIKit.h>

@interface OSLabel : UILabel

@property (nonatomic, assign) UIEdgeInsets edgeInsets;

@end
Run Code Online (Sandbox Code Playgroud)

OSLabel.m

#import "OSLabel.h"

@implementation OSLabel

- (id)initWithFrame:(CGRect)frame{
    self = [super initWithFrame:frame];
    if (self) {
        self.edgeInsets = UIEdgeInsetsMake(0, 0, 0, 0);
    }
    return self;
}

- (void)drawTextInRect:(CGRect)rect {
    [super drawTextInRect:UIEdgeInsetsInsetRect(rect, self.edgeInsets)];
}

- (CGSize)intrinsicContentSize
{
    CGSize size = [super intrinsicContentSize];
    size.width  += self.edgeInsets.left + self.edgeInsets.right;
    size.height += self.edgeInsets.top + self.edgeInsets.bottom;
    return size;
}

@end
Run Code Online (Sandbox Code Playgroud)

  • 或者使用TTTAttributedLabel(https://github.com/mattt/TTTAttributedLabel) (6认同)
  • 这个解决方案存在一个问题 - 如果文本足够长并且插图足够大,标签文本的最后一行将被截断.刚尝试使用最新的iOS 7. (5认同)
  • 您还应该覆盖`intrinsicContentSize`以增加内在大小以包含insets,以便自动布局正常工作. (5认同)
  • 如果我设置`numberOfLines = 0`它会截断我的文本:( (3认同)
  • @AsifBilal 您还需要覆盖 `textRectForBounds:` 方法。 (2认同)

Pet*_*ese 70

对于这样一个简单的案例,子类化有点麻烦.另一种方法是简单地将没有背景设置的UILabel添加到具有背景设置的UIView.将标签的x设置为10,使外部视图的大小比标签宽20个像素.

  • *咳嗽*外部视图需要比标签宽_20_点.每边10个. (7认同)
  • 虽然子类化会创建一个可重用的组件,但这种方法确实节省了我的时间.谢谢你,彼得 (2认同)

Yar*_*sim 45

我最后只是在文本中添加了一些空格:

self.titleLabel.text = [NSString stringWithFormat:@"    %@", self.titleLabel.text];
Run Code Online (Sandbox Code Playgroud)

丑陋但有效,不需要子类化.

你也可以尝试"\ t".对于通用解决方案,请参阅接受的答案

  • 你觉得这对多线标签很有用:( (3认同)
  • 间距取决于字体。我发现这是一个肮脏的骇客。 (2认同)

Ima*_*tit 45

使用Swift 3,您可以通过创建子类来获得所需的效果UILabel.在此子类中,您必须添加UIEdgeInsets具有所需insets和override drawText(in:)方法的intrinsicContentSize属性,属性(对于Auto布局代码)和/或sizeThatFits(_:)方法(对于Springs&Struts代码).

import UIKit

class PaddingLabel: UILabel {

    let padding: UIEdgeInsets

    // Create a new PaddingLabel instance programamtically with the desired insets
    required init(padding: UIEdgeInsets = UIEdgeInsets(top: 0, left: 10, bottom: 0, right: 10)) {
        self.padding = padding
        super.init(frame: CGRect.zero)
    }

    // Create a new PaddingLabel instance programamtically with default insets
    override init(frame: CGRect) {
        padding = UIEdgeInsets.zero // set desired insets value according to your needs
        super.init(frame: frame)
    }

    // Create a new PaddingLabel instance from Storyboard with default insets
    required init?(coder aDecoder: NSCoder) {
        padding = UIEdgeInsets.zero // set desired insets value according to your needs
        super.init(coder: aDecoder)
    }

    override func drawText(in rect: CGRect) {
        super.drawText(in: UIEdgeInsetsInsetRect(rect, padding))
    }

    // Override `intrinsicContentSize` property for Auto layout code
    override var intrinsicContentSize: CGSize {
        let superContentSize = super.intrinsicContentSize
        let width = superContentSize.width + padding.left + padding.right
        let heigth = superContentSize.height + padding.top + padding.bottom
        return CGSize(width: width, height: heigth)
    }

    // Override `sizeThatFits(_:)` method for Springs & Struts code
    override func sizeThatFits(_ size: CGSize) -> CGSize {
        let superSizeThatFits = super.sizeThatFits(size)
        let width = superSizeThatFits.width + padding.left + padding.right
        let heigth = superSizeThatFits.height + padding.top + padding.bottom
        return CGSize(width: width, height: heigth)
    }

}
Run Code Online (Sandbox Code Playgroud)

以下示例显示如何在以下位置使用PaddingLabel实例UIViewController:

import UIKit

class ViewController: UIViewController {

    @IBOutlet weak var storyboardAutoLayoutLabel: PaddingLabel!
    let autoLayoutLabel = PaddingLabel(padding: UIEdgeInsets(top: 20, left: 40, bottom: 20, right: 40))
    let springsAndStructsLabel = PaddingLabel(frame: CGRect.zero)
    var textToDisplay = "Lorem ipsum dolor sit er elit lamet."

    override func viewDidLoad() {
        super.viewDidLoad()

        // Set autoLayoutLabel
        autoLayoutLabel.text = textToDisplay
        autoLayoutLabel.backgroundColor = .red
        autoLayoutLabel.translatesAutoresizingMaskIntoConstraints = false
        view.addSubview(autoLayoutLabel)
        autoLayoutLabel.leadingAnchor.constraint(equalTo: view.leadingAnchor, constant: 30).isActive = true
        autoLayoutLabel.centerYAnchor.constraint(equalTo: view.centerYAnchor).isActive = true

        // Set springsAndStructsLabel
        springsAndStructsLabel.text = textToDisplay
        springsAndStructsLabel.backgroundColor = .green
        view.addSubview(springsAndStructsLabel)
        springsAndStructsLabel.frame.origin = CGPoint(x: 30, y: 90)
        springsAndStructsLabel.sizeToFit()

        // Set storyboardAutoLayoutLabel
        storyboardAutoLayoutLabel.text = textToDisplay
        storyboardAutoLayoutLabel.backgroundColor = .blue
    }

    // Link this IBAction to a UIButton or a UIBarButtonItem in Storyboard
    @IBAction func updateLabelText(_ sender: Any) {
        textToDisplay = textToDisplay == "Lorem ipsum dolor sit er elit lamet." ? "Lorem ipsum." : "Lorem ipsum dolor sit er elit lamet."

        // autoLayoutLabel
        autoLayoutLabel.text = textToDisplay

        // springsAndStructsLabel
        springsAndStructsLabel.text = textToDisplay
        springsAndStructsLabel.sizeToFit()

        // storyboardAutoLayoutLabel
        storyboardAutoLayoutLabel.text = textToDisplay
    }

}
Run Code Online (Sandbox Code Playgroud)


fun*_*ct7 37

Swift版本的Recycled Steel的回答+ intrinsizeContentSize().

它支持更传统的设置插图的插图,其他视图对象具有插入,同时能够在Interface Builder中设置插入,即插件设置如此编程:

label.inset = UIEdgeInsetsMake(0, 0, 5, 0)
Run Code Online (Sandbox Code Playgroud)

如果有任何错误,请告诉我.

斯威夫特3

@IBDesignable class InsetLabel: UILabel {
    @IBInspectable var topInset: CGFloat = 0.0
    @IBInspectable var leftInset: CGFloat = 0.0
    @IBInspectable var bottomInset: CGFloat = 0.0
    @IBInspectable var rightInset: CGFloat = 0.0

    var insets: UIEdgeInsets {
        get {
            return UIEdgeInsetsMake(topInset, leftInset, bottomInset, rightInset)
        }
        set {
            topInset = newValue.top
            leftInset = newValue.left
            bottomInset = newValue.bottom
            rightInset = newValue.right
        }
    }

    override func drawText(in rect: CGRect) {
        super.drawText(in: UIEdgeInsetsInsetRect(rect, insets))
    }

    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 {
        var contentSize = super.intrinsicContentSize
        contentSize.width += leftInset + rightInset
        contentSize.height += topInset + bottomInset

        return contentSize
    }
}
Run Code Online (Sandbox Code Playgroud)

Swift 2.2

@IBDesignable class InsetLabel: UILabel {
    @IBInspectable var topInset: CGFloat = 0.0
    @IBInspectable var leftInset: CGFloat = 0.0
    @IBInspectable var bottomInset: CGFloat = 0.0
    @IBInspectable var rightInset: CGFloat = 0.0

    var insets: UIEdgeInsets {
        get {
            return UIEdgeInsetsMake(topInset, leftInset, bottomInset, rightInset)
        }
        set {
            topInset = newValue.top
            leftInset = newValue.left
            bottomInset = newValue.bottom
            rightInset = newValue.right
        }
    }

    override func drawTextInRect(rect: CGRect) {
        super.drawTextInRect(UIEdgeInsetsInsetRect(rect, insets))
    }

    override func sizeThatFits(size: CGSize) -> CGSize {
        var adjSize = super.sizeThatFits(size)
        adjSize.width += leftInset + rightInset
        adjSize.height += topInset + bottomInset

        return adjSize
    }

    override func intrinsicContentSize() -> CGSize {
        var contentSize = super.intrinsicContentSize()
        contentSize.width += leftInset + rightInset
        contentSize.height += topInset + bottomInset

        return contentSize
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 我建议将`invalidateIntrinsicContentSize()`和`setNeedsDisplay()`添加到`insets` setter. (2认同)

nev*_*asy 29

您也可以通过使用自定义框架初始化UILabel来解决此问题.

    CGRect initialFrame = CGRectMake(0, 0, 100, 100);
    UIEdgeInsets contentInsets = UIEdgeInsetsMake(0, 10, 0, 0);
    CGRect paddedFrame = UIEdgeInsetsInsetRect(initialFrame, contentInsets);

    self.label = [[UILabel alloc] initWithFrame:paddedFrame];
Run Code Online (Sandbox Code Playgroud)

点头CGRect技巧.

  • 是的,但如果标签有背景,这是没用的 (13认同)

Mil*_*ith 17

对于Xamarin用户(使用Unified API):

class UIMarginLabel : UILabel
{
    public UIMarginLabel()
    {
    }

    public UIMarginLabel( CGRect frame ) : base( frame )
    {
    }

    public UIEdgeInsets Insets { get; set; }

    public override void DrawText( CGRect rect )
    {
        base.DrawText( Insets.InsetRect( rect ) );
    }
}
Run Code Online (Sandbox Code Playgroud)

对于使用原始MonoTouch API的用户:

public class UIMarginLabel : UILabel
{
    public UIEdgeInsets Insets { get; set; }

    public UIMarginLabel() : base()
    {
        Insets = new UIEdgeInsets(0, 0, 0, 0);
    }
    public UIMarginLabel(RectangleF frame) : base(frame)
    {
        Insets = new UIEdgeInsets(0, 0, 0, 0);
    }

    public override void DrawText(RectangleF frame)
    {
        base.DrawText(new RectangleF(
            frame.X + Insets.Left,
            frame.Y + Insets.Top,
            frame.Width - Insets.Left - Insets.Right,
            frame.Height - Insets.Top - Insets.Bottom));
    }
}
Run Code Online (Sandbox Code Playgroud)


Ars*_*nik 16

以及使其与Interface Builder一起使用的@IBDesignable

斯威夫特4

//
//  PaddedLabel.swift
//  TrainCentric
//
//  Created by Arsonik
//  https://stackoverflow.com/a/33244365/337934
//

import UIKit

@IBDesignable
class PaddedLabel: UILabel {

    @IBInspectable var inset:CGSize = CGSize(width: 0, height: 0)

    var padding: UIEdgeInsets {
        var hasText:Bool = false
        if let t = self.text?.count, t > 0 {
            hasText = true
        }
        else if let t = attributedText?.length, t > 0 {
            hasText = true
        }

        return hasText ? UIEdgeInsets(top: inset.height, left: inset.width, bottom: inset.height, right: inset.width) : UIEdgeInsets(top: 0, left: 0, bottom: 0, right: 0)
    }

    override func drawText(in rect: CGRect) {
        super.drawText(in: rect.inset(by: padding))
    }

    override var intrinsicContentSize: CGSize {
        let superContentSize = super.intrinsicContentSize
        let p = padding
        let width = superContentSize.width + p.left + p.right
        let heigth = superContentSize.height + p.top + p.bottom
        return CGSize(width: width, height: heigth)
    }

    override func sizeThatFits(_ size: CGSize) -> CGSize {
        let superSizeThatFits = super.sizeThatFits(size)
        let p = padding
        let width = superSizeThatFits.width + p.left + p.right
        let heigth = superSizeThatFits.height + p.top + p.bottom
        return CGSize(width: width, height: heigth)
    }
}
Run Code Online (Sandbox Code Playgroud)

斯威夫特2

@IBDesignable
class PaddedLabel: UILabel {

    @IBInspectable var inset:CGSize = CGSize(width: 0, height: 0)

    var padding: UIEdgeInsets {
        var hasText:Bool = false
        if let t = text?.length where t > 0 {
            hasText = true
        }
        else if let t = attributedText?.length where t > 0 {
            hasText = true
        }

        return hasText ? UIEdgeInsets(top: inset.height, left: inset.width, bottom: inset.height, right: inset.width) : UIEdgeInsets(top: 0, left: 0, bottom: 0, right: 0)
    }

    override func drawTextInRect(rect: CGRect) {
        super.drawTextInRect(UIEdgeInsetsInsetRect(rect, padding))
    }

    override func intrinsicContentSize() -> CGSize {
        let superContentSize = super.intrinsicContentSize()
        let p = padding
        let width = superContentSize.width + p.left + p.right
        let heigth = superContentSize.height + p.top + p.bottom
        return CGSize(width: width, height: heigth)
    }

    override func sizeThatFits(size: CGSize) -> CGSize {
        let superSizeThatFits = super.sizeThatFits(size)
        let p = padding
        let width = superSizeThatFits.width + p.left + p.right
        let heigth = superSizeThatFits.height + p.top + p.bottom
        return CGSize(width: width, height: heigth)
    }
}
Run Code Online (Sandbox Code Playgroud)


Rec*_*eel 12

要扩展Brody Robertson提供的答案,您可以添加IB Designable位.这意味着您可以在Storyboard中调整标签.

在此输入图像描述

在您的子类UILabel中

#import <UIKit/UIKit.h>

IB_DESIGNABLE

@interface insetLabel : UILabel

@property (nonatomic, assign) IBInspectable CGFloat leftEdge;
@property (nonatomic, assign) IBInspectable CGFloat rightEdge;
@property (nonatomic, assign) IBInspectable CGFloat topEdge;
@property (nonatomic, assign) IBInspectable CGFloat bottomEdge;

@property (nonatomic, assign) UIEdgeInsets edgeInsets;

@end
Run Code Online (Sandbox Code Playgroud)

然后做;

#import "insetLabel.h"

@implementation insetLabel

- (id)initWithFrame:(CGRect)frame
{
    self = [super initWithFrame:frame];
    if (self)
    {
        self.edgeInsets = UIEdgeInsetsMake(self.topEdge, self.leftEdge, self.bottomEdge, self.rightEdge);
    }
    return self;
}

- (void)drawTextInRect:(CGRect)rect
{
    self.edgeInsets = UIEdgeInsetsMake(self.topEdge, self.leftEdge, self.bottomEdge, self.rightEdge);

    [super drawTextInRect:UIEdgeInsetsInsetRect(rect, self.edgeInsets)];
}

- (CGSize)intrinsicContentSize
{
    CGSize size = [super intrinsicContentSize];
    size.width  += self.edgeInsets.left + self.edgeInsets.right;
    size.height += self.edgeInsets.top + self.edgeInsets.bottom;
    return size;
}

@end
Run Code Online (Sandbox Code Playgroud)

编辑

您应该为edgeInsets添加setter方法.


tc.*_*tc. 10

如果您不想使用额外的父视图来设置背景,则可以继承UILabel并覆盖textRectForBounds:limitedToNumberOfLines:.我将添加一个textEdgeInsets属性或类似的属性然后执行

- (CGRect)textRectForBounds:(CGRect)bounds limitedToNumberOfLines:(NSInteger)numberOfLines
{
  return [super textRectForBounds:UIEdgeInsetsInsetRect(bounds,textEdgeInsets) limitedToNumberOfLines:numberOfLines];
}
Run Code Online (Sandbox Code Playgroud)

为了健壮,您可能还想在setTextEdgeInsets:中调用[self setNeedsDisplay],但我通常不会打扰.

  • @mvds:没关系:`textRectForBounds:limitedToNumberOfLines:`正在被调用,所以这取决于是谁调用它来确保先前调用`-sizeToFit` /`-sizeThatFits:`. (2认同)

val*_*ine 10

也许以后的派对,但以下只是有效.只是UILabel的子类.

#import "UITagLabel.h"

#define padding UIEdgeInsetsMake(5, 10, 5, 10)

@implementation UITagLabel

- (void)drawTextInRect:(CGRect)rect {
    [super drawTextInRect:UIEdgeInsetsInsetRect(rect, padding)];
}

- (CGSize) intrinsicContentSize {
    CGSize superContentSize = [super intrinsicContentSize];
    CGFloat width = superContentSize.width + padding.left + padding.right;
    CGFloat height = superContentSize.height + padding.top + padding.bottom;
    return CGSizeMake(width, height);
}

- (CGSize) sizeThatFits:(CGSize)size {
    CGSize superSizeThatFits = [super sizeThatFits:size];
    CGFloat width = superSizeThatFits.width + padding.left + padding.right;
    CGFloat height = superSizeThatFits.height + padding.top + padding.bottom;
    return CGSizeMake(width, height);
}

@end
Run Code Online (Sandbox Code Playgroud)


sig*_*sig 8

我没有找到在UIButton上面的答案中使用的建议。所以我会努力证明这是一个不错的选择。

button.contentEdgeInsets = UIEdgeInsets(top: 0, left: 8, bottom: 0, right: 8)

在我的情况下使用UIButton是最好的解决方案,因为:

  • 我有一个简单的单行文本
  • 我不想UIView用作容器UILabel(即我想简化单元格中自动布局的数学计算)
  • 我不想使用NSParagraphStyle(因为自动tailIndent布局工作不正确 - 宽度UILabel小于预期)
  • 我不想使用UITextView(因为可能有副作用)
  • 我不想子类化UILabel(更少的代码更少的错误)

这就是为什么在我的情况下使用contentEdgeInsetsfrom成为添加文本边距的最简单方法的原因。UIButton

希望这会帮助某人。


rsc*_*rsc 7

这是一个快速的解决方案.只需在文件底部添加此自定义类(或为其创建新文件),并在创建标签时使用MyLabel而不是UILabel.

class MyLabel: UILabel{
    override func drawTextInRect(rect: CGRect) {
        super.drawTextInRect(UIEdgeInsetsInsetRect(rect, UIEdgeInsets(top: 0, left: 10, bottom: 0, right: 0)))
    }
}
Run Code Online (Sandbox Code Playgroud)


Abd*_*nan 7

blyabtroi 的 asnwer 在 Swift 中转换(不需要子类化)

let style: NSMutableParagraphStyle = NSParagraphStyle.defaultParagraphStyle().mutableCopy() as! NSMutableParagraphStyle
style.alignment = .Justified
style.firstLineHeadIndent = 10.0
style.headIndent = 10.0
style.tailIndent = -10.0
let attrText: NSAttributedString = NSAttributedString(string: title, attributes: [NSParagraphStyleAttributeName:style])
let label: UILabel = UILabel(frame: someFrame)
label.numberOfLines = 0
label.attributedText = attrText
Run Code Online (Sandbox Code Playgroud)


小智 7

Swift 4 版本的blyabtroi解决方案

let leadingMargin: CGFloat = 10
let trailingMargin: CGFloat = 10

let style = NSMutableParagraphStyle()
style.alignment = .justified
style.firstLineHeadIndent = leadingMargin
style.headIndent = leadingMargin
style.tailIndent = trailingMargin

label.attributedText = NSAttributedString(string: "Label with margins", 
                                          attributes: [NSAttributedStringKey.paragraphStyle: style])
Run Code Online (Sandbox Code Playgroud)


Ian*_*ell 6

如果您在iOS 6+中使用autolayout,则可以通过调整intrinsicContentSize子类中的autolayout来实现UILabel.

- (id)initWithFrame:(CGRect)frame
{
    self = [super initWithFrame:frame];
    if (self) {
        self.textAlignment = NSTextAlignmentRight;
    }
    return self;
}

- (CGSize)intrinsicContentSize 
{
    CGSize size = [super intrinsicContentSize];
    return CGSizeMake(size.width + 10.0, size.height);
}
Run Code Online (Sandbox Code Playgroud)


neo*_*eye 5

可能使用https://github.com/mattt/TTTAttributedLabel而不是UILabel

BITAttributedLabel *label = [BITAttributedLabel new];
label.font = font;
label.text = @"hello";
label.textInsets = UIEdgeInsetsMake(10, 10, 10, 10);
[label sizeToFit];
Run Code Online (Sandbox Code Playgroud)


And*_*gan 5

在Swift中它解决了这样的问题.

class Label: UILabel {
    override func drawTextInRect(rect: CGRect) {
        super.drawTextInRect(UIEdgeInsetsInsetRect(rect, UIEdgeInsets(top: 0, left: 10, bottom: 0, right: 10)))
    }
}
Run Code Online (Sandbox Code Playgroud)


fhu*_*cho 5

这适用于多行标签:

class PaddedLabel: UILabel {
    var verticalPadding: CGFloat = 0
    var horizontalPadding: CGFloat = 0

    override func drawText(in rect: CGRect) {
        let insets = UIEdgeInsets(top: verticalPadding, left: horizontalPadding, bottom: verticalPadding, right: horizontalPadding)
        super.drawText(in: UIEdgeInsetsInsetRect(rect, insets))
    }

    override var intrinsicContentSize: CGSize {
        get {
            let textWidth = super.intrinsicContentSize.width - horizontalPadding * 2
            let textHeight = sizeThatFits(CGSize(width: textWidth, height: .greatestFiniteMagnitude)).height
            let width = textWidth + horizontalPadding * 2
            let height = textHeight + verticalPadding * 2
            return CGSize(width: frame.width, height: height)
        }
    }
}
Run Code Online (Sandbox Code Playgroud)