Contents

shaps80/swiftuibackports

Introducing a collection of SwiftUI backports to make your iOS development easier.

Usage

The library adopts a backport design by Dave DeLong that makes use of a single type to improve discoverability and maintainability when the time comes to remove your backport implementations, in favour of official APIs.

Backports of pure types, can easily be discovered under the Backport namespace. Similarly, modifiers are discoverable under the .backport namespace.

Unfortunately Environment backports cannot be access this way, in those cases the Apple API values will be prefixed with backport to simplify discovery.

Types:

@Backport.AppStorage("filter-enabled")
private var filterEnabled: Bool = false

Modifier:

Button("Show Prompt") {
    showPrompt = true
}
.sheet(isPresented: $showPrompt) {
    Prompt()
        .backport.presentationDetents([.medium, .large])
}

Environment:

@Environment(\.backportRefresh) private var refreshAction

Backports

SwiftUI

  • AsyncImage
  • AppStorage
  • background – ViewBuilder API
  • DismissAction
  • DynamicTypeSize

LabelLabeledContent

  • NavigationDestination – uses a standard NavigationView
  • navigationTitle – newer API
  • overlay – ViewBuilder API
  • onChange
  • openURL
  • ProgressView
  • presentationDetents
  • presentationDragIndicator
  • quicklookPreview
  • requestReview
  • Refreshable – includes pull-to-refresh 
  • ScaledMetric
  • ShareLink
  • StateObject
  • scrollDisabled
  • scrollDismissesKeyboard
  • scrollIndicators
  • Section(_ header:)
  • task – async/await modifier

UIKit

  • UIHostingConfiguration – simplifies embedding SwiftUI in UICollectionViewCell and UITableViewCell

Extras

Modal Presentations

Adding this to your presented view, you can use the provided closure to present an ActionSheet to a user when they attempt to dismiss interactively. You can also use this to disable interactive dismissals entirely.

presentation(isModal: true) { /* attempt */ }

FittingGeometryReader

A custom GeometryReader implementation that correctly auto-sizes itself to its content. This is useful in many cases where you need a GeometryReader but don't want it to implicitly take up its parent View's bounds.

FittingScrollView

A custom ScrollView that respects Spacer's when the content is not scrollable. This is useful when you need to place a view at the edges of your scrollview while its content is small enough to not require scrolling. Another great use case is vertically centered content that becomes top aligned once the content requires scrolling.

Installation

You can install manually (by copying the files in the Sources directory) or using Swift Package Manager (preferred)

To install using Swift Package Manager, add this to the dependencies section of your Package.swift file:

.package(url: "https://github.com/shaps80/SwiftUIBackports.git", .upToNextMajor(from: "2.0.0"))

Package Metadata

Repository: shaps80/swiftuibackports

Default branch: main

README: README.md