2011-02-05 6 views
5

Estoy tratando de aplicar sangría al texto en un UILabel para dejar un margen alrededor del texto que muestra el color de fondo. Siguiendo la sugerencia here He anulado textRectForBounds:limitedToNumberOfLines: así:UILabel textRectForBounds no tiene ningún efecto al intentar crear el margen

- (CGRect)textRectForBounds:(CGRect)bounds limitedToNumberOfLines:(NSInteger)numberOfLines 
{ 
    CGRect intermediate = CGRectMake(bounds.origin.x+MARGIN,bounds.origin.y+MARGIN,bounds.size.width-2*MARGIN,bounds.size.height-2*MARGIN); 
    return [super textRectForBounds:intermediate limitedToNumberOfLines:numberOfLines]; 
} 

Pero no importa lo que haga, el texto termina apretada contra el borde izquierdo del rectángulo. Parece como si el dibujo estuviera ignorando la parte de origen del CGRect devuelto (aunque parece respetar la parte del ancho, como si redujera el ancho del intermedio a, por ejemplo, bounds.size.width-200, el rect que devuelve textRectForBounds es estrecho y el texto está dibujado en una columna larga y delgada).

Entonces, ¿qué más necesito hacer con el UILabel para hacer que el dibujo respete el origen textForRectBounds -returned-rect.x y origin.y? Prefiero no anular el UILabel de drawTextInRect si puedo evitarlo.

Actualización: Esto fue hace mucho tiempo y no recuerdo exactamente por qué la otra pregunta no funcionó para mí. Creo que fue porque estaba tratando de tener un UILabel con varias líneas, y la solución here no funcionó en ese caso.

+0

¿Has probado a devolver 'intermediate' directamente? –

+0

sí, pero no hace ninguna diferencia. – damian

Respuesta

8

creo que debe reemplazar tanto textRectForBounds:limitedToNumberOfLines: y drawTextInRect: así:

- (CGRect)textRectForBounds:(CGRect)bounds limitedToNumberOfLines:(NSInteger)numberOfLines 
{ 
    return CGRectInset(bounds, MARGIN, MARGIN); 
} 

- (void)drawTextInRect:(CGRect)rect 
{ 
    [super drawTextInRect: CGRectInset(self.bounds, MARGIN, MARGIN)]; 
} 
+0

Gracias, esto funcionó (más o menos): tuve que hacer algunos ajustes en el ancho recto para hacer que las cosas funcionen correctamente con varias líneas, pero lo conseguí trabajando al final. – damian

+0

Si hace esto (para hacer coincidir una UITextView), también puede reemplazar tamañoThatFits como este: - (CGSize) tamañoThatFits: (CGSize) tamaño { CGSize fSize = [super sizeThatFits: size]; fSize.width + = 2 * MARGEN; fSIze.height + = 2 * MARGEN; return fSize; } –

+1

No funciona para mí, todavía no se llama. –

0

Comprobar la documentación, que podría ser de alguna ayuda. las llamadas a super pueden no estar devolviendo los valores que asumes.

No debe llamar directamente a este método . Este método solo debe ser anulado por subclases que desean cambiar el rectángulo delimitador del receptor antes de realizar cualquier otro cálculo . Use el valor en el parámetro numberOfLines para limitar la altura del rectángulo devuelto a el número especificado de líneas de texto. Para llamar a este método, debe ser una llamada previa al método sizeToFit o sizeThatFits :. Tenga en cuenta que etiquetas en los objetos UITableViewCell son tamaño en función de las dimensiones de la celda, y no un tamaño solicitado La implementación por defecto de este método devuelve los originales límites rectángulo.

¡Buena suerte!

+0

En realidad, la documentación es incorrecta con 'limitedToNumberOfLines: 0'. El pasado en 'bounds' tiene un' height' que se parece a 'INT_MAX_VALUE' o algo así, y la implementación predeterminada parece reducirlo a un rect lo suficientemente alto para ajustarse al texto. – damian

Cuestiones relacionadas