iOS Application Development Guide
A practical guide for building iOS applications using UIKit, SnapKit, and SwiftUI. Focuses on proven patterns and Apple platform conventions.
Quick Reference
UIKit
| Purpose |
Component |
| Main sections |
UITabBarController |
| Drill-down |
UINavigationController |
| Focused task |
Sheet presentation |
| Critical choice |
UIAlertController |
| Secondary actions |
UIContextMenuInteraction |
| List content |
UICollectionView + DiffableDataSource |
| Sectioned list |
DiffableDataSource + headerMode |
| Grid layout |
UICollectionViewCompositionalLayout |
| Search |
UISearchController |
| Share |
UIActivityViewController |
| Location (once) |
CLLocationButton |
| Feedback |
UIImpactFeedbackGenerator |
| Linear layout |
UIStackView |
| Custom shapes |
CAShapeLayer + UIBezierPath |
| Gradients |
CAGradientLayer |
| Modern buttons |
UIButton.Configuration |
| Dynamic text |
UIFontMetrics + preferredFont |
| Dark mode |
Semantic colors (.systemBackground, .label) |
| Permissions |
Contextual request + AVCaptureDevice |
| Lifecycle |
UIApplication notifications |
SwiftUI
| Purpose |
Component |
| Main sections |
TabView + tabItem |
| Drill-down |
NavigationStack + NavigationPath |
| Focused task |
.sheet + presentationDetents |
| Critical choice |
.alert |
| Secondary actions |
.contextMenu |
| List content |
List + .insetGrouped |
| Search |
.searchable |
| Share |
ShareLink |
| Location (once) |
LocationButton |
| Feedback |
UIImpactFeedbackGenerator |
| Progress (known) |
ProgressView(value:total:) |
| Progress (unknown) |
ProgressView() |
| Dynamic text |
.font(.body) semantic styles |
| Dark mode |
.primary, .secondary, Color(.systemBackground) |
| Scene lifecycle |
@Environment(\.scenePhase) |
| Reduce motion |
@Environment(\.accessibilityReduceMotion) |
| Dynamic type |
@Environment(\.dynamicTypeSize) |
Core Principles
Layout
- Touch targets >= 44pt
- Content within safe areas (SwiftUI respects by default, use
.ignoresSafeArea() only for backgrounds)
- Use 8pt spacing increments (8, 16, 24, 32, 40, 48)
- Primary actions in thumb zone
- Support all screen sizes (iPhone SE 375pt to Pro Max 430pt)
Typography
- UIKit:
preferredFont(forTextStyle:) + adjustsFontForContentSizeCategory = true
- SwiftUI: semantic text styles
.headline, .body, .caption
- Custom fonts:
UIFontMetrics / Font.custom(_:size:relativeTo:)
- Adapt layout at accessibility sizes (minimum 11pt)
Colors
- Use semantic system colors (
.systemBackground, .label, .primary, .secondary)
- Asset catalog variants for custom colors (Any/Dark Appearance)
- No color-only information (pair with icons or text)
- Contrast ratio >= 4.5:1 for normal text, 3:1 for large text
Accessibility
- Labels on icon buttons (
.accessibilityLabel())
- Reduce motion respected (
@Environment(\.accessibilityReduceMotion))
- Logical reading order (
.accessibilitySortPriority())
- Support Bold Text, Increase Contrast preferences
Navigation
- Tab bar (3-5 sections) stays visible during navigation
- Back swipe works (never override system gestures)
- State preserved across tabs (
@SceneStorage, @State)
- Never use hamburger menus
Privacy & Permissions
- Request permissions in context (not at launch)
- Custom explanation before system dialog
- Support Sign in with Apple
- Respect ATT denial
Checklist
Layout
- [ ] Touch targets >= 44pt
- [ ] Content within safe areas
- [ ] Primary actions in thumb zone (bottom half)
- [ ] Flexible widths for all screen sizes (SE to Pro Max)
- [ ] Spacing aligns to 8pt grid
Typography
- [ ] Semantic text styles or UIFontMetrics-scaled custom fonts
- [ ] Dynamic Type supported up to accessibility sizes
- [ ] Layouts reflow at large sizes (no truncation)
- [ ] Minimum text size 11pt
Colors
- [ ] Semantic system colors or light/dark asset variants
- [ ] Dark Mode is intentional (not just inverted)
- [ ] No color-only information
- [ ] Text contrast >= 4.5:1 (normal) / 3:1 (large)
- [ ] Single accent color for interactive elements
Accessibility
- [ ] VoiceOver labels on all interactive elements
- [ ] Logical reading order
- [ ] Bold Text preference respected
- [ ] Reduce Motion disables decorative animations
- [ ] All gestures have alternative access paths
Navigation
- [ ] Tab bar for 3-5 top-level sections
- [ ] No hamburger/drawer menus
- [ ] Tab bar stays visible during navigation
- [ ] Back swipe works throughout
- [ ] State preserved across tabs
Components
- [ ] Alerts for critical decisions only
- [ ] Sheets have dismiss path (button and/or swipe)
- [ ] List rows >= 44pt tall
- [ ] Destructive buttons use
.destructive role
Privacy
- [ ] Permissions requested in context (not at launch)
- [ ] Custom explanation before system permission dialog
- [ ] Sign in with Apple offered with other providers
- [ ] Basic features usable without account
- [ ] ATT prompt shown if tracking, denial respected
System Integration
- [ ] App handles interruptions gracefully (calls, background, Siri)
- [ ] App content indexed for Spotlight
- [ ] Share Sheet available for shareable content
References
| Topic |
Reference |
| Touch Targets, Safe Area, CollectionView |
Layout System |
| TabBar, NavigationController, Modal |
Navigation Patterns |
| StackView, Button, Alert, Search, ContextMenu |
UIKit Components |
| CAShapeLayer, CAGradientLayer, Core Animation |
Graphics & Animation |
| Dynamic Type, Semantic Colors, VoiceOver |
Accessibility |
| Permissions, Location, Share, Lifecycle, Haptics |
System Integration |
| Metal Shaders & GPU |
Metal Shader Reference |
| SwiftUI HIG, Components, Patterns, Anti-Patterns |
SwiftUI Design Guidelines |
| Optionals, Protocols, async/await, ARC, Error Handling |
Swift Coding Standards |
Swift, SwiftUI, UIKit, SF Symbols, Metal, and Apple are trademarks of Apple Inc. SnapKit is a trademark of its respective owners.