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 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.
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.
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.
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.
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.
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.
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.
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.
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 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().
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.
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.
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.
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.
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.
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.
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
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.
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.
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.
Use UIColor con soporte de traitCollection: UIColor { $0.userInterfaceStyle == .dark ? ... : ... }. Active el modo oscuro en Info.plist con la clave UIUserInterfaceStyle.
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
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.
Lea también