About Programmatic User Interfaces
Programmatic UI is the approach of building iOS user interfaces entirely in code, without using Interface Builder or Storyboards. This method offers better version control, code reuse, and runtime flexibility compared to Interface Builder.
Key Features
- Full control over UI components
- Better git merge compatibility
- Improved reusability
- Runtime UI modifications
- No Interface Builder/Storyboard limitations
Code Example
// Programmatic UI example
import UIKit
class ProgrammaticViewController: UIViewController {
private let titleLabel = UILabel()
private let descriptionLabel = UILabel()
private let actionButton = UIButton(type: .system)
override func viewDidLoad() {
super.viewDidLoad()
setupUI()
}
private func setupUI() {
view.backgroundColor = .white
// Configure titleLabel
titleLabel.text = "Programmatic UI"
titleLabel.font = .systemFont(ofSize: 24, weight: .bold)
titleLabel.textAlignment = .center
titleLabel.translatesAutoresizingMaskIntoConstraints = false
view.addSubview(titleLabel)
// Configure descriptionLabel
descriptionLabel.text = "Interfaces built entirely in code"
descriptionLabel.font = .systemFont(ofSize: 16)
descriptionLabel.textAlignment = .center
descriptionLabel.numberOfLines = 0
descriptionLabel.translatesAutoresizingMaskIntoConstraints = false
view.addSubview(descriptionLabel)
// Configure button
actionButton.setTitle("Tap Me", for: .normal)
actionButton.addTarget(self, action: #selector(buttonTapped), for: .touchUpInside)
actionButton.translatesAutoresizingMaskIntoConstraints = false
view.addSubview(actionButton)
// Set constraints
NSLayoutConstraint.activate([
titleLabel.topAnchor.constraint(equalTo: view.safeAreaLayoutGuide.topAnchor, constant: 40),
titleLabel.leadingAnchor.constraint(equalTo: view.leadingAnchor, constant: 20),
titleLabel.trailingAnchor.constraint(equalTo: view.trailingAnchor, constant: -20),
descriptionLabel.topAnchor.constraint(equalTo: titleLabel.bottomAnchor, constant: 20),
descriptionLabel.leadingAnchor.constraint(equalTo: view.leadingAnchor, constant: 20),
descriptionLabel.trailingAnchor.constraint(equalTo: view.trailingAnchor, constant: -20),
actionButton.topAnchor.constraint(equalTo: descriptionLabel.bottomAnchor, constant: 40),
actionButton.centerXAnchor.constraint(equalTo: view.centerXAnchor)
])
}
@objc private func buttonTapped() {
print("Button tapped")
}
}