UIKit — qué es, conceptos clave y arquitectura

Autor: IT Sectr Publicado: 2026-04-30 Tiempo de lectura: 10 min

UIKit es un framework para construir interfaces gráficas en aplicaciones iOS y macOS. El conjunto incluye UIView, UIViewController, elementos de control y el sistema Auto Layout, permitiendo crear pantallas adaptativas e interactivas. Según la Apple Developer Documentation (2025), UIKit contiene más de 200 clases para trabajar con ventanas, vistas, animaciones, gestos y texto — es la base de todas las aplicaciones para iPhone y iPad.

Puntos clave

  • UIKit es el framework de Apple para construir interfaces en iOS, iPadOS y macOS con un enfoque imperativo para la gestión de vistas.
  • UIView es la clase base para todos los elementos visuales: botones, campos de texto, imágenes y contenedores.
  • UIViewController gestiona el ciclo de vida de la pantalla: desde la carga de la vista hasta la liberación de memoria.
  • Auto Layout describe el posicionamiento de elementos mediante un sistema de restricciones, adaptando la interfaz a diferentes tamaños de pantalla.
  • Delegados y dataSource son el patrón clave para tablas y colecciones, separando los datos de su visualización.

¿Qué es UIKit?

UIKit es un framework de Apple que proporciona clases para crear y gestionar interfaces de usuario en iOS, iPadOS y macOS (a través de Mac Catalyst). Funciona sobre Core Animation, Core Graphics y Quartz Core, abstrayendo el renderizado de bajo nivel en objetos de alto nivel — botones, etiquetas, imágenes y contenedores. UIKit debutó con iPhone OS 1 en 2007 y sigue siendo el framework principal para el desarrollo iOS junto con SwiftUI.

El framework sigue un enfoque imperativo: el desarrollador crea instancias de las clases UIButton, UILabel, UIImageView, establece sus propiedades (color, fuente, posición) y las añade a la jerarquía de vistas mediante addSubview. Cada cambio en la interfaz se realiza de forma explícita — sin magia de actualizaciones entre bastidores. Esto distingue a UIKit de los frameworks declarativos como SwiftUI, donde la descripción del estado redibuja automáticamente la interfaz.

Clases principales de UIKit

El framework incluye varias categorías de clases. UIView es el elemento base del que heredan todos los componentes visuales. UIWindow es el contenedor de nivel superior a través del cual las vistas se muestran en pantalla. UIViewController gestiona un conjunto de vistas y responde a rotaciones de pantalla, aparición del teclado y notificaciones del sistema. UIApplication es el punto de entrada que procesa eventos táctiles y pulsaciones de botones.

Para texto se utilizan UILabel (texto estático), UITextField (entrada de una línea), UITextView (entrada multilínea). Para botones — UIButton, incluyendo botones del sistema, personalizados y con iconografía SF Symbols. Para navegación — UINavigationController, UITabBarController y UISplitViewController. En total, UIKit tiene más de 200 clases públicas.

Arquitectura de UIKit: capas y jerarquía de vistas

La arquitectura de UIKit se basa en capas: cada capa es responsable de un aspecto de la visualización. En el nivel más bajo se encuentra Core Graphics — el motor de renderizado de trazados, texto e imágenes. Por encima está Core Animation, que gestiona la composición de capas (CALayer) y las animaciones entre estados. UIKit construye una API orientada a objetos sobre ellos: UIView, UIViewController y UIResponder.

Cada aplicación tiene una jerarquía de vistas — un árbol cuya raíz es UIWindow. Debajo está el UIViewController raíz, su vista y las subvistas anidadas en su interior. Los eventos táctiles se propagan a lo largo de la cadena de respuesta: desde la vista más anidada hasta sus padres y hasta UIApplication. Si ningún objeto maneja el toque, se ignora.

UIView y CALayer

Cada UIView contiene una CALayer que maneja el renderizado de píxeles en pantalla. La vista gestiona los toques y la accesibilidad; la capa maneja los gráficos — sombra, cornerRadius, borde, transformación. Esta separación permite descargar los gráficos pesados a un hilo separado (servidor de renderizado) sin bloquear el hilo principal. Apple recomienda trabajar directamente con CALayer si hay más de 200 vistas en pantalla — esto reduce la carga de la CPU.

Cadena de respuesta en detalle

La cadena de respuesta comienza con el objeto que recibe primero un evento táctil. Si no maneja el evento (el método touchesBegan no está sobreescrito), el evento pasa al siguiente respondedor en la cadena: next, superview, next responder, UIViewController, UIWindow, UIApplication, App Delegate. Esto permite interceptar gestos globales y eventos de teclado a nivel de escena sin añadir un manejador a cada vista.

Ciclo de vida de UIViewController

Cada UIViewController pasa por una secuencia de eventos estrictamente definida. El ciclo de vida incluye fases: inicialización, carga de la vista, aparición en pantalla, actualización del diseño al rotar, ocultación, salida de pantalla y liberación de memoria. El desarrollador sobreescribe los métodos correspondientes para ejecutar código personalizado en cada etapa.

