UIKit Reference
Kip Landergren
(Updated: )
My cheat sheet for UIKit covering terminology, configuration tips for objects like UIViewController, UILabel, and UIButton, and helpful links.
Contents
- Design
- UIKit Terminology
- UIViewController
- UINavigationController
- UITableViewController
- UITableView
- UINavigationItem
- UIStackView
- UILabel
- UIButton
- UIBarButtonItem
- Anchors
- Resources
Design
Dimensions
Devices
iPhone SE | 1334px x 750px |
UIKit Terminology
Anchor
- a factory class for creating layout constraints from view attributes
- Baseline
- line at bottom of text
- Layout Constraint
- an equation that defines how a view attribute should exist, often in relationship to another view attribute
- Leading Edge
- the first edge encountered when scanning in reading order (locale-dependent; changes with right-to-left or left-to-right languages)
- Trailing Edge
- the last edge encountered when scanning in reading order (locale-dependent; changes with right-to-left or left-to-right languages)
- View Attribute
- part of the object’s visual representation, typically corresponding to an edge or dimension, that should be used to get the value for the layout constraint
UIViewController
Properties
Prefer lazy loading when the property represents a simple element of the view controller’s view hierarchy:
private lazy var _closeButton: UIBarButtonItem = {
UIBarButtonItem(title: "Close", style: .plain,
target: self, action: #selector(t_closePressed(_:)))
}()
For more complex view configuration, consider refactoring.
Prefer implicitly unwrapped optionals when the property is nil
after initialization but known to be with value before use, and if nil
upon use would be an error:
private var _modalViewController: MyModalViewController!
Prefer optionals for any publically accessible properties, like delegates:
var editingDelegate: EditingDelegate?
Prefer normal types for non-optional values passed or created during initialization:
private var _name = "Editor"
Subclassing
Initialization
Create any required data structures to put view controller into a known good state.
Specifying a convenience
initializer, noting the call to self.init
:
convenience init() {
self.init(nibName: nil, bundle: nil)
title = NSLocalizedString("title", comment: "title")
// set up any navigationItem properties here, not in loadView()
}
Specifying a custom initializer, noting:
- setting up state first
- the call to
super
, rather thanself
- the overrided
init?
init(arg: String) {
// set up any internal state
_arg = arg
super.init(nibName: nil, bundle: nil)
title = NSLocalizedString("title", comment: "title")
// set up any navigationItem properties here, not in loadView()
}
@available(*, unavailable)
required init?(coder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}
loadView()
Create and wire together your view hierarchy, ensuring the root view is assigned to .view
. Do not call super
.
viewDidLoad()
View hierarchy exists in a valid state. Load any data necessary for display, and add any initial constraints.
Adding a Child View Controller
addChild(viewController)
view.addSubview(viewController.view)
viewController.didMove(toParent: self)
UINavigationController
Generally: do not set translatesAutoresizingMaskIntoConstraints
to false
on views being embedded in a UINavigationController
.
When presenting modally from a navigation controller, the presented view controller is not embedded in the navigation controller doing the presenting. Therefore if you wish to have navigability in the modal, embed the view controller in a separate navigation controller before presenting.
UITableViewController
Generally: a UITableViewController
should take up the whole screen. If a view controller needs the functionality of a UITableView
, create a custom UIViewController
to address.
Styles
.plain
.grouped
.insetGrouped
UITableView
Quick facts:
- sections are zero-indexed
- rows are zero-indexed
From the docs:
The table view’s delegate in tableView(_:cellForRowAt:)
should always reset all content when reusing a cell.
UINavigationItem
Object containing the views and buttons for display in the navigation bar.
Uses:
- navigation bar title
leftBarButtonItems
, for the leading edgerightBarButtonItems
, for the trailing edgebackBarButtonItem
, for the back button when the controller is second on the stack
Notes:
- bar button items will only be displayed if there is sufficient space available
- custom views must be wrapped in
UIBarButtonItem
objects navigationItem
should be initialized duringinit
, due to a navigation controller needing information beforeloadView()
is called
UIStackView
UIStackView
is nonrendering, meaning it provides no user interface of its own. This means settings like backgroundColor
have no effect.
UILabel
A UILabel
’s default backgroundColor
is transparent.
System-provided .textColor
values include:
.label
.secondaryLabel
.tertiaryLabel
.quaternaryLabel
Font
label.font = UIFont.preferredFont(forTextStyle: .headline)
label.adjustsFontForContentSizeCategory = true
label.adjustsFontSizeToFitWidth = true
label.allowsDefaultTighteningForTruncation = true
label.baselineAdjustment = .alignCenters
Accessibility
label.accessibilityIdentifier = "Unique Article Title"
UIButton
UIButton Creation
_button = UIButton(type: .custom)
UIButton.ButtonType Values
custom | |
system | |
detailDisclosure | |
infoLight | |
infoDark | |
contactAdd | |
roundedRect |
UIBarButtonItem
isEnabled |
enables or disables the state of the button |
Anchors
A full list is within the enum NSLayoutConstraint.Attribute
.
X Axis
leadingAnchor | a view’s leading edge. should be preferred especially for RTL and LTR localization. |
trailingAnchor | a view’s trailing edge. should be preferred especially for RTL and LTR localization. |
leftAnchor | a view’s left edge |
rightAnchor | a view’s right edge |
centerXAnchor | a view’s horizontal center |
Y Axis
topAnchor | a view’s top edge |
bottomAnchor | a views bottom edge |
firstBaselineAnchor | baseline of first line of a view containing multiple lines of text |
lastBaselineAnchor | baseline of last line of a view containing multiple lines of text |
centerYAnchor |
Dimensional
widthAnchor | a view’s width |
heightAnchor | a view’s height |
Resources
Apple Developer Documentation
Note: I have found that the built-in Xcode documentation for UIKit is not as up-to-date as what is available on developer.apple.com.
- UIKit