Margen de texto UILabel

Estoy buscando establecer el recuadro / margen izquierdo de un UILabel y no puedo encontrar un método para hacerlo. La etiqueta tiene un fondo establecido por lo que simplemente cambiar su origen no servirá. Sería ideal para insertar el texto por 10px o menos en el lado izquierdo.

Lo resolví subclasificando UILabel y reemplazando drawTextInRect: así:

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

equivalente en 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)) } 

Como podría haber recogido, esta es una adaptación de la respuesta de tc . Tiene dos ventajas sobre eso:

  1. no hay necesidad de activarlo enviando un mensaje sizeToFit
  2. deja el marco de etiqueta solo, útil si la etiqueta tiene un fondo y no desea que se encoja

Para el texto de líneas múltiples, el margen izquierdo y el derecho se pueden configurar mediante 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; 

El mejor enfoque para agregar relleno a un UILabel es subclase UILabel y agregar una propiedad edgeInsets. A continuación, establece las inserciones deseadas y la etiqueta se dibujará en consecuencia.

OSLabel.h

 #import  @interface OSLabel : UILabel @property (nonatomic, assign) UIEdgeInsets edgeInsets; @end 

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 

Subclases es un poco engorroso para un caso tan simple. Una alternativa es simplemente agregar el UILabel sin fondo establecido en una UIView con el fondo configurado. Establezca la etiqueta x a 10 y haga que el tamaño de la vista exterior sea 10 píxeles más ancho que la etiqueta.

Terminé agregando algunos espacios al texto:

 self.titleLabel.text = [NSString stringWithFormat:@" %@", self.titleLabel.text]; 

Feo pero efectivo, y no se requieren subclases.

Puedes probar “\ t” también. Para una solución genérica, consulte la respuesta aceptada

Con Swift 3, puede tener el efecto deseado al crear una subclase de UILabel . En esta subclase, deberá agregar una propiedad UIEdgeInsets con las inserciones requeridas y anular el drawText(in:) , la propiedad intrinsicContentSize (para el código de diseño automático) y / o el sizeThatFits(_:) (para el código Springs & Struts).

 import UIKit class PaddingLabel: UILabel { let padding: UIEdgeInsets // Create a new PaddingLabel instance progtwigmtically 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 progtwigmtically 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) } } 

El siguiente ejemplo muestra cómo usar PaddingLabel instancias de PaddingLabel en un 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 } } 

También puede resolver esto inicializando su UILabel con un marco personalizado.

  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]; 

Nod to CGRect Tricks .

Versión rápida de la respuesta de Recycled Steel + intrinsizeContentSize() .

Admite un estilo más tradicional de configuración de inserciones para otros objetos de visualización con inserciones, mientras que puede establecer inserciones en el Creador de interfaces, es decir, las inserciones se configuran de forma programática:

 label.inset = UIEdgeInsetsMake(0, 0, 5, 0) 

Por favor, avíseme si hay algún error.

Swift 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 } } 

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 } } 

Para usuarios de Xamarin (usando la API Unificada):

 class UIMarginLabel : UILabel { public UIMarginLabel() { } public UIMarginLabel( RectangleF frame ) : base( frame ) { } public UIEdgeInsets Insets { get; set; } public override void DrawText( CGRect rect ) { base.DrawText( Insets.InsetRect( rect ) ); } } 

Y para aquellos que usan la API MonoTouch original:

 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)); } } 

Para ampliar la respuesta proporcionada por Brody Robertson, puede agregar los bits designados IB. Esto significa que puede ajustar la etiqueta desde Storyboard.

enter image description here

En su subclase UILabel hacer

 #import  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 

Entonces hazlo;

 #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 

EDITAR

Probablemente deberías agregar un método setter para edgeInsets.

y un @IBDesignable que lo hace funcionar con Interface Builder

 @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) } } 