swift
class ProfileViewController: UIViewController {

    override func viewDidLoad() {
        super.viewDidLoad()
        setupUI()
    }

    override func viewWillAppear(_ animated: Bool) {
        super.viewWillAppear(animated)
        loadUserProfile()
    }

    override func viewDidDisappear(_ animated: Bool) {
        super.viewDidDisappear(animated)
        clearCache()
    }
}

En viewDidLoad se configura la interfaz — se crean las subvistas, se establecen las restricciones, se suscriben los delegados. En viewWillAppear se realizan operaciones antes de la visualización: carga de datos actualizados desde la red, actualización de valores. viewDidDisappear es el lugar para darse de baja de notificaciones y limpiar datos temporales. La llamada a super es obligatoria en todas las sobreescrituras, de lo contrario la cadena de eventos se rompe.

Gestión de memoria y viewDidUnload

En versiones antiguas de iOS existía el método viewDidUnload, que se llamaba cuando faltaba memoria. Desde iOS 6 el método se eliminó — UIKit ahora descarga automáticamente las vistas de los controladores cuando no son visibles. El desarrollador solo necesita declarar todas las referencias a vistas como weak para que ARC pueda liberar memoria correctamente al recibir una advertencia del sistema.

Transiciones entre controladores

UIKit soporta dos tipos de transiciones: segue (a través de Storyboard) y navegación programática mediante UINavigationController. Una transición programática se ve así: navigationController?.pushViewController(detailVC, animated: true). En este caso, el ciclo de vida de detailVC procede con normalidad — viewDidLoad se llama una vez, viewWillAppear se llama cada vez que aparece.

Auto Layout y diseño adaptativo

Auto Layout es un sistema de posicionamiento basado en relaciones matemáticas (restricciones). En lugar de coordenadas X e Y fijas, el desarrollador describe reglas: “el botón está a la derecha de la etiqueta con un margen de 16pt” o “la vista se estira a lo ancho de la pantalla con márgenes de 20pt a izquierda y derecha.” El sistema resuelve el sistema de ecuaciones resultante en tiempo de ejecución, adaptando la interfaz a cualquier tamaño de pantalla.

Las restricciones se pueden establecer en Interface Builder (mediante arrastrar y soltar) o programáticamente en Swift. Cada restricción es una instancia de la clase NSLayoutConstraint con parámetros: firstItem, firstAttribute, relation, secondItem, secondAttribute, multiplier, constant. Las restricciones se activan mediante isActive = true o en masa mediante NSLayoutConstraint.activate().

Safe Area y Layout Margins

Con la introducción del iPhone X (2017), Apple introdujo el Safe Area — el área de la pantalla libre del notch, las esquinas redondeadas y el indicador de la barra de inicio. Las restricciones deben adjuntarse a view.safeAreaLayoutGuide, no a view. Los Layout Margins añaden relleno interno a la vista, por defecto 8pt o 16pt según el contexto. El uso de safeAreaLayoutGuide garantiza una visualización correcta en todas las generaciones de iPhone y iPad.

Animación de restricciones

Auto Layout soporta animación mediante el cambio de constantes de las restricciones. Simplemente actualice la constant de una restricción y llame a UIView.animate con layoutIfNeeded dentro del bloque de animación. El sistema recalcula suavemente la posición de todas las vistas en la jerarquía. Esta técnica se utiliza para bloques expandibles, paneles de teclado adaptativos y cambios de orientación de pantalla.

Trabajo con tablas y colecciones

UITableView y UICollectionView son dos potentes herramientas de UIKit para mostrar listas y cuadrículas. UITableView es adecuada para listas verticales de una sola columna (chat, ajustes, feed de noticias). UICollectionView es para cuadrículas, listas horizontales, carruseles y diseños personalizados (galería, productos, calendario). Ambas clases utilizan el patrón de delegación para separar los datos de la apariencia.

La fuente de datos es el protocolo UITableViewDataSource con los métodos obligatorios numberOfRowsInSection y cellForRowAt. El UITableViewDelegate maneja los toques en las celdas, la altura de las filas y los eventos de desplazamiento. El mecanismo de reuse identifier reutiliza las celdas que han salido de la pantalla, lo que es crítico para el rendimiento en listas grandes.

swift
class ContactsViewController: UITableViewController {

    private let contacts = ["Ana", "Boris", "Víctor"]

    override func viewDidLoad() {
        super.viewDidLoad()
        tableView.register(UITableViewCell.self,
                           forCellReuseIdentifier: "cell")
    }

    override func tableView(_ tableView: UITableView,
                          numberOfRowsInSection section: Int) -> Int {
        return contacts.count
    }

    override func tableView(_ tableView: UITableView,
                          cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        let cell = tableView.dequeueReusableCell(withIdentifier: "cell",
                                                 for: indexPath)
        var content = cell.defaultContentConfiguration()
        content.text = contacts[indexPath.row]
        cell.contentConfiguration = content
        return cell
    }
}

