2010-10-25 6 views
28

La firma de este método es:iPhone - el parámetro de entrada al método sizeThatFits de UIView

- (CGSize)sizeThatFits:(CGSize)size 

No entiendo cuál es el parámetro de tamaño se utiliza para. El documentation de Apple indica que es "El tamaño actual del receptor".

Pero el receptor supuestamente sabe su tamaño actual. Entonces, ¿por qué necesita ser pasado?

Cuando paso experimentalmente en otros valores, el método parece utilizar el tamaño actual del receptor de todos modos.

¿Alguien puede explicarlo? ¿Y hay algún caso donde este parámetro importe?

Respuesta

26

En primer lugar, este método es el legado de AppKit (no en el sentido negativo de la palabra).

Sí, cualquier vista tiene un tamaño actual en cualquier momento dado y puede recuperarla desde la propiedad de límites. Pero hay situaciones complicadas durante el diseño cuando el mejor tamaño depende de factores no totalmente estáticos. Tome una etiqueta de texto, por ejemplo. Puede fluir en una o más líneas y el número de líneas puede depender del ancho máximo permitido. Entonces, una posible implementación de UILabel podría derivar su tamaño de límites del ancho del CGSize pasado a sizeThatFits :, en cuyo caso ese tamaño no es literalmente el tamaño actual del receptor, sino un tamaño deseado/límite.

Por lo tanto, cualquier subclase UIView puede implementar -sizeThatFits: como lo considere apropiado (juego de palabras), e incluso puede ignorar el parámetro de tamaño. Con más frecuencia, cuando tengo que implementar este método, lo ignoro porque puedo calcularlo desde el estado interno de la vista, pero en un escenario más complejo puede que necesite usar el parámetro de tamaño para indicarle ciertas restricciones en el diseño.

+1

En otras palabras, la documentación es incorrecta cuando dice que el argumento es el tamaño del receptor y, de hecho, es el tamaño que el padre preferiría que el niño usara. Ciertamente he escrito el código de esa manera, pero quiero confirmar si eso es lo que quieres decir. –

+2

Una cosa es cierta, la implementación predeterminada de 'sizeToFit' llama' sizeThatFits: ', pasando' self.bounds.size'. – Costique

+0

Oh, yo no sabía eso. Como no está documentado, definí saneSizeToFit en UIView a través de una categoría, que invoca sizeThatFits con un tamaño bien definido :) –

0

No es solo el tamaño del receptor el tamaño de tamaño potencial que desea llenar. El resultado es el tamaño que la vista cree que mostrará mejor su contenido para la entrada size dada.

El comportamiento predeterminado es simplemente devolver el parámetro size (es decir, el tamaño que se ajusta a la vista predeterminada es el tamaño que le da), así que sí, este parámetro es importante por defecto.

Las subclases podrían imponer restricciones como width==height u otras cosas similares con este método.

Cuestiones relacionadas