Si no desea utilizar una vista principal adicional para establecer el fondo, puede subclase UILabel y anular textRectForBounds:limitedToNumberOfLines: Agregaría una propiedad textEdgeInsets o similar y luego haré

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

Para mayor robustez, es posible que también desee llamar a [self setNeedsDisplay] en setTextEdgeInsets :, pero normalmente no me molesto.

Tal vez más tarde para la fiesta, pero lo siguiente simplemente funciona. Solo la subclase 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 

Si está utilizando el autolayout en iOS 6+, puede hacerlo ajustando el intrinsicContentSize en una subclase de 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); } 

Aquí hay una solución rápida. Simplemente agregue esta clase personalizada en la parte inferior de su archivo (o cree un nuevo archivo para ella) y use MyLabel en lugar de UILabel al crear su etiqueta.

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

En lugar de UILabel quizás use https://github.com/mattt/TTTAttributedLabel

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

En Swift lo resuelve así.

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

A muchas de las respuestas les falta la anulación de sizeThatFits. Con esta subclase puede simplemente crear la etiqueta, establecer el relleno y luego decir label.SizeToFit () y voila.

 import UIKit class UILabelEx : UILabel { var padding : UIEdgeInsets = UIEdgeInsets(top: 0, left: 0, bottom: 0, right: 0) override func drawTextInRect(rect: CGRect) { super.drawTextInRect(UIEdgeInsetsInsetRect(rect, padding)) } override func sizeThatFits(size: CGSize) -> CGSize { var adjSize = super.sizeThatFits(size) adjSize.width += padding.left + padding.right adjSize.height += padding.top + padding.bottom return adjSize } } 

El asnwer de blyabtroi convertido en Swift (no se requieren subclases)

 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 

Xcode 6.1.1 solución Swift utilizando una extensión.

El nombre del archivo podría ser algo así como “UILabel + AddInsetMargin.swift”:

 import UIKit extension UILabel { public override func drawRect(rect: CGRect) { self.drawTextInRect(UIEdgeInsetsInsetRect(rect, UIEdgeInsets(top: 0, left: 5, bottom: 0, right: 5))) } } 

sin subclases y todo ese jazz … lo hice de forma dinámica:

 [cell.textLabel setTranslatesAutoresizingMaskIntoConstraints:NO]; [cell.textLabel constraintTrailingEqualTo:cell.contentView constant:-100]; 

la parte de restricción es simplemente un envoltorio de azúcar de código simple (tenemos los mismos métodos para agregar un relleno de arriba / abajo / izquierda / derecha). Abriré la fuente todo el envoltorio si obtengo suficiente amor aquí:

 - (id)constraintTrailingEqualTo:(UIView *)toView constant:(CGFloat)constant { NSLayoutConstraint *cn = [NSLayoutConstraint constraintWithItem:self attribute:NSLayoutAttributeTrailing relatedBy:NSLayoutRelationEqual toItem:toView attribute:NSLayoutAttributeTrailing multiplier:1 constant:constant]; [toView addConstraint:cn]; return self; } 

(nota que hice esto en el contexto de

 - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath: (NSIndexPath *)indexPath; 

es posible que deba llamar a [self setNeedsLayout]; dependiendo de tu contexto

 #import "E_LabelWithPadding.h" #define padding UIEdgeInsetsMake(2, 0, 2, 0) #define padding1 UIEdgeInsetsMake(0, 0, 0, 0) @implementation E_LabelWithPadding - (void)drawTextInRect:(CGRect)rect { if (![self.text isEqualToString:@""]) { [super drawTextInRect:UIEdgeInsetsInsetRect(rect, padding)]; }else { [super drawTextInRect:UIEdgeInsetsInsetRect(rect, padding1)]; } 

}

 - (CGSize) intrinsicContentSize { if (![self.text isEqualToString:@""]) { CGSize superContentSize = [super intrinsicContentSize]; CGFloat width = superContentSize.width + padding.left + padding.right; CGFloat height = superContentSize.height + padding.top + padding.bottom; return CGSizeMake(width, height); }else { CGSize superContentSize = [super intrinsicContentSize]; CGFloat width = superContentSize.width + padding1.left + padding1.right; CGFloat height = superContentSize.height + padding1.top + padding1.bottom; return CGSizeMake(width, height); } 

}

 - (CGSize) sizeThatFits:(CGSize)size { if (![self.text isEqualToString:@""]) { 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); }else { CGSize superSizeThatFits = [super sizeThatFits:size]; CGFloat width = superSizeThatFits.width + padding1.left + padding1.right; CGFloat height = superSizeThatFits.height + padding1.top + padding1.bottom; return CGSizeMake(width, height); } 

}

 @end 

