LNPopupController is a framework for presenting view controllers as popups of other view controllers, much like the Apple Music and Podcasts apps.

Overview

LNPopupController

LNPopupController is a framework for presenting view controllers as popups of other view controllers, much like the Apple Music and Podcasts apps.

For SwiftUI, check out my LNPopupUI library.

GitHub release GitHub stars GitHub license PayPal Donation Button

GitHub issues GitHub contributors Swift Package Manager compatible Carthage compatible

See a video of the modern popup look & feel here and a video of the classic popup look & feel here.

Once a popup bar is presented with a content view controller, the user can swipe or tap the popup bar at any point to present the popup. After finishing, the user dismisses the popup by either swiping or tapping the popup close button.

The framework is intended to be very generic and work in most situations, so it is implemented as a category over UIViewController. Each view controller can present a popup bar, docked to a bottom view. For UITabBarController subclasses, the default docking view is the tab bar. For UINavigationController subclasses, the default docking view is the toolbar. For other classes, the popup bar is presented at the bottom of the screen. View controller subclasses can provide their own docking views.

The framework correctly maintains the safe area insets of the container controller’s view and its child controllers, as the popup bar is presented and dismissed.

The information displayed on the popup bar is provided dynamically with popup item objects (instances of the LNPopupItem class) associated with the popup content view controllers. To change this information, update the popup item of the view controller.

Generally, it is recommended to present the popup bar on the outermost container controller. So if you have a view controller contained in a navigation controller, which is in turn contained in a tab bar controller, it is recommended to present the popup bar on the tab bar controller.

Check the demo project for many common use cases of the framework in various scenarios. It contains examples in Swift and Objective C.

Features

  • Available for iOS 13 and above, as an Xcode framework or an SPM package
  • Good citizen in modern UIKit world
  • Modern Objective C syntax and great Swift interoperability
  • For SwiftUI, check out my LNPopupUI library.

Adding to Your Project

Swift Package Manager

Swift Package Manager is the recommended way to integrate LNPopupController in your project.

LNPopupController supports SPM versions 5.1.0 and above. To use SPM, you should use Xcode 11 to open your project. Click File -> Swift Packages -> Add Package Dependency, enter https://github.com/LeoNatan/LNPopupController. Select the version you’d like to use.

You can also manually add the package to your Package.swift file:

.package(url: "https://github.com/LeoNatan/LNPopupController.git", from: "2.9.2")

And the dependency in your target:

.target(name: "BestExampleApp", dependencies: ["LNPopupController"]),

Carthage

Add the following to your Cartfile:

github "LeoNatan/LNPopupController"

Make sure you follow the Carthage integration instructions here.

Manual

Drag the LNPopupController.xcodeproj project to your project, and add LNPopupController.framework to Embedded Binaries in your project target's General tab. Xcode should sort everything else on its own.

CocoaPods

CocoaPods is not supported. There are many reasons for this. Instead of CocoaPods, use Swift Package Manager from within Xcode. You can continue using CocoaPods for for your other dependencies and Swift Package Manager for LNPopupController.

Using the Framework

Swift

While the framework is written in Objective C, it uses modern Objective C syntax, so using the framework in Swift is very easy and intuitive.

Project Integration

Import the module in your project:

import LNPopupController

Popup Items

A popup item should always reflect the popup information about the view controller with which it is associated. The popup item should provide a title and subtitles to display in the popup bar, when the view controller is presented as a popup content controller. In addition, the item may contain additional buttons to display on the leading and/or trailing edges of the popup bar using leadingBarButtonItems and trailingBarButtonItems.

Managing the Popup Bar

To present the popup bar, create a content controller, update its popup item and present the popup bar.

let demoVC = DemoPopupContentViewController()
demoVC.view.backgroundColor = .red
demoVC.popupItem.title = "Hello World"
demoVC.popupItem.subtitle = "And a subtitle!"
demoVC.popupItem.progress = 0.34
	
tabBarController?.presentPopupBar(withContentViewController: demoVC, animated: true, completion: nil)

You can present a new content controller while the popup bar is presented and when the popup itself is open.

To open and close the popup programatically, use openPopup(animated:completion:) and closePopup(animated:completion:) respectively.

