Apple definió claramente cómo subclasificar UIView
en el documento.
Consulte la lista a continuación, especialmente eche un vistazo a initWithFrame:
y layoutSubviews
. El primero está destinado a configurar el marco de su UIView
mientras que el segundo está destinado a configurar el marco y el diseño de sus subvistas.
También recuerde que initWithFrame:
se llama solo si está creando instancias UIView
programáticamente. Si lo está cargando desde un archivo plumín (o un guión gráfico), initWithCoder:
se utilizará. Y en initWithCoder:
el marco aún no se ha calculado, por lo que no puede modificar el marco que configuró en Interface Builder. Como se sugiere en esta respuesta , puede pensar en llamar initWithFrame:
desde initWithCoder:
para configurar el marco.
Finalmente, si carga su UIView
desde una plumilla (o un guión gráfico), también tiene la awakeFromNib
oportunidad de realizar inicializaciones de marcos y diseños personalizados, ya que cuando awakeFromNib
se llama se garantiza que cada vista en la jerarquía no se haya archivado e inicializado.
Del documento de NSNibAwaking
(ahora reemplazado por el documento de awakeFromNib
):
Los mensajes a otros objetos se pueden enviar de forma segura desde dentro de wakekeFromNib, momento en el cual se garantiza que todos los objetos no están archivados e inicializados (aunque no necesariamente despiertos, por supuesto)
También vale la pena señalar que con la distribución automática no debe establecer explícitamente el marco de su vista. En su lugar, se supone que debe especificar un conjunto de restricciones suficientes, de modo que el motor de diseño calcule automáticamente el marco.
Directamente de la documentación :
Métodos para anular
Inicialización
initWithFrame:
Se recomienda que implemente este método. También puede implementar métodos de inicialización personalizados además de, o en lugar de, este método.
initWithCoder:
Implemente este método si carga su vista desde un archivo plum de Interface Builder y su vista requiere una inicialización personalizada.
layerClass
Implemente este método solo si desea que su vista use una capa de animación principal diferente para su almacén de respaldo. Por ejemplo, si está utilizando OpenGL ES para hacer su dibujo, debería anular este método y devolver la clase CAEAGLLayer.
Dibujo e impresión
drawRect:
Implemente este método si su vista dibuja contenido personalizado. Si su vista no hace ningún dibujo personalizado, evite anular este método.
drawRect:forViewPrintFormatter:
Implemente este método solo si desea dibujar el contenido de su vista de manera diferente durante la impresión.
Restricciones
requiresConstraintBasedLayout
Implemente este método de clase si su clase de vista requiere restricciones para funcionar correctamente.
updateConstraints
Implemente este método si su vista necesita crear restricciones personalizadas entre sus subvistas.
alignmentRectForFrame:
, frameForAlignmentRect:
Poner en práctica estos métodos para anular cómo sus puntos de vista están alineados con otros puntos de vista.
Diseño
sizeThatFits:
Implemente este método si desea que su vista tenga un tamaño predeterminado diferente al que normalmente tendría durante las operaciones de cambio de tamaño. Por ejemplo, puede usar este método para evitar que su vista se reduzca hasta el punto en que las subvistas no se puedan mostrar correctamente.
layoutSubviews
Implemente este método si necesita un control más preciso sobre el diseño de sus subvistas que la restricción o los comportamientos de autorizar.
didAddSubview:
, willRemoveSubview:
Poner en práctica estos métodos según sea necesario para realizar un seguimiento de las adiciones y eliminaciones de subvistas.
willMoveToSuperview:
, didMoveToSuperview
Implemente estos métodos según sea necesario para rastrear el movimiento de la vista actual en su jerarquía de vistas.
willMoveToWindow:
, didMoveToWindow
Poner en práctica estos métodos, según sea necesario para seguir el movimiento de la vista a una ventana diferente.
Manejo de eventos:
touchesBegan:withEvent:
, touchesMoved:withEvent:
, touchesEnded:withEvent:
, touchesCancelled:withEvent:
Poner en práctica estos métodos, si usted necesita para manejar eventos de toque directamente. (Para la entrada basada en gestos, use reconocedores de gestos).
gestureRecognizerShouldBegin:
Implemente este método si su vista maneja eventos táctiles directamente y puede querer evitar que los reconocedores de gestos adjuntos activen acciones adicionales.