Solo agregue espacios a la izquierda si es una sola línea , más de 1 línea tendrá 0 relleno nuevamente.

 [self.myLabel setText:[NSString stringWithFormat:@" %@", self.myShortString]]; 

Versión compatible con Swift 3 y AutoLayout :

 class InsetLabel: UILabel { var insets = UIEdgeInsets() convenience init(insets: UIEdgeInsets) { self.init(frame: CGRect.zero) self.insets = insets } convenience init(dx: CGFloat, dy: CGFloat) { let insets = UIEdgeInsets(top: dy, left: dx, bottom: dy, right: dx) self.init(insets: insets) } override func drawText(in rect: CGRect) { super.drawText(in: UIEdgeInsetsInsetRect(rect, insets)) } override var intrinsicContentSize: CGSize { var size = super.intrinsicContentSize size.width += insets.left + insets.right size.height += insets.top + insets.bottom return size } } 

Esto funciona correctamente con tags de varias líneas:

 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) } } } 

Creo que la clase UILabel no tiene un método para establecer el margen. ¿Por qué no configura la posición de la Etiqueta en el lugar requerido?

Vea el siguiente código:

 UILabel *label = [[UILabel alloc] init]; label.text = @"This is label"; label.frame = CGRectMake(0,0,100,100); 

si desde el constructor de interfaz, simplemente coloque la etiqueta de la siguiente manera:

 yourLabel.frame = CGRectMake(0,0,100,100); 

Para deshacerse del relleno vertical de una etiqueta de una sola línea, lo hice:

 // I have a category method setFrameHeight; you'll likely need to modify the frame. [label setFrameHeight:font.pointSize]; 

O, sin la categoría, use:

 CGRect frame = label.frame; frame.size.height = font.pointSize; label.frame = frame; 

Tal vez podrías probar este código

 CGRect frame = btn.titleLabel.frame; int indent = 20; int inset = 20; [btn.titleLabel setFrame:CGRectMake(frame.origin.x+inset,frame.origin.y,frame.size.width+indent,frame.size.height)]; 

Muchas de estas respuestas son complicadas. En algunos casos, eso es necesario. Sin embargo, si estás leyendo esto, tu etiqueta no tiene margen izquierdo / derecho, y solo quieres un pequeño relleno, esta es la solución completa:

Paso 1: agregue espacios al final (literalmente, presione la barra espaciadora varias veces)

Paso 2: establece la alineación del texto de la etiqueta en centrado

Hecho

Si la etiqueta se crea mediante progtwigción, el relleno se puede calcular con el método sizeThatFits. Si usa más de una línea, el texto se romperá en línea con el valor de ancho máximo.

 let text = UILabel() let padding = 10 text.layer.cornerRadius = 5 text.layer.masksToBounds = true text.text = "Hello" text.font = UIFont(name: text.font.fontName, size: 18) text.textAlignment = NSTextAlignment.center text.numberOfLines = 1 let maxSize = CGSize(width: 100, height: 100) var size = text.sizeThatFits(maxSize) size.width = size.width + padding * 2 size.height = size.height + padding * 2 text.frame = CGRect(origin: CGPoint(x: 0, y: 0), size: size)