NOTE: This repo isn't maintained due to swiftui taking on most of the features we supported here. Happy to hand the repo to someone who really does need it.
Customizable sheet presentations in SwiftUI. Using UISheetPresentationController under the hood.
- Uses the default
sheetAPI under the hood, ensuring maximum compatibility & stability. - Exposes the exact same API as the default SwiftUI
sheetimplementation. - No hacks, follows the best practices for creating representable views in SwiftUI.
- Configurable using view modifiers, can configure
UISheetPresentationControllerfrom any child views in the presented sheet's content view. - Works with the
interactiveDismissDisabled(_:Bool)modifier. - Exposes all of the
UISheetPresentationControllerconfiguration options. - Track the currently selected detent using an
Environmentvalue. - Well documented API, following a similar approach to the Developer Documentation.
- Small footprint,
~44kBthin when installed via SwiftPM.
The codebase supports iOS and requires Xcode 12.0 or newer
Open your project. Navigate to File > Swift Packages > Add Package Dependency. Enter the url https://github.com/ericlewis/PageSheet and tap Next.
Select the PageSheet target and press Add Package.
Add the following line to the dependencies in your Package.swift file:
.package(url: "https://github.com/ericlewis/PageSheet.git", .upToNextMajor(from: "1.0.0"))Next, add PageSheet as a dependency for your targets:
.target(name: "AppTarget", dependencies: ["PageSheet"])A completed example may look like this:
// swift-tools-version:5.5
import PackageDescription
let package = Package(
name: "App",
dependencies: [
.package(
url: "https://github.com/ericlewis/PageSheet.git",
.upToNextMajor(from: "1.0.0"))
],
targets: [
.target(
name: "AppTarget",
dependencies: ["PageSheet"])
]
)If you are using Xcode 13.2.1 you can navigate to the Example folder and open the enclosed Swift App Playground to test various features (and see how they are implemented).
PageSheet works similarly to a typical sheet view modifier.
import SwiftUI
import PageSheet
struct ContentView: View {
@State
private var sheetPresented = false
var body: some View {
Button("Open Sheet") {
sheetPresented = true
}
.pageSheet(isPresented: $sheetPresented) {
Text("Hello!")
}
}
}PageSheet also supports presentation via conditional Identifiable objects.
import SwiftUI
import PageSheet
struct ContentView: View {
@State
private var string: String?
var body: some View {
Button("Open Sheet") {
string = "Hello!"
}
.pageSheet(item: $string) { unwrappedString in
Text(unwrappedString)
}
}
}
extension String: Identifiable {
public var id: String { self }
}PageSheet can also be customized using a collection of view modifiers applied to the sheet's content.
import SwiftUI
import PageSheet
struct ContentView: View {
@State
private var sheetPresented = false
var body: some View {
Button("Open Sheet") {
sheetPresented = true
}
.pageSheet(isPresented: $sheetPresented) {
Text("Hello!")
.preferGrabberVisible(true)
}
}
}PageSheet is split into three different modules, with PageSheetCore handling implementation
and PageSheetPlus providing a new modifier called sheetPreferences(_:).
The namesake module is PageSheet, which combines PageSheetCore & PageSheetPlus into a single import.
If you want to only use PageSheet without the fancy extra modifier (and extra dependency), then use PageSheetCore.
PageSheet is released under the MIT license. See LICENSE for details.