El ejemplo muestra un controlador mínimo para mostrar un array de cadenas. La celda se configura mediante UIListContentConfiguration — una API moderna (iOS 14+) que reemplazó a los obsoletos textLabel y detailTextLabel. El registro de la clase de celda en viewDidLoad es obligatorio, de lo contrario la aplicación fallará con una excepción en tiempo de ejecución.

UICollectionView y Compositional Layout

A partir de iOS 13, Apple recomienda UICollectionViewCompositionalLayout para construir diseños complejos. El desarrollador describe la sección, el grupo, el elemento y sus tamaños de forma declarativa — obteniendo una cuadrícula con geometría arbitraria: una tira, cuadrícula 2x2, carrusel o adorno. Compositional Layout ha reemplazado al obsoleto UICollectionViewFlowLayout para todos los proyectos nuevos. Combinado con DiffableDataSource, la actualización de una colección se reduce a una sola llamada apply(snapshot), y las animaciones de cambio se realizan automáticamente.

Ejemplos de código en Swift

A continuación se presentan dos ejemplos prácticos de uso de UIKit en tareas reales: crear una vista personalizada con sombra y esquinas redondeadas, y manejar un gesto de deslizamiento para eliminar un elemento de una lista.

swift
extension UIView {
    func applyCardStyle() {
        layer.cornerRadius = 12
        layer.shadowOpacity = 0.15
        layer.shadowRadius = 8
        layer.shadowOffset = CGSize(width: 0, height: 2)
        layer.masksToBounds = false
    }
}

@objc private func handleSwipe(_ gesture: UISwipeGestureRecognizer) {
    guard let swipedView = gesture.view else { return }
    UIView.animate(withDuration: 0.3) {
        swipedView.alpha = 0
        swipedView.transform = CGAffineTransform(translationX: 300, y: 0)
    } completion: { _ in
        swipedView.removeFromSuperview()
    }
}

La extensión applyCardStyle añade sombra y esquinas redondeadas a cualquier vista — útil para tarjetas de producto, perfiles y notificaciones. El método handleSwipe con animación elimina un elemento cuando el usuario desliza hacia la derecha sobre él. El manejador se añade a la vista mediante addGestureRecognizer con una configuración UISwipeGestureRecognizer(direction: .right). Es importante establecer masksToBounds = false para evitar que la sombra sea recortada por los límites de la vista.

Para interfaces más complejas, use UIStackView — un contenedor que distribuye automáticamente las vistas anidadas horizontal o verticalmente. Stack View simplifica el diseño: no es necesario establecer restricciones para cada elemento, basta con una restricción para el propio stack.

Preguntas frecuentes

¿Cuál es la diferencia entre frame y bounds en UIView?

Frame es un rectángulo en las coordenadas del superview (posición + tamaño). Bounds es un rectángulo en las coordenadas propias de la vista (siempre comienza en 0,0). Frame cambia al rotar y escalar; bounds no.

¿Cómo liberar memoria de vistas no utilizadas?

UIKit descarga automáticamente las vistas de los controladores ocultos. El desarrollador solo necesita declarar las propiedades de las vistas como weak var para que ARC pueda liberar memoria al recibir una advertencia del sistema.

¿Debería usar Storyboard en 2026?

Para proyectos nuevos, Apple recomienda SwiftUI. Si el proyecto usa UIKit — use XIB para pantallas individuales o diseño programático con SnapKit. Storyboard crea conflictos de merge y ralentiza la compilación.

¿Cómo implementar el modo oscuro en UIKit?

Use UIColor con soporte de traitCollection: UIColor { $0.userInterfaceStyle == .dark ? ... : ... }. Active el modo oscuro en Info.plist con la clave UIUserInterfaceStyle.

¿En qué es mejor UIStackView que las restricciones manuales?

UIStackView calcula automáticamente las posiciones y tamaños de las vistas anidadas según alignment, distribution y spacing. Reduce el código de restricciones en un 60–80% y simplifica la adaptación a diferentes pantallas.

Resumen

  • UIKit es el framework principal de Apple para construir interfaces iOS, iPadOS y macOS con un enfoque imperativo.
  • UIView gestiona el renderizado y los toques; su parte gráfica es manejada por la capa CALayer, que funciona en un hilo separado.
  • UIViewController sigue un ciclo de vida estricto: desde viewDidLoad hasta la liberación de memoria, con la posibilidad de sobreescribir cada etapa.
  • Auto Layout reemplaza las coordenadas fijas con un sistema de restricciones, adaptando la interfaz a cualquier tamaño y orientación de pantalla.
  • UITableView y UICollectionView con reuse identifiers garantizan el rendimiento en listas grandes y soportan el moderno Compositional Layout.
  • UIStackView simplifica el diseño de secuencias de vistas, reduciendo el código de restricciones en un 60–80%.
  • Para proyectos nuevos, Apple recomienda SwiftUI, pero UIKit sigue siendo relevante para soportar versiones antiguas de iOS e interfaces personalizadas complejas.

Desarrollaremos una aplicación móvil llave en mano

IT Sectr crea aplicaciones para iOS y Android para startups y empresas desde 2017. Le asesoraremos y le propondremos la mejor solución.

Discutir el proyecto

Lea también