2023 App ServicesSystem ServicesSwiftUI & UI Frameworks
WWDC23 · 31 min · App Services / System Services / SwiftUI & UI Frameworks
What’s new in UIKit
Explore enhancements and updates to UIKit and learn how to build better iOS, iPadOS, and Mac Catalyst apps. We’ll show you the latest features and improvements in UIKit and share API refinements, performance improvements, and much more.
Watch at developer.apple.com ↗Chapters
- 1:23 — Key feature: Xcode previews
- 2:08 — Key feature: View controller lifecycle
- 5:09 — Key feature: Trait system enhancements
- 6:26 — Key feature: Animation symbol images
- 7:49 — Key feature: Empty states
- 9:51 — Internationalization
- 13:34 — iPad: Document support
- 13:55 — iPad: Window dragging
- 14:47 — iPad: Sidebar and Stage Manager
- 16:56 — iPad: Apple Pencil
- 19:33 — iPad: Keyboard scrolling
- 20:21 — General: Collection views
- 23:03 — General: Spring animations
- 24:03 — General: Text interactions
- 25:12 — General: Status bar
- 26:19 — General: Drag and drop
- 27:00 — General: HDR images
- 27:34 — General: Page control
- 28:42 — General: Palette menus 🎨
- 30:08 — tvOS menus
Code shown on screen · 5 snippets
Using Xcode previews with view controllers
class LibraryViewController: UIViewController {
// ...
}
#Preview("Library") {
let controller = LibraryViewController()
controller.displayCuratedContent = true
return controller
} Using Xcode previews with views
class SlideshowView: UIView {
// ...
}
#Preview("Memories") {
let view = SlideshowView()
view.title = "Memories"
view.subtitle = "Highlights from the past year"
view.images = ...
return view
} Setting up UIContentUnavailableConfiguration
var config = UIContentUnavailableConfiguration.empty()
config.image = UIImage(systemName: "star.fill")
config.text = "No Favorites"
config.secondaryText =
"Your favorite translations will appear here."
viewController.contentUnavailableConfiguration = config Using UIContentUnavailableConfiguration with SwiftUI
let config = UIHostingConfiguration {
VStack {
ProgressView(value: progress)
Text("Downloading file...")
.foregroundStyle(.secondary)
}
}
viewController.contentUnavailableConfiguration = config Using UIContentUnavailableConfiguration for search results
override func updateContentUnavailableConfiguration(
using state: UIContentUnavailableConfigurationState
) {
var config: UIContentUnavailableConfiguration?
if searchResults.isEmpty {
config = .search()
}
contentUnavailableConfiguration = config
}
// Update search results for query
searchResults = backingStore.results(for: query)
setNeedsUpdateContentUnavailableConfiguration() Resources
Related sessions
-
14 min -
30 min -
16 min -
23 min -
29 min -
17 min -
23 min