tabBarController?.openPopup(animated: true, completion: nil)

Alternatively, you can present the popup bar and open the popup in one animation, using presentPopupBar(withContentViewController:openPopup:animated:completion:).

tabBarController?.presentPopupBar(withContentViewController: demoVC, openPopup:true, animated: true, completion: nil)

To dismiss the popup bar, use dismissPopupBarAnimated:completion:.

tabBarController?.dismissPopupBar(animated: true, completion: nil)

If the popup is open when dismissing the popup bar, the popup content will also be dismissed.

Popup Container View Controllers

Any UIViewController subclasses can be popup container view controllers. The popup bar is attached to a bottom docking view. By default, UITabBarController and UINavigationController subclasses return their bottom bars as docking view, while other controllers return a hidden 0pt height view on the bottom of the view. In your subclass, override bottomDockingViewForPopupBar and defaultFrameForBottomDockingView and return your view and frame accordingly. The returned view must be attached to the bottom of the view controller's view, or results are undefined.

override var bottomDockingViewForPopupBar: UIView? {
  return myCoolBottomView
}

override var defaultFrameForBottomDockingView: CGRect {
  var bottomViewFrame = myCoolBottomView.frame
  
  if isMyCoolBottomViewHidden {
    bottomViewFrame.origin = CGPoint(x: bottomViewFrame.x, y: view.bounds.height)
  } else {
    bottomViewFrame.origin = CGPoint(x: bottomViewFrame.x, y: view.bounds.height - bottomViewFrame.height)
  }
  
  return bottomViewFrame
}

Appearance and Behavior

LNPopupController provides two distinct styles of popup look and feel, one based on modern Music app look and feel, and one based on the previous, iOS 9-style look and feel. Popup bar styles are arbitrarily labeled "prominent" for modern style popup bar and "compact" for iOS 9-style. Popup interaction styles are labeled "snap" for modern style snapping popups and "drag" for iOS 9 interactive popup interaction. Popup close buttons styles are labeled "chevron" for modern style chevron close button and "round" for iOS 9-style close buttons. For each, there is a "default" style for choosing the most suitable one for the current platform and operating system version.

The defaults are:

  • Prominent bar style
  • Snap interaction style
  • Chevron close button style
  • No progress view style

You can also present completely custom popup bars. For more information, see Custom Popup Bars.

By default, for navigation and tab bar container controllers, the appearance of the popup bar is determined according to the bottom bar's appearance. For other container controllers, a default appearance is used, most suitable for the current environment.

To disable inheriting the bottom bar’s appearance, set the inheritsAppearanceFromDockingView property to false.

Bar Style

Customizing the popup bar style is achieved by setting the popup bar's barStyle property.

navigationController?.popupBar.barStyle = .compact

Interaction Style

Customizing the popup interaction style is achieved by setting the popup presentation containing controller's popupInteractionStyle property.

navigationController?.popupInteractionStyle = .drag

Progress View Style

Customizing the popup bar progress view style is achieved by setting the popup bar's progressViewStyle property.

navigationController?.popupBar.progressViewStyle = .top

To hide the progress view, set the progressViewStyle property to LNPopupBarProgressViewStyle.none.





Close Button Style

Customizing the popup close button style is achieved by setting the popup content view's popupCloseButtonStyle property.

navigationController.popupContentView.popupCloseButtonStyle = .round

To hide the popup close button, set the popupCloseButtonStyle property to LNPopupCloseButtonStyle.none.





Text Marquee Scroll

Supplying long text for the title and/or subtitle will result in a scrolling text, if text marquee is enabled. Otherwise, the text will be truncated.

Popup Bar Customization

LNPopupBar exposes API to customize the default popup bar's appearance, either through UIAppearance API or directly on a specific popup bar object. Use LNPopupBarAppearance objects to define the standard appearance of the bar.

Remember to set the inheritsAppearanceFromDockingView property to false, or your customization is likely to be overridden by the bottom bar’s appearance.

let appearance = LNPopupBarAppearance()
appearance.titleTextAttributes = [.font: UIFont(name: "Chalkduster", size: 14)!, .foregroundColor: UIColor.yellow]
appearance.subtitleTextAttributes = [.font: UIFont(name: "Chalkduster", size: 12)!, .foregroundColor: UIColor.green]
appearance.backgroundEffect = UIBlurEffect(style: .systemChromeMaterialDark)

let appearanceProxy = LNPopupBar.appearance(whenContainedInInstancesOf: [UINavigationController.self])
appearanceProxy.inheritsAppearanceFromDockingView = false
appearanceProxy.standardAppearance = appearance
appearanceProxy.tintColor = .yellow

Custom Popup Bars

The framework supports implementing custom popup bars.

To implement a custom popup bar, you subclass LNPopupCustomBarViewController.

In your LNPopupCustomBarViewController subclass, build your popup bar's view hierarchy and set the controller's preferredContentSize property with the preferred popup bar height. Override any of the wantsDefaultTapGestureRecognizer, wantsDefaultPanGestureRecognizer and/or wantsDefaultHighlightGestureRecognizer properties to disable the default gesture recognizers functionality in your custom popup bar.

In your subclass, implement the popupItemDidUpdate() method to be notified of updates to the popup content view controller's item, or when a new popup content view controller is presented (with a new popup item). You must call the super implementation of this method.

Finally, set the customBarViewController property of the popup bar object to an instance of your LNPopupCustomBarViewController subclass. This will change the bar style to LNPopupBarStyle.custom.

The included demo project includes two example custom popup bar scenes.

System Interactions

The hidesBottomBarWhenPushed property is supported for navigation and tab bar controllers. When set to true, the popup bar will transition to the bottom of the pushed controller's view. Setting isToolbarHidden = true and calling setToolbarHidden(_:animated:) are also supported.

Status bar management of the popup content view controller is respected and applied when appropriate.

Context menus are supported. Add a UIContextMenuInteraction interaction object to the popup bar, and it will behave as expected.

Pointer interactions are supported, and a default implementation is provided for system bar styles.

For custom popup bar controllers, the LNPopupCustomBarViewController class implements the UIPointerInteractionDelegate protocol. Implement the protocol's methods inside your subclass to implement custom pointer interactions.

Starting with iOS 15, scroll edge appearance is automatically disabled for toolbars and tab bars when a popup bar is presented, regardless of the scroll position of the content. Once the popup bar is dismissed, the scroll edge appearance is restored.

Interaction Gesture Recognizer

LNPopupContentView exposes access to the popup interaction gesture recognizer in the way of the popupInteractionGestureRecognizer property. This gesture recognizer is shared between opening the popup content, by panning the popup bar up (when the popup bar is closed), and closing the popup content, by panning the popup content view (when the popup bar is open).

When opening the popup, the system queries the viewForPopupInteractionGestureRecognizer property of the popup content view controller to determine to which view to add the interaction gesture recognizer. By default, the property returns the controller's root view. Override the property's getter to change this behavior.

You can implement the delegate of the interaction gesture recognizer in order to influence its behavior, such as preventing popup interaction when the user is interacting with other controls or views inside the popup content.

Note: If you disable the gesture recognizer after opening the popup, you must monitor the state of the popup and reenable the gesture recognizer once closed by the user or through code. Instead, consider implementing the gesture recognizer's delegate and providing custom logic to disable the interaction.

Full Right-to-Left Support

The framework has full right-to-left support.

By default, the popup bar will follow the system's user interface layout direction, but will preserve the bar button items' order. To customize this behavior, modify the popup bar's semanticContentAttribute and barItemsSemanticContentAttribute properties.

Accessibility

The framework supports accessibility and will honor accessibility labels, hints and values. By default, the accessibility label of the popup bar is the title and subtitle provided by the popup item.

To modify the accessibility label and hint of the popup bar, set the accessibilityLabel and accessibilityHint properties of the LNPopupItem object of the popup content view controller.

demoVC.popupItem.accessibilityLabel = NSLocalizedString("Custom popup bar accessibility label", comment: "")
demoVC.popupItem.accessibilityHint = NSLocalizedString("Custom popup bar accessibility hint", comment: "")

To add accessibility labels and hints to buttons, set the accessibilityLabel and accessibilityHint properties of the UIBarButtonItem objects.

let upNext = UIBarButtonItem(image: UIImage(named: "next"), style: .plain, target: self, action: #selector(nextItem))
upNext.accessibilityLabel = NSLocalizedString("Up Next", comment: "")
upNext.accessibilityHint = NSLocalizedString("Double tap to show up next list", comment: "")

To modify the accessibility label and hint of the popup close button, set the accessibilityLabel and accessibilityHint properties of the LNPopupCloseButton object of the popup container view controller.

tabBarController?.popupContentView.popupCloseButton.accessibilityLabel = NSLocalizedString("Custom popup close button accessibility label", comment: "")
tabBarController?.popupContentView.popupCloseButton.accessibilityHint = NSLocalizedString("Custom popup close button accessibility hint", comment: "")

To modify the accessibility label and value of the popup bar progress view, set the accessibilityProgressLabel and accessibilityProgressValue properties of the LNPopupItem object of the popup content view controller.

demoVC.popupItem.accessibilityImageLabel = NSLocalizedString("Custom image label", comment: "")
demoVC.popupItem.accessibilityProgressLabel = NSLocalizedString("Custom accessibility progress label", comment: "")
demoVC.popupItem.accessibilityProgressValue = "\(accessibilityDateComponentsFormatter.stringFromTimeInterval(NSTimeInterval(popupItem.progress) * totalTime)!) \(NSLocalizedString("of", comment: "")) \(accessibilityDateComponentsFormatter.stringFromTimeInterval(totalTime)!)"

Notes

  • Legacy non-translucent tab bar and toolbars are not supported and can cause visual artifacts or layout glitches. Apple has many problem with such bars, and supporting those is not a priority for LNPopupController
    • The correct way to achieve an opaque bar is to use the UIBarAppearance.configureWithOpaqueBackground() API, which is supported by LNPopupController
  • Manually setting bottom bar properties, such as setting a tab bar’s or a toolbar’s isHidden = true is explicitly discouraged by Apple and not supported by the framework; it will lead to undefined behavior by the framework

Acknowledgements

The framework uses:

Additionally, the demo project uses:

Comments
  • iOS 13 Support

    iOS 13 Support

    Description

    When presenting a popupController on iOS 13, the application crashes. The device log says:

    Terminating app due to uncaught exception 'NSGenericException', reason: 'Access to _UIBarBackground's _shadowView ivar is prohibited. This is an application bug'

    An exception breakpoint reveals the issue to be caused in LNPopupController.m:924:

    self.popupBar.systemShadowColor = [_bottomBar valueForKeyPath:str2];
    

    So apparently we can't set that property anymore.

    Steps to Reproduce

    Present a popupBar on iOS 13

    Device, OS and Xcode Versions

    iPhone Xs iOS 13 beta 1 Xcode 11 beta 1

    enhancement 
    opened by JacobSyndeo 57
  • UIButton action in bar controller is ignored in 2.10.0

    UIButton action in bar controller is ignored in 2.10.0

    Description

    UIButton action not triggered anymore in CustomBarViewController. It worked in 2.8.5 but not in 2.10.0 anymore.

    Steps to Reproduce

    Use an UIButton in the UIViewController that you use for setCustomBarViewController. Touch the button. The action of that button is not triggered. Instead the full screen controller is presented.

    Device, OS and Xcode Versions

    iPhone X, iOS 14, Xcode 12 beta 4

    bug more info needed 
    opened by MacMark 42
  • Compact bar does not layout titles correctly.

    Compact bar does not layout titles correctly.

    I am currently using the compact size bar. I have a button on each side of the bar which I am adding a custom images to.

    What is the correct size of the image I should add?

    Also the title is not centered exactly in the middle inside the bar? I do not know if this is because the image sizes I am setting is wrong?

    Here is how I am setting my buttons

    closeBarButtonItem = UIBarButtonItem(image: #imageLiteral(resourceName: "close"), style: .plain, target: self, action: #selector nil)
    playPauseButtonItem = UIBarButtonItem(image: #imageLiteral(resourceName: "pause"), style: .plain, target: self, action: #selector nil)
    
    		self.popupItem.leftBarButtonItems = [closeBarButtonItem]
    		self.popupItem.rightBarButtonItems = [playPauseButtonItem]
    

    Here is an example of the issue in terms of the text not being centered which I tried to highlight using Sketch.

    screen shot 2018-03-13 at 12 31 30 am

    bug 
    opened by JayceBryce 39
  • How to drag down the screen with horizontal Collection View?

    How to drag down the screen with horizontal Collection View?

    I have a horizontal Collection View in my View Controller that is presented by LNPopupController and I can't find a way to register dragging down the controller if the touches are in the Collection View's area. If I disable scrolling of Collection View it works great but disabling it is out of question, also subclassing UICollectionView and using UIGestureDelegate's method gestureRecognizer(_ gestureRecognizer: UIGestureRecognizer, shouldRecognizeSimultaneouslyWith otherGestureRecognizer: UIGestureRecognizer) doesn't make any difference.

    question needs investigation 
    opened by wiencheck 35
  • Split view controller issue

    Split view controller issue

    Description

    In your example, when I run it on iPad, iOS 14 with Xcode 12.0 beta 3, split view controller demo is broken. First, I think (for the detail view controller):

        if (@available(iOS 14.0, *)) {
            self.preferredSplitBehavior = UISplitViewControllerSplitBehaviorTile;
        }
    

    And secondly, and I think it may be an Apple bug, the x origin of the container view frame is -100.

    What do you think ?

    Thanks.

    Steps to Reproduce

    Run your example

    Device, OS and Xcode Versions

    iOS 14, Xcode 12.0 beta 3, Simulator.

    bug 
    opened by iDevelopper 33
  • Custom Popup Bar with transparent background

    Custom Popup Bar with transparent background

    Hi and thanks for this amazing library, I've ran into a problem of my own though. I'm wondering if it's possible to make the background color of the minimized view clear instead of just tinting it like in the example. I've tried changing the color in several places but it's only ending up with a completely black background. Look at the image provided to see what i'm trying to achieve. Thanks!

    customvc

    Something like the minimized youtube player would also be great to achieve, I haven't had any luck by changing the cornerradius (and also using masktobounds of course) img_0098

    question 
    opened by degello 33
  • iOS 10.2 tableview footer is not resizing when music toolbar is present

    iOS 10.2 tableview footer is not resizing when music toolbar is present

    I noticed that on iOS 10 tableview footer is not resizing when music toolbar is present, so when scrolling down music bar hides bottom cells. on iOS 11 I don't have that issue. I am not exact sure is this library fault or it's how actually tableview works? any ideas @LeoNatan ?

    bug 
    opened by yarodevuci 28
  • Extend popup bar past safe insets

    Extend popup bar past safe insets

    I can't figure out how to extend the popup bar past the safe insets. I tried looking through other issues but didn't understand your proposed solution of adding a new view to dock to. Any help would be awesome!

    question 
    opened by nfiacco 27
  • How can I achive this?

    How can I achive this?

    Tabbar code.

      let customMapBar = exploreStoryBoard.instantiateViewController(withIdentifier: "PopUpSongsInfo") as? PopUpSongsInfo
            customMapBar?.view.backgroundColor = .clear
            tabBarController?.popupBar.customBarViewController = customMapBar
            tabBarController?.popupContentView.popupCloseButtonStyle = .none
            tabBarController?.popupContentView.isTranslucent = false
            tabBarController?.popupInteractionStyle = .default
            
            popupContentVC = exploreStoryBoard.instantiateViewController(withIdentifier: "SongsQueueVC") as? SongsQueueVC
            tabBarController?.popupBar.barStyle = .custom
            customMapBar?.lblArtistname.text = "maulik"
            tabBarController?.presentPopupBar(withContentViewController: self.popupContentVC, animated: false, completion: nil)
    
    

    Push issue.

    1. push from here
    Screenshot 2021-03-14 at 9 45 21 AM
    1. push from open window

    Hope you can help me.@leoNatan . if you can help me via Skype then I will share my Skype id.

    question 
    opened by maulikshah09 25
  • Can't swipe down to dismiss when tableView is inside the Tab Bar Controller

    Can't swipe down to dismiss when tableView is inside the Tab Bar Controller

    Swipe down is possible in tableView when view hierarchy looks like this: - Main View Controller -- Popup View --- Table View Controller

    In this case, when user scrolls to top, they can swipe down to dismiss the popup.

    I want to include a Tab Bar inside a Popup: - Main View Controller -- Popup View --- Tab Bar Controller ---- Table View Controller ---- Another View Controller

    But in this case, swipe down to dismiss isn't possible inside the tableView. If you swipe down to dismiss outside the tableView, or in another View Controller, everything works fine.

    So, is it possible to retain the swipe down to dismiss action even when the Table View Controller is inside a Tap Bar Controller.

    enhancement 
    opened by MaticConradi 24
  • Refer to customBarViewController always gives `nil`

    Refer to customBarViewController always gives `nil`

    I am trying to use the custom controller as a popupBar and for that, I set up code like

        let customPlayerBar = PlayerPopUpBarVC.instantiate()
        self.tabBarController?.popupBar.customBarViewController = customPlayerBar
        self.tabBarController?.presentPopupBar(withContentViewController: vc, openPopup: true, animated: true, completion: nil)
    

    Now, the problem is when I'm trying to refer customBarViewController, it gives me nil

        if let customItem = self.tabBarController?.popupBar.customBarViewController as? PlayerPopUpBarVC { } // I got nil here 
    

    So, What's the correct way to refer customBarViewController that we can change/ update elements that are part of it.

    Device, OS and Xcode Versions

    Simulator: iPhone 11, XCode Version 11.2.1, iOS 13 Device: iPhone 7, XCode Version 11.2.1, iOS 13

    question 
    opened by StackHelp 22
  • LNPopupController 3.0 tracking

    LNPopupController 3.0 tracking

    I've started work on 3.0.

    It is intended as a general rewrite of the entire presentation model. The idea is to use UIPresentationController subclasses with custom animation and interaction controllers. (#225) This will greatly simplify the presentation system and allow many more features, such as "free" card presentation on iOS 13.

    Planned features that will also make the cut for 3.0:

    • Animations that run alongside the presentation animations of the popup (#211)
    • Supporting card presentations (iOS 13, for now, but can be any OS version with a custom presentation controller) (#143)
    • Dimming of contents under the popup (#325)
    • Remove legacy iOS support (#335)

    The goal is to support as much of the current feature set, as possible. Some minor changes to look and feel might happen due to the transition to presentation controllers. There are still some unknowns.

    The effort is being implemented in the v3_0 branch. So far, I have removed all legacy code, removed all old presentation code and have a proof of concept using the iOS 13 card presentation controller as the basis for popup presentation.

    Todo:

    • [x] Add support for full screen popup presentation
    • [ ] Add support for interactive ("Drag") presentation
    • [x] Add support for iOS 13 interactive card presentation
    • [x] Explore card presentations for iOS 12 and below
    • [x] Explore non-full width presentations
    • [ ] Explore embedding the popup bar inside bottom bars, such as tab bars
    • [ ] Explore the possibility of the bar's background view extending under the hosting view's safe areas
    enhancement 
    opened by LeoNatan 5
Releases(2.14.8)
  • 2.14.8(Dec 9, 2022)

  • 2.14.7(Dec 9, 2022)

  • 2.14.6(Nov 7, 2022)

  • 2.14.5(Oct 26, 2022)

  • 2.14.4(Oct 21, 2022)

    • Further refinements for Swift

    • LNPopupItem.attributedTitle and LNPopupItem.attributedSubtitle are now exposed to Swift as Foundation.AttributedString values, rather than NSAttributedString objects. If you need to support iOS older than 15, assign the __attributedTitle and __attributedSubtitle properties directly with NSAttributedString objects

    • Fixed an issue where setting a .customizedSnap(percent) and then .snap interaction styles in Swift would not reset the percent correctly to .defaultPopupSnapPercent

    Source code(tar.gz)
    Source code(zip)
  • 2.14.3(Oct 12, 2022)

  • 2.14.2(Oct 11, 2022)

    Improved the popup bar dismiss transition by supporting fading out when it makes sense.

    By default, the popup bar is faded out during dismissal if the popup bar is extended (see UIViewController.shouldExtendPopupBarUnderSafeArea) and the extension is visible, or if the bottom bar (toolbar or tab bar) is about to transition to its scroll edge appearance, and the scroll edge appearance has a transparent background.

    Source code(tar.gz)
    Source code(zip)
  • 2.14.1(Oct 10, 2022)

  • 2.14.0(Oct 4, 2022)

  • 2.13.7(Jun 24, 2022)

  • 2.13.6(Jun 24, 2022)

  • 2.13.5(Jun 22, 2022)

  • 2.13.4(Apr 1, 2022)

  • 2.13.3(Dec 17, 2021)

  • 2.13.2(Dec 17, 2021)

  • 2.13.1(Nov 14, 2021)

    • Fixed an issue where navigation controllers with hidden toolbars would not show a bar extension on first bar presentation
    • Improved the bar extension dismiss animation
    Source code(tar.gz)
    Source code(zip)
  • 2.13.0(Nov 6, 2021)

    • Introduced better delegate methods for popup will/didOpen/Close, providing the popup content controller as an argument
    • The popup willOpen/Close delegate methods are now called inside an animation block to allow user animations
    • The willPresent/Dismiss popup bar delegate methods are now called inside an animation block to allow user animations
    • Improved content controller appearance/disappearance methods callback
    • The content controller viewWillAppear/Disappear methods are now called inside an animation block (when appropriate) to allow user animations
    • A background effect will always be applied to the popup content view
    Source code(tar.gz)
    Source code(zip)
  • 2.12.7(Nov 1, 2021)

    • Added API for setting bar button items with animations (defaults to no animation)
    • Bar extension appearance and disappearance will now be animated alongside the bar presentation & dismissal animations
    Source code(tar.gz)
    Source code(zip)
  • 2.12.6(Sep 20, 2021)

  • 2.12.5(Sep 19, 2021)

  • 2.12.4(Aug 31, 2021)

  • 2.12.3(Aug 11, 2021)

  • 2.12.2(Aug 10, 2021)

  • 2.12.1(Aug 7, 2021)

    • Notify custom bar controllers of active appearance change
    • Automatically handle scroll edge appearance for toolbars and tab bars starting with iOS 15
    Source code(tar.gz)
    Source code(zip)
  • 2.12.0(Aug 2, 2021)

    • Added support for customized snap interaction style using .customizedSnap(percent:) (Swift) and popupSnapPercent (ObjC)

    • Swift Package gymnastics were applied to support Swift refinements for LNPopupController

      • If you see any issues as a result of this change, please open an issue!
    Source code(tar.gz)
    Source code(zip)
  • 2.11.6(Jul 4, 2021)

  • 2.11.5(Jul 2, 2021)

  • 2.11.4(Jun 30, 2021)

  • 2.11.3(Jun 30, 2021)

  • 2.11.2(Jun 29, 2021)

Owner
Leo Natan
Senior macOS & iOS software engineer at InVision. Previously mobile technology leading at Wix and Check Point Software Technologies
Leo Natan
Toasts and popups library written with SwiftUI

Popup View Toasts and popups library written with SwiftUI We are a development agency building phenomenal apps. Usage Put all your body code into a ZS

Exyte 1.9k Jan 6, 2023
MIBlurPopup lets you create popups with a blurred background

MIBlurPopup MIBlurPopup lets you create amazing popups with a blurred background Setup Add pod 'MIBlurPopup' to your Podfile or copy the "MIBlurPopup.

Mario Iannotta 607 Nov 24, 2022
Create fully customizable popups easier than ever before ⚜️

FlexFlex Create fully customizable popups easier than ever before. ?? Installation FlexFlex requires iOS 13 and Xcode 12. 1️⃣ In Xcode go to File ➤ Ad

adri567 2 Aug 15, 2022
⛩ Presenting custom views as a popup in iOS.

FFPopup is a lightweight library for presenting custom views as a popup. Bounce from Top & Bounce to Bottom Bounce from Top & Bounce to Top Bounce in

JonyFang 828 Jan 5, 2023
UIViewController drop in replacement with much more customisation

PopupViewController UIAlertController drop in replacement with much more customization You can literally replace UIAlertController by PopupViewControl

Thomas Ricouard 21 Jun 27, 2022
Subscription View Controller like the Tinder uses

SubscriptionPrompt SubscriptionPrompt is a UIViewController with a carousel at the top and a number of rows at the bottom. Written in Swift, works for

Binur Konarbai 235 Nov 17, 2022
STPopup provides STPopupController, which works just like UINavigationController in popup style, for both iPhone and iPad. It's written in Objective-C and compatible with Swift.

STPopup STPopup provides STPopupController, which works just like UINavigationController in popup style, for both iPhone and iPad. It's written in Obj

Kevin Lin 2.6k Jan 6, 2023
SwiftEntryKit is a presentation library for iOS. It can be used to easily display overlays within your iOS apps.

SwiftEntryKit ?? Donations can be made here. Table of Contents Overview Features Example Project Example Project Installation Presets Playground Requi

Daniel Huri 6.1k Jan 6, 2023
Popover is a balloon library like Facebook app. It is written in pure swift.

Popover Description and appetize.io`s DEMO Usage To run the example project, clone the repo, and run pod install from the Example directory first. Sim

Yusuke Takahashi 2k Jan 2, 2023
SSToastMessage is written purely in SwiftUI. It will add toast, alert, and floating message view over the top of any view. It is intended to be simple, lightweight, and easy to use. It will be a popup with a single line of code.

SSToastMessage SSToastMessage is written in SwiftUI. It will add toast, alert, and floating message view over the top of any view. It is intended to b

Simform Solutions 223 Dec 2, 2022
Pop-up based view(e.g. alert sheet), can be easily customized.

MMPopupView 中文介绍 A basic Pop-Up Kit allows you to easily create Pop-Up view. You can focus on the only view you want to show. Besides, it comes with 2

ralph li 2.1k Jan 3, 2023
PopupController is a controller for showing temporary popup view.

PopupController PopupController is a controller for showing temporary popup view. Demo Try PopupController on Appetize.io Installation CocoaPods pod '

daisuke sato 338 Dec 14, 2022
A lightweight library for popup view

SHPopup SHPop is lightweight library used for popup view Sample One Sample Two Sample Three Features SHPopup supports a popup inside another popup wit

Shezad Ahamed 37 Oct 2, 2022
A Swift Popup Module help you popup your custom view easily

JFPopup JFPopup is a Swift Module help you popup your custom view easily. Support 3 way to popup, Drawer, Dialog and BottomSheet. Example To run the e

逸风 77 Dec 14, 2022
Simple way to present custom views as a popup in iOS and tvOS.

PopupKit PopupKit is a simple and flexible iOS framework for presenting any custom view as a popup. It includes a variety of options for controlling h

Pointwelve 59 Mar 1, 2022
A framework for presenting bars and view controllers as popup, much like the look and feel of Apple Music App.

PBPopupController PBPopupController is a framework for presenting bars and view controllers as popup, much like the look and feel of Apple Music App.

Patrick 58 Dec 3, 2022
Now playing controller from Apple Music, Mail & Podcasts Apple's apps.

SPStorkController About Controller as in Apple Music, Podcasts and Mail apps. Help if you need customize height or suppport modal style in iOS 12. Sim

Ivan Vorobei 2.6k Jan 4, 2023
A modern HUD inspired by Apple Music and Apple Podcasts

HUD A modern HUD inspired by Apple Music and Apple Podcasts. Appearance Light Dark HUD Activity Indicator HUD Requirements iOS 13+ Installation You ca

Bei Li 30 Nov 18, 2022
A paging menu controller built from other view controllers placed inside a scroll view (like Spotify, Windows Phone, Instagram)

Unfortunately, life gets in the way sometimes and I won't be able to maintain this library any longer and upgrade this library to where it needs to be

null 5.2k Dec 31, 2022
Swift-music - swift-music is a swift package that provides an easy-to-use API for music related developments.

?? swift-music Introduction swift-music is a swift package that provides an easy-to-use API for music related developments. Currently available module

Jin Zhang 4 Feb 8, 2022