¿Cómo se usa layout IfNeeded?

¿Cuándo y cómo se usa layoutIfNeeded ? Sé que cuando cambiamos el diseño de una vista, podemos llamar a setNeedsLayout para actualizar el diseño, pero no layoutIfNeeded seguros de cuándo se debe usar layoutIfNeeded .

NOTA: Tengo layoutIfNeeded utilizado en el código real, pero olvidé en qué contexto se utilizó.

layoutIfNeeded obliga al receptor a diseñar sus subvistas inmediatamente si es necesario.

Supongamos que ha anulado las layoutSubviews , y UIKit siente que su vista requiere diseño por cualquier razón (por ejemplo, llamó a setNeedsLayout cuando manejaba alguna acción del usuario). Luego, se llamará inmediatamente a su método layoutSubviews personalizado en lugar de cuando normalmente se llamaría en la secuencia de eventos de bucle de ejecución de UIKit normal (después del manejo de eventos, pero antes de drawRect: .

Un ejemplo de por qué es posible que necesite llamar a layoutIfNeeded dentro de un solo ciclo de ejecución:

  1. Cambia el tamaño de una vista personalizada que contiene una vista de tabla con un diseño personalizado. setNeedsLayout se establece para que layoutSubviews se llame más tarde.
  2. Un objeto controlador le pide a la vista de tabla que se desplace a alguna celda particular al manejar un evento de usuario.
  3. Su vista personalizada realiza algunos layoutSubviews personalizados de la vista de tabla en layoutSubviews que cambia el tamaño de la vista de tabla.

El problema es cuando el controlador pidió a la vista de tabla que se desplazara (paso 2), la vista de tabla tenía límites obsoletos. Los límites actualizados solo se establecerán en la vista de tabla más tarde (paso 3). A lo que el controlador quería que se desplazara la vista de tabla es posible que no esté realmente visible después de que se layoutSubviews realizado el layoutSubviews . Entonces, una solución sería que el controlador llamara layoutIfNeeded en situaciones donde sabe que esto podría ocurrir.

setNeedsLayout en realidad llama a layout IfNeeded, por lo que si su llamada estableceNeedsDisplay no hay ninguna razón para llamar a layout IfNeeded. De esta forma, setNeedsLayout es un método conveniente para llamar a layoutIfNeeded que hace el trabajo pesado.