Skip to content
/ Popups Public

Popups, popovers, sheets, alerts, toasts, banners, (...) presentation made simple. Written with and for SwiftUI.

License

Notifications You must be signed in to change notification settings

Mijick/Popups

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

57 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation


PopupView Logo

Popups presentation made simple

Create beautiful and fully customisable popups in no time. Keep your code clean

Try demo we prepared | Roadmap | Propose a new feature


SwiftUI logo Platforms: iOS, iPadOS, macOS, tvOS Current Version License: Apache 2.0

Made in Kraków Follow us on X Join our community Stargazers

Popup Examples Popup Examples Popup Examples


MijickPopups is a free and open-source library dedicated for SwiftUI that makes the process of presenting popups easier and much cleaner.

  • Improves code quality. Show your popup using the present() method.
    Hide with dismissLastPopup(). Simple as never.
  • Create any popup. We know how important customisation is; that's why we give you the opportunity to design your popup in any way you like.
  • Designed for SwiftUI. While developing the library, we have used the power of SwiftUI to give you powerful tool to speed up your implementation process.

Getting Started

✋ Requirements

Platforms Minimum Swift Version
iOS 14+ 6.0
iPadOS 14+ 6.0
macOS 12+ 6.0
tvOS 15+ 6.0
watchOS 4+ 6.0
visionOS 1+ 6.0

⏳ Installation

Swift Package Manager is a tool for automating the distribution of Swift code and is integrated into the Swift compiler.

Once you have your Swift package set up, adding MijickPopups as a dependency is as easy as adding it to the dependencies value of your Package.swift.

dependencies: [
    .package(url: "https://github.com/Mijick/Popups.git", branch(“main”))
]

Cocoapods is a dependency manager for Swift and Objective-C Cocoa projects that helps to scale them elegantly.

Installation steps:

    pod init
  • Add CocoaPods dependency into your Podfile
    pod 'MijickPopups'
  • Install dependency and generate .xcworkspace file
    pod install
  • Use new Xcode project file .xcworkspace

Usage

1. Setup library

The library can be initialised in either of two ways:

  1. DOES NOT WORK with SwiftUI sheets
    Inside your @main structure call the registerPopups() method. It takes the optional argument - configBuilder, that can be used to configure some modifiers for all popups in the application.
@main struct App_Main: App {
   var body: some Scene { WindowGroup {
       ContentView()
           .registerPopups { config in config
               .vertical { $0
                   .enableDragGesture(true)
                   .tapOutsideToDismissPopup(true)
                   .cornerRadius(32)
               }
               .centre { $0
                   .tapOutsideToDismissPopup(false)
                   .backgroundColor(.white)
               }
           }
   }}
}
  1. WORKS with SwiftUI sheets. Only for iOS
    Declare an AppDelegate class conforming to UIApplicationDelegate and add it to the @main structure.
@main struct App_Main: App {
   @UIApplicationDelegateAdaptor(AppDelegate.self) var appDelegate


   var body: some Scene { WindowGroup(content: ContentView.init) }
}


class AppDelegate: NSObject, UIApplicationDelegate {
   func application(_ application: UIApplication, configurationForConnecting connectingSceneSession: UISceneSession, options: UIScene.ConnectionOptions) -> UISceneConfiguration {
       let sceneConfig = UISceneConfiguration(name: nil, sessionRole: connectingSceneSession.role)
       sceneConfig.delegateClass = CustomPopupSceneDelegate.self
       return sceneConfig
   }
}


class CustomPopupSceneDelegate: PopupSceneDelegate {
   override init() { super.init()
       configBuilder = { $0
           .vertical { $0
               .enableDragGesture(true)
               .tapOutsideToDismissPopup(true)
               .cornerRadius(32)
           }
           .centre { $0
               .tapOutsideToDismissPopup(false)
               .backgroundColor(.white)
           }
       }
   }
}

2. Declare a structure of your popup

The library provides an ability to present your custom view in three predefinied places - Top, Centre and Bottom.
In order to present it, it is necessary to confirm to one of the protocols during your view declaration:

  • TopPopup - presents popup view from the top
  • CentrePopup - presents popup view from the center
  • BottomPopup - presents popup view from the bottom

So that an example view you want to present will have the following declaration:

struct BottomCustomPopup: BottomPopup {
    ...
}

3. Declare body variable

The variable above declares the design of the popup.

struct BottomCustomPopup: BottomPopup {    
    var body: some View {
        HStack(spacing: 0) {
            Text("Witaj okrutny świecie")
            Spacer()
            Button(action: dismiss) { Text("Dismiss") } 
        }
        .padding(.vertical, 20)
        .padding(.leading, 24)
        .padding(.trailing, 16)
    }
    ...
}

4. Implement configurePopup(config: Config) -> Config method

Declaring this step is optional - if you wish, you can skip this step and leave the UI configuration to us.
Each protocol has its own set of methods that can be used to create a unique appearance for every popup.

struct BottomCustomPopup: BottomPopup {    
    var body: some View {
        HStack(spacing: 0) {
            Text("Witaj okrutny świecie")
            Spacer()
            Button(action: dismiss) { Text("Dismiss") } 
        }
        .padding(.vertical, 20)
        .padding(.leading, 24)
        .padding(.trailing, 16)
    }
    func configurePopup(config: BottomPopupConfig) -> BottomPopupConfig {
        config
            .horizontalPadding(20)
            .bottomPadding(42)
            .cornerRadius(16)
    }
    ...
}

5. Present your popup from any place you want!

Just call BottomCustomPopup().present() from the selected place. Popup can be closed automatically by adding the dismissAfter() modifier.

struct SettingsViewModel {
    ...
    func saveSettings() {
        ...
        BottomCustomPopup()
            .dismissAfter(5)
            .present()
        ...
    }
    ...
}

6. Closing popups

There are two methods to do so:

  • By calling one of the methods dismissLastPopup, dismissPopup(_ type: Popup.Type), dismissPopup(_ id: String), dismissAllPopups inside the popup you created
struct BottomCustomPopup: BottomPopup {
    ...
    func createButton() -> some View {
        Button(action: dismissLastPopup) { Text("Tap to close") } 
    }
    ...
}
  • By calling one of three static methods of PopupManager:
    • PopupManager.dismissLastPopup()
    • PopupManager.dismissPopup(_ type: Popup.Type) where popup is the popup you want to close
    • PopupManager.dismissPopup(_ id: String) where ID is the ID of the popup you want to close
    • PopupManager.dismissAllPopups()

Postscript

The framework has extensive documentation built in, so in case of any problems, please use the Xcode Quick Help 😉

Try our demo

See for yourself how does it work by cloning project we created

License

MijickPopups is released under the Apache License 2.0. See LICENSE for details.



Our other open source SwiftUI libraries

NavigationView - Easier and cleaner way of navigating through your app
CalendarView - Create your own calendar object in no time
GridView - Lay out your data with no effort
CameraView - The most powerful CameraController. Designed for SwiftUI
Timer - Modern API for Timer