Contents

jokerphuongnam/presentview

PresentView is a lightweight SwiftUI utility that helps manage view presentation in a unified, stack-based way.

Features

  • Centralized presentation state
  • Support for sheet, fullScreenCover, and overlay
  • Nested presentations
  • Environment-based dismiss handling
  • Clean, declarative SwiftUI API

Installation

Swift Package Manager

Add PresentView using Swift Package Manager:

https://github.com/jokerphuongnam/PresentView

Basic Concept

Presentations are managed by an array:

@Published var presented: [Presented<Screen>] = []

Each Presented item describes how a screen is presented.


Usage Example

Screen Enum

enum Screen: Hashable {
    case screenA
    case screenB
    case screenC
}

ContentView

import SwiftUI
import PresentView

struct ContentView: View {
    @StateObject private var vm: ContentViewModel = .init()
    @State private var buttonFrame: CGRect = .zero
    @State private var buttonListFrame: CGRect = .zero
    
    var body: some View {
        PresentView(
            presented: $vm.presented) {
                VStack {
                    Image(systemName: "globe")
                        .imageScale(.large)
                        .foregroundStyle(.tint)
                    Text("Hello, world!")
                    
                    Button {
                        vm.presented.sheet(item: .screenA)
                    } label: {
                        Text("Screen A")
                    }
                    
                    Button {
                        vm.presented.context(item: .screenC, parentFrame: buttonFrame)
                    } label: {
                        Text("Context ScreenC")
                    }
                    .getFrame(frame: $buttonFrame)
                    
                    Button {
                        vm.presented.fullScreenCover(item: .list)
                    } label: {
                        Text("List")
                    }
                    .getFrame(frame: $buttonListFrame)
                }
                .padding()
            } presentedContent: { screen in
                switch screen {
                case .screenA:
                    ScreenA(presented: $vm.presented)
                case .screenB:
                    ScreenB(presented: $vm.presented)
                case .screenC:
                    ScreenC()
                        .shadow(radius: 1)
                        .transparentBackground()
                case .list:
                    ListView(presented: $vm.presented)
                case .item(let index):
                    ItemView(item: index)
                        .shadow(radius: 1)
                }
            }
    }
}

final class ContentViewModel: ObservableObject {
    @Published var presented: [Presented<Screen>] = []
}

Presenting Screens

Sheet

presented.sheet(item: .screenA)

Full Screen Cover

presented.fullScreenCover(item: .screenB)

Overlay

presented.overlay(item: .screenC)

Context

presented.context(item: .item(index: index), parentFrame: parentFrame)

With custom background:

presented.overlay(item: .screenC) {
    Color.white.opacity(0.3)
}

Dismissing

Access the dismiss handler from the environment:

@Environment(\.dismissPresented) private var dismissPresented

Dismiss the current presentation:

dismissPresented()

Check if dismissal is possible:

dismissPresented.canDismiss

Transparent Background for `fullScreenCover`

This feature provides a SwiftUI modifier that allows fullScreenCover to display with a transparent background instead of the default opaque presentation.

Usage

.transparentBackground()

License

MIT License. See LICENSE for details.

Contributing

Please read CONTRIBUTING.md before submitting a pull request.

Package Metadata

Repository: jokerphuongnam/presentview

Default branch: main

README: README.md