ios objective-c uilabel autolayout sizetofit

ios - ¿Cómo puedo agregar relleno al tamaño de contenido intrínseco de UILabel?



objective-c autolayout (4)

Puede crear una subclase UILabel y anular el contenido intrínseco,

-(CGSize)intrinsicContentSize { CGSize s = [super intrinsicContentSize]; s = CGSizeMake(s.width + 20, s.height); return s; }

Esto agregará un relleno de 20 puntos al ancho. Si quiere que su texto esté en el centro, asegúrese de establecer la alineación del texto en el centro.

Estoy usando el autolayout en iOS7 y tengo un problema como este:

Estoy colocando un UILabel en una UIView y estoy organizando mis restricciones de autodiseño para que el centro de la etiqueta X = centro de la vista principalX. No estoy dando ninguna restricción de ancho a la etiqueta. Cuando configuro el texto de la etiqueta en tiempo de ejecución, la etiqueta se dibuja lo suficientemente ancha para que el texto encaje, no hay márgenes / almohadillas en los lados izquierdo y derecho. Lo que quiero es tener algo relleno en los lados izquierdo y derecho, para que el texto no comience justo donde comienza la etiqueta. El truco para lograr esto podría ser configurar el texto como @ "texto", pero por supuesto que no es el camino a seguir :)

¿Cómo puedo lograr lo que quiero?


Puedes extender UILabel y anular el intrinsicContentSize por ti mismo. Asegúrese de haber configurado textAlignment = NSTextAlignmentCenter también.

-(CGSize)intrinsicContentSize{ CGSize contentSize = [super intrinsicContentSize]; return CGSizeMake(contentSize.width + 50, contentSize.height); }

Esto probablemente solo funcione cuando solo tiene una línea de texto para mostrar.


Si intenta darle a UILabel un color diferente al de su vista principal, deberá encerrar el UILabel en una UIView con el relleno y el color de fondo que desee. Si el color de fondo de UILabels es el mismo que el de su vista principal, entonces no entiendo el problema, solo use el diseño automático para especificar cuánto espacio desea en relación con el que está a su lado.


Si está utilizando el diseño automático, puede establecer las restricciones horizontales y usar un NSDictionary en el parámetro de metrics para configurar esto dinámicamente.

Por ejemplo, si desea dar un relleno de 10 pt al contenido interno de un UIButton , podría hacer algo como lo siguiente:

NSDictionary *padding = @{ @"padding" : @(button.intrinsicContentSize.width + 20) }; NSArray *buttonHConstraints = [NSLayoutConstraint constraintsWithVisualFormat:@"H:|[button(==padding)]|" options:0 metrics:padding views:NSDictionaryOfVariableBindings(button)];