UIKit ist ein Framework zur Erstellung grafischer Oberflächen in iOS- und macOS-Anwendungen. Das Set umfasst UIView, UIViewController, Steuerelemente und das Auto-Layout-System, mit dem sich adaptive und interaktive Bildschirme erstellen lassen. Laut Apple Developer Documentation (2025) enthält UIKit über 200 Klassen für die Arbeit mit Fenstern, Views, Animationen, Gesten und Text — es ist die Grundlage aller iPhone- und iPad-Anwendungen.
Wichtige Punkte
UIKit ist ein Framework von Apple, das Klassen zum Erstellen und Verwalten von Benutzeroberflächen unter iOS, iPadOS und macOS (über Mac Catalyst) bereitstellt. Es arbeitet auf Core Animation, Core Graphics und Quartz Core und abstrahiert das Low-Level-Rendering in High-Level-Objekte — Schaltflächen, Labels, Bilder und Container. UIKit debütierte mit iPhone OS 1 im Jahr 2007 und ist neben SwiftUI das primäre Framework für die iOS-Entwicklung.
Das Framework folgt einem imperativen Ansatz: Der Entwickler erstellt Instanzen der Klassen UIButton, UILabel, UIImageView, legt deren Eigenschaften (Farbe, Schriftart, Position) fest und fügt sie über addSubview zur View-Hierarchie hinzu. Jede Änderung der Oberfläche wird explizit vorgenommen — keine magischen Updates im Hintergrund. Dies unterscheidet UIKit von deklarativen Frameworks wie SwiftUI, bei denen die Zustandsbeschreibung die Oberfläche automatisch neu zeichnet.
Das Framework umfasst mehrere Kategorien von Klassen. UIView ist das Basiselement, von dem alle visuellen Komponenten erben. UIWindow ist der Container der obersten Ebene, über den Views auf dem Bildschirm angezeigt werden. UIViewController verwaltet eine Reihe von Views und reagiert auf Bildschirmdrehungen, Tastatureinblendungen und Systembenachrichtigungen. UIApplication ist der Einstiegspunkt, der Touch-Ereignisse und Tastendrücke verarbeitet.
Für Text werden UILabel (statischer Text), UITextField (einzeilige Eingabe) und UITextView (mehrzeilige Eingabe) verwendet. Für Schaltflächen — UIButton, einschließlich System-, benutzerdefinierter und SF-Symbols-Iconografie. Für die Navigation — UINavigationController, UITabBarController und UISplitViewController. Insgesamt hat UIKit über 200 öffentliche Klassen.
Die UIKit-Architektur ist auf Ebenen aufgebaut: Jede Ebene ist für einen eigenen Aspekt der Anzeige verantwortlich. Auf der untersten Ebene befindet sich Core Graphics — die Rendering-Engine für Pfade, Text und Bilder. Darüber liegt Core Animation, das die Ebenenkomposition (CALayer) und Animationen zwischen Zuständen verwaltet. UIKit baut darauf eine objektorientierte API auf: UIView, UIViewController und UIResponder.
Jede Anwendung hat eine View-Hierarchie — einen Baum, dessen Wurzel das UIWindow ist. Darunter befinden sich der UIViewController, seine View und darin verschachtelte Subviews. Touch-Ereignisse breiten sich entlang der Responder-Kette aus: von der am tiefsten verschachtelten View zu ihren Eltern und weiter zu UIApplication. Wenn kein Objekt die Berührung behandelt, wird sie ignoriert.
Jede UIView enthält eine CALayer, die für das Pixel-Rendering auf dem Bildschirm zuständig ist. Die View verwaltet Berührungen und Barrierefreiheit; die Ebene verwaltet Grafiken — Schatten, cornerRadius, Rahmen, Transformation. Diese Trennung ermöglicht es, schwere Grafiken auf einen separaten Thread (Render-Server) auszulagern, ohne den Hauptthread zu blockieren. Apple empfiehlt, direkt mit CALayer zu arbeiten, wenn mehr als 200 Views auf dem Bildschirm sind — das reduziert die CPU-Last.
Die Responder-Kette beginnt mit dem Objekt, das zuerst ein Touch-Ereignis empfängt. Wenn es das Ereignis nicht behandelt (die Methode touchesBegan wurde nicht überschrieben), wird das Ereignis an den nächsten Responder in der Kette weitergegeben: next, superview, next responder, UIViewController, UIWindow, UIApplication, App Delegate. Dies ermöglicht das Abfangen globaler Gesten und Tastaturereignisse auf Szenenebene, ohne einen Handler zu jeder View hinzuzufügen.
Jeder UIViewController durchläuft eine streng definierte Abfolge von Ereignissen. Der Lebenszyklus umfasst Phasen: Initialisierung, Laden der View, Erscheinen auf dem Bildschirm, Layout-Aktualisierung bei Drehung, Ausblenden, Verlassen des Bildschirms und Speicherfreigabe. Der Entwickler überschreibt die entsprechenden Methoden, um in jeder Phase eigenen Code auszuführen.
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()
}
}
In viewDidLoad wird die Oberfläche konfiguriert — Subviews werden erstellt, Constraints gesetzt, Delegaten abonniert. In viewWillAppear werden Operationen vor der Anzeige durchgeführt: Laden aktueller Daten aus dem Netzwerk, Aktualisieren von Werten. viewDidDisappear ist der Ort zum Abmelden von Benachrichtigungen und Bereinigen temporärer Daten. Der Aufruf von super ist in allen Überschreibungen obligatorisch, sonst bricht die Ereigniskette.
In älteren iOS-Versionen gab es die Methode viewDidUnload, die bei Speicherknappheit aufgerufen wurde. Seit iOS 6 wurde die Methode entfernt — UIKit entlädt jetzt automatisch die Views von Controllern, wenn sie nicht sichtbar sind. Der Entwickler muss lediglich alle View-Referenzen als weak deklarieren, damit ARC beim Erhalt einer Systemwarnung den Speicher korrekt freigeben kann.
UIKit unterstützt zwei Arten von Übergängen: Segue (über Storyboard) und programmatische Navigation über UINavigationController. Ein programmatischer Übergang sieht so aus: navigationController?.pushViewController(detailVC, animated: true). Dabei durchläuft der detailVC den normalen Lebenszyklus — viewDidLoad wird einmal aufgerufen, viewWillAppear jedes Mal beim Erscheinen.
Auto Layout ist ein Positionierungssystem, das auf mathematischen Beziehungen (Constraints) basiert. Anstelle von fest codierten X- und Y-Koordinaten beschreibt der Entwickler Regeln: „Die Schaltfläche befindet sich rechts vom Label mit einem Abstand von 16pt“ oder „Die View erstreckt sich über die Bildschirmbreite mit 20pt Abstand links und rechts.“ Das System löst das resultierende Gleichungssystem zur Laufzeit und passt die Oberfläche an jede Bildschirmgröße an.
Constraints können im Interface Builder (per Drag & Drop) oder programmatisch in Swift festgelegt werden. Jeder Constraint ist eine Instanz der Klasse NSLayoutConstraint mit Parametern: firstItem, firstAttribute, relation, secondItem, secondAttribute, multiplier, constant. Constraints werden über isActive = true oder massenhaft über NSLayoutConstraint.activate() aktiviert.
Mit der Einführung des iPhone X (2017) führte Apple die Safe Area ein — den Bildschirmbereich ohne Notch, abgerundete Ecken und Home-Bar-Indikator. Constraints sollten an view.safeAreaLayoutGuide und nicht an view gebunden werden. Layout Margins fügen der View einen Innenabstand hinzu, standardmäßig 8pt oder 16pt je nach Kontext. Die Verwendung von safeAreaLayoutGuide gewährleistet die korrekte Darstellung auf allen iPhone- und iPad-Generationen.
Auto Layout unterstützt Animationen durch Ändern von Constraint-Konstanten. Aktualisieren Sie einfach die constant eines Constraints und rufen Sie UIView.animate mit layoutIfNeeded innerhalb des Animationsblocks auf. Das System berechnet die Position aller Views in der Hierarchie nahtlos neu. Diese Technik wird für ausklappbare Blöcke, adaptive Tastaturbereiche und Bildschirmausrichtungsänderungen verwendet.
UITableView und UICollectionView sind zwei leistungsstarke UIKit-Werkzeuge zum Anzeigen von Listen und Gittern. UITableView eignet sich für vertikale einspaltige Listen (Chat, Einstellungen, Nachrichtenfeed). UICollectionView ist für Gitter, horizontale Listen, Karussells und benutzerdefinierte Layouts (Galerie, Produkte, Kalender) gedacht. Beide Klassen verwenden das Delegationsmuster, um Daten von der Darstellung zu trennen.
Die Datenquelle ist das UITableViewDataSource-Protokoll mit den obligatorischen Methoden numberOfRowsInSection und cellForRowAt. Der UITableViewDelegate behandelt Zellenberührungen, Zeilenhöhen und Scroll-Ereignisse. Der Reuse-Identifier-Mechanismus wiederverwendet Zellen, die den Bildschirm verlassen haben, was für die Leistung bei großen Listen entscheidend ist.
class ContactsViewController: UITableViewController {
private let contacts = ["Anna", "Boris", "Viktor"]
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
}
}
Das Beispiel zeigt einen minimalen Controller zum Anzeigen eines String-Arrays. Die Zelle wird über UIListContentConfiguration konfiguriert — eine moderne API (iOS 14+), die die veralteten textLabel und detailTextLabel ersetzt hat. Die Registrierung der Zellenklasse in viewDidLoad ist obligatorisch, sonst stürzt die Anwendung mit einer Laufzeitausnahme ab.
Ab iOS 13 empfiehlt Apple UICollectionViewCompositionalLayout zum Erstellen komplexer Layouts. Der Entwickler beschreibt Abschnitt, Gruppe, Element und deren Größen deklarativ — es entsteht ein Raster mit beliebiger Geometrie: Streifen, 2x2-Raster, Karussell oder Ornament. Compositional Layout hat das veraltete UICollectionViewFlowLayout für alle neuen Projekte ersetzt. In Kombination mit DiffableDataSource reduziert sich die Aktualisierung einer Sammlung auf einen einzigen apply(snapshot)-Aufruf, und Änderungsanimationen werden automatisch ausgeführt.
Im Folgenden finden Sie zwei praktische Beispiele für die Verwendung von UIKit in realen Aufgaben: Erstellen einer benutzerdefinierten View mit Schatten und abgerundeten Ecken sowie Behandeln einer Wischgeste zum Löschen eines Elements aus einer Liste.
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()
}
}
Die Erweiterung applyCardStyle fügt jeder View Schatten und abgerundete Ecken hinzu — nützlich für Produktkarten, Profile und Benachrichtigungen. Die Methode handleSwipe mit Animation löscht ein Element, wenn der Benutzer nach rechts darüber wischt. Der Handler wird über addGestureRecognizer mit einer UISwipeGestureRecognizer(direction: .right)-Konfiguration zur View hinzugefügt. Die Einstellung masksToBounds = false ist wichtig, damit der Schatten nicht durch die View-Grenzen abgeschnitten wird.
Für komplexere Oberflächen verwenden Sie UIStackView — einen Container, der verschachtelte Views automatisch horizontal oder vertikal anordnet. Stack View vereinfacht das Layout: Sie müssen keine Constraints für jedes Element festlegen, sondern nur einen Constraint für den Stack selbst.
Häufig gestellte Fragen
Frame ist ein Rechteck in den Koordinaten der Superview (Position + Größe). Bounds ist ein Rechteck in den eigenen Koordinaten der View (beginnt immer bei 0,0). Frame ändert sich bei Drehung und Skalierung; bounds nicht.
UIKit entlädt automatisch die Views ausgeblendeter Controller. Der Entwickler muss lediglich View-Eigenschaften als weak var deklarieren, damit ARC bei einer Systemwarnung Speicher freigeben kann.
Für neue Projekte empfiehlt Apple SwiftUI. Wenn das Projekt UIKit verwendet — verwenden Sie XIB für einzelne Bildschirme oder programmatisches Layout über SnapKit. Storyboard erzeugt Merge-Konflikte und verlangsamt den Build.
Verwenden Sie UIColor mit traitCollection-Unterstützung: UIColor { $0.userInterfaceStyle == .dark ? ... : ... }. Aktivieren Sie den dunklen Modus in Info.plist mit dem Schlüssel UIUserInterfaceStyle.
UIStackView berechnet die Positionen und Größen verschachtelter Views automatisch basierend auf alignment, distribution und spacing. Es reduziert den Constraint-Code um 60–80% und vereinfacht die Anpassung an verschiedene Bildschirme.
Zusammenfassung
Wir entwickeln eine mobile Applikation schlüsselfertig
IT Sectr entwickelt seit 2017 iOS- und Android-Apps für Startups und Unternehmen. Wir beraten Sie und schlagen die beste Lösung vor.
Lesen Sie auch