Swiftpack.co - Package - Daltron/NotificationBanner

Notification Banner

Version Platform Language: Swift License

NotificationBanner is being sponsored by the following tool. Please help to support us by taking a look and signing up to a free trial.

Written in Swift 5

NotificationBanner is an extremely customizable and lightweight library that makes the task of displaying in app notification banners and drop down alerts an absolute breeze in iOS.

| Basic Banners | Banners with Side Views | Status Bar Banners | | ------------- | ------------- | ------------- | | Basic Banners | Banners with Side Views | Status Bar Banners |

| Growing Banners | Floating Banners | Stacked Banners | | ------------- | ------------- | ------------- | | Growing Banners | Floating Banners | Floating Banners |

Features

  • Highly customizable ✅
  • NSAttributedString support ✅
  • iPhone, iPhoneX, & iPad Support ✅
  • Orientation change support ✅
  • Custom UIView support ✅
  • Custom colors support ✅
  • Support for long titles/ subtitles ✅
    • NotificationBanner uses horizontal scrolling labels
    • GrowingNotificationBanner grows in height as needed
  • Presenting from top or bottom support ✅
  • Haptic feeback support ✅
  • Built in banner queue ✅
  • Allow to display several banners simultaneously, configurable in banners queue

Requirements

  • iOS 10.0+
  • Xcode 10.0+

Installation

CocoaPods

NotificationBanner is available through CocoaPods. To install it, simply add the following line to your Podfile:

Swift 5 + xCode 11 + iOS 13 Support

pod 'NotificationBannerSwift', '~> 3.0.0'

Swift 5 + xCode 10.x

pod 'NotificationBannerSwift', '2.5.0'

Swift 4.2

pod 'NotificationBannerSwift', '2.0.1'

Swift 4.0

pod 'NotificationBannerSwift', '1.6.3'
pod 'MarqueeLabel/Swift', '3.1.6'

Then add import NotificationBannerSwift at the top of each file you use NotificationBanner in your project.

Carthage

To use NotificationBanner via Carthage simply add this line to your Cartfile:

Swift 5

github "Daltron/NotificationBanner" "master"

Then add NotificationBanner.framework and the dependencies SnapKit.framework and MarqueeLabel.framework in your project.

Usage

Creating drop down alerts with NotificationBanner is easy. To create a regular banner (with scrolling labels) and show it, simply:

let banner = NotificationBanner(title: title, subtitle: subtitle, style: .success)
banner.show()

If you want to create a banner which grows in height as needed and show it accordingly just use GrowingNotificationBanner instead of NotificationBanner:

let banner = GrowingNotificationBanner(title: title, subtitle: subtitle, style: .success)
banner.show()

To create a status bar alert, simply:

let banner = StatusBarNotificationBanner(title: title, style: .success)
banner.show()

By default, each banner will be displayed on the main application window. If you are wanting to show a banner below a navigation bar, simply show on the view controller that is within the navigation system:

banner.show(on: viewController)

By default, each banner will present from the top. If you are wanting to display from the bottom, simply:

banner.show(bannerPosition: .bottom)

Each of the show properties defined above can be mixed and matched to work flawlessly with eachother.

By default, each banner will automatically dismiss after 5 seconds. To dismiss programatically, simply:

banner.dismiss()

To show a banner infinitely until it is manually dismissed, simply:

banner.autoDismiss = false

NotificationBanner has five prebuilt styles that you can choose from:

public enum BannerStyle {
    case danger
    case info
    case customView
    case success
    case warning
}

You can override the predefined colors that NotificationBanner uses for any style by conforming to the BannerColorsProtocol:

public protocol BannerColorsProtocol {
    func color(for style: BannerStyle) -> UIColor
}

Its as easy as creating a custom banner colors class:

class CustomBannerColors: BannerColorsProtocol {

    internal func color(for style: BannerStyle) -> UIColor {
        switch style {
            case .danger:	// Your custom .danger color
            case .info:		// Your custom .info color
            case .customView:	// Your custom .customView color
            case .success:	// Your custom .success color
            case .warning:	// Your custom .warning color
        }
    }

}

And then passing in that class to any notification banner you create:

let banner = NotificationBanner(title: title, style: .success, colors: CustomBannerColors())
banner.show()

By default, the .info style will be applied to the banner if no style is provided in the init method. You can set the background color of a banner at any time by simply setting the backgroundColor.

Banners with Side Views

A notification banner can have a left accessory view, a right accessory view, or both:

// Success Style Notification with Left View
let leftView = UIImageView(image: #imageLiteral(resourceName: "success"))
let banner = NotificationBanner(title: title, subtitle: subtitle, leftView: leftView, style: .success)
banner.show()

 // Danger Style Notification with Right View
let rightView = UIImageView(image: #imageLiteral(resourceName: "danger"))
let banner = NotificationBanner(title: title, subtitle: subtitle, rightView: rightView, style: .danger)
banner.show()    

// Info Style Notification with Left and Right Views
let leftView = UIImageView(image: #imageLiteral(resourceName: "info"))
let rightView = UIImageView(image: #imageLiteral(resourceName: "right_chevron"))
let banner = NotificationBanner(title: title, subtitle: subtitle, leftView: leftView, rightView: rightView, style: .info)
banner.show()

Banners with Side Views

Each side view will be automically reisized to fit perfectly

Banners with a Custom View

A notification banner can also be initalized with a custom view:

let banner = NotificationBanner(customView: NorthCarolinaBannerView())
banner.show()

Custom Banner

Handling User Interaction

By default, when a banner is tapped or swiped up by a user, it will be dismissed. If you want to detect when the user taps or swipes up on a banner, simply:

banner.onTap = {
	// Do something regarding the banner
}
banner.onSwipeUp = {
	// Do something regarding the banner
}

Banner Events

You can choose to opt into a notification banner's events by registering as its delegate:

banner.delegate = self

Then just make sure to implement the following methods:

internal func notificationBannerWillAppear(_ banner: BaseNotificationBanner)
internal func notificationBannerDidAppear(_ banner: BaseNotificationBanner)
internal func notificationBannerWillDisappear(_ banner: BaseNotificationBanner)
internal func notificationBannerDidDisappear(_ banner: BaseNotificationBanner)

Haptic Feedback Support

By default, when a banner is displayed, a haptic feedback will be generated on devices that support it. The types of haptic feedback are as follows:

public enum BannerHaptic {
    case light
    case medium
    case heavy
    case none
}

To change the type of haptic feedback to generate when a banner is shown, simply:

banner.haptic = .heavy

Banner Queue

By default, each notification banner is placed onto a singleton of an auto-managed NotificationBannerQueue. This allows an infinite amount of banners to be displayed without one hiding the other. If you have multiple controllers within your navigation stack that need to be managed by a seperate queue (like a tab bar controller), simply create an instance of a NotificationBannerQueue and pass it in to the show function:

banner.show(queue: customQueue)

By default, each notification banner is placed on the back of the queue. If you would rather place the banner in the front and show it immediately no matter how many banners are in the queue, simply state it in the show() method:

banner.show(queuePosition: .front)

Adding a banner to the front of the queue will temporarily suspend the currently displayed banner (if there is one) and will resume it after the banner in front of it dismisses.

To get the number of banners currently on the queue, simply:

let numberOfBanners = NotificationBannerQueue.default.numberOfBanners

This is all automatically managed!

Banner Queue and display banners simultaneously (stacked)

You can also create the queue to display several banners at once with controlling of maximum number of banners to be displayed simultaneously. You can "show" more banners than allowed by queue settings - banners what exceed this value will be displayed some time later, after some banners already displayed on screen will be closed. In example below we create queue with maximum simultaneous banners allowed - 3:

let bannerQueueToDisplaySeveralBanners = NotificationBannerQueue(maxBannersOnScreenSimultaneously: 3)

Create five different banners:

let banner1 = FloatingNotificationBanner(title: "Success Notification - 1",
                                         subtitle: "First Notification from 5 in current queue with 3 banners allowed simultaneously",
                                         style: .success)
banner1.delegate = self

let banner2 = FloatingNotificationBanner(title: "Danger Notification - 2",
                                         subtitle: "Second Notification from 5 in current queue with 3 banners allowed simultaneously",
                                         style: .danger)
banner2.delegate = self

let banner3 = FloatingNotificationBanner(title: "Info Notification - 3",
                                         subtitle: "Third Notification from 5 in current queue with 3 banners allowed simultaneously",
                                         style: .info)
banner3.delegate = self

let banner4 = FloatingNotificationBanner(title: "Success Notification - 4",
                                         subtitle: "Fourth Notification from 5 in current queue with 3 banners allowed simultaneously",
                                         style: .success)
banner4.delegate = self

let banner5 = FloatingNotificationBanner(title: "Info Notification - 5",
                                         subtitle: "Fifth Notification from 5 in current queue with 3 banners allowed simultaneously",
                                         style: .info)
banner5.delegate = self

and show all five banners at once:

showBanners([banner1, banner2, banner3, banner4, banner5],
            in: bannerQueue5AllowedMixed)

using this supporting method

func showBanners(_ banners: [FloatingNotificationBanner],
                 in notificationBannerQueue: NotificationBannerQueue) {
    banners.forEach { banner in
        banner.show(bannerPosition: selectedBannerPosition(),
                    queue: notificationBannerQueue,
                    cornerRadius: 8,
                    shadowColor: UIColor(red: 0.431, green: 0.459, blue: 0.494, alpha: 1),
                    shadowBlurRadius: 16,
                    shadowEdgeInsets: UIEdgeInsets(top: 8, left: 8, bottom: 0, right: 8))
    }
}

It will display first three banners at once, and after some time (or by user tap) it will be hidden and 4 and 5 banner will be displayed when. All it with fancy animation.

Feature Requests

I'd love to know anything that you think NotificationBanner is missing. Open an issue and I'll add the feature request label to it and I'll do everything I can to accomodate that request if it is in the library's best interest. 😄

Apps that Use NotificationBanner

Q - Talk About Music VH Dispatch Stikkr CardCast Happy Scale Wanderings Modern Magic 8 Ball Envision: Habits Tracker TSUM RIS LukaPizza

Feel free to add yours!

Author

Dalton Hinterscher, daltonhint4@gmail.com

License

NotificationBanner is available under the MIT license. See the LICENSE file for more info.

Github

link
Stars: 3798

Dependencies

Used By

Total: 0

Releases

SPM v3.0.4 Release - 2020-02-12 14:34:18

Release v3.0.0 - 2019-10-08 16:00:15

Official iOS 13 Support and Stacked Banners 🎉 🎉🎉

• Fixed issue on all banner types where the banner would be covered up by the status bar on all non notch devices. It appears the status bar can no longer be directly hidden in iOS 13 anymore.

• A huge shoutout to all who who contributed to iOS 13 support

  • @ashleyevans
  • @igorkulman
  • @rolandkakonyi

• An even larger shoutout to @mrsnow-git who implemented stacked banners! 👍 👍

Release v2.5.0 - 2019-07-17 14:17:40

• FloatingNotificationBanner's now support custom views • All notification banners now have a transparency property that can be changed to give them a new sleek look

Swift 5 Release - 2019-05-02 02:12:06

- 2019-04-05 15:01:53

Release v2.0.0 - 2019-01-02 21:27:39

Changes

• Added a new banner type FloatGrowingNotificationBanner. (Huge thanks to @mrsnow-git! 👍 👍 👍 ) • Added a function to reset a banner's elapsed duration to zero. (Thanks @ecastillo! 👍)
• Fixed an issue within the NotificationBannerUtilities class. (Thanks @Lausbert! 👍)
• Updated podspec to use SnapKit 4.2.0. (Thanks @anelad! 👍)

Release v1.8.0 - 2018-10-30 19:55:00

GrowingNotificationBanner

A HUGE thanks to @forceunwrap for implementing this feature! 🎉 🎉 🎉

Swift 4.2 Support - 2018-09-19 13:04:53

• Swift 4.2 Support 🎉 🎉 🎉 Thanks @spadafiva! • Can now remove banners from the banner queue. Thanks @mixo44! • Better notch support handling for iPhones. Thanks @joseantoniogarciay!

NotificationBanner Release v1.6.1 - 2018-01-25 16:10:48

• Fixed a bug causing notification banners not to auto rotate correctly if their bannerPosition was .bottom. Thanks @valexa! 👍 👍 👍

NotificationBanner Release v1.6.0 - 2018-01-25 04:11:34

Multiple Banner Queue Support

By default, each notification banner is placed onto a singleton of an auto-managed NotificationBannerQueue. This allows an infinite amount of banners to be displayed without one hiding the other. If you have multiple controllers within your navigation stack that need to be managed by a seperate queue (like a tab bar controller), simply create an instance of a NotificationBannerQueue and pass it in to the show function:

banner.show(queue: customQueue)

Thanks to @t4ec for the feature request! 👍 👍 👍

NotificationBanner Release v1.5.4 - 2018-01-08 18:13:00

StatusBarNotificationBanner's are now 50px tall on iPhone X by default. Thanks @btelintelo! 👍

NotificationBanner Release v1.5.3 - 2017-12-19 15:38:10

• Fixed a bug causing notification banners not to appear correctly on iPhone X's if the navigation bar was hidden. Thanks @pikachu987! 👍 🎉

NotificationBanner Release v1.5.0 - 2017-09-24 03:16:10

Swift 4 Support 🎉 🎉 🎉

NotificationBanner Release v1.4.4 - 2017-09-19 17:49:10

• iPhoneX is now supported

Closes #49 🎉 Thanks @JoniVR! 👍

NotificationBanner Release v1.4.2 - 2017-08-07 16:54:35

NotificationCenter Notifications

The following banner related notifications will be posted to NotificationCenter:

BannerNotification.BannerWillAppear
BannerNotification.BannerDidAppear
BannerNotification.BannerWillDisappear
BannerNotification.BannerDidDisappear

The banner object can be retrieved from the notification as follows:

func onBannerNotification(notification: Notification) {
     guard let banner = notification.userInfo?[NotificationBanner.BannerObjectKey] as? BaseNotificationBanner else {
          return
     }
     // Do something with the banner
}

NotificationBanner Release v1.4.1 - 2017-08-03 17:52:46

• Can now remove all banners from the NotificationBannerQueue by calling NotificationBannerQueue .default.removeAll()

Closes #44 🎉 Thanks @ashokkumars! 👍

NotificationBanner Release v1.4.0 - 2017-06-25 04:01:36

Changes:

Banners can now be shown from the bottom

If you are wanting to show a banner from the bottom, simply:

banner.show(bannerPosition: .bottom)

All existing properties that the show function takes can be mixed and matched to work flawlessly with each other! Closes #31 🎉 Thanks @scottcc! 👍

Banner Events

You can choose to opt into a notification banner's events by registering as its delegate:

banner.delegate = self

Then just make sure to implement the following methods:

internal func notificationBannerWillAppear(_ banner: BaseNotificationBanner)
internal func notificationBannerDidAppear(_ banner: BaseNotificationBanner)
internal func notificationBannerWillDisappear(_ banner: BaseNotificationBanner)
internal func notificationBannerDidDisappear(_ banner: BaseNotificationBanner)

Closes #32 🎉 Thanks @Marlon-Monroy! 👍

New CocoaPods Release: v1.4.0 ✅

NotificationBanner Release v1.3.3 - 2017-06-21 13:13:00

Fixes an issue where an array out of bounds exception would occur when a banner is dismissed if it wasn't placed on the NotificationBannerQueue

Thanks @shanev! 👍

NotificationBanner Release v1.3.2 - 2017-06-13 23:06:04

Changes:

BannerColorsproperty added to banners initialized with attributed text.

Thanks @harmjanr! 👍

Fixed an issue causing banners with long titles not to scroll properly.

A huge thanks to @cbpowell for working closely with me to address this! 👍 Thanks @egenvall for first reporting the issue! 👍 Closes #10 🎉

New CocoaPods Release: v1.3.2 ✅

NotificationBanner Release v1.3.0 - 2017-06-08 22:36:22

Changes:

Banners can now be shown underneath a navigation bar

If you are wanting to show a banner below a navigation bar, simply show on the view controller that is within the navigation system:

banner.show(on: viewController)

Closes #16 🎉

Banners can now be shown infinitely until they are manually dismissed

To show a banner infinitely until it is manually dismissed, simply:

banner.autoDimiss = false

Closes #19 🎉

Haptic Feedback support

By default, when a banner is displayed, a haptic feedback will be generated on devices that support it. The types of haptic feedback are as follows:

public enum BannerHaptic {
    case light
    case medium
    case heavy
    case none
}

To change the type of haptic feedback to generate when a banner is shown, simply:

banner.haptic = .heavy

Closes #15 🎉

New CocoaPods Release: v1.3.0 ✅ Thanks @nick-iCars! 👍

NotificationBanner Release v1.2.0 - 2017-05-06 06:45:05

Changes:

• NotificationBanner's now have a isDisplaying boolean property which will tell you wether or not the banner is currently being displayed.

• The NotificationBannerQueue is now a public class that can be accessed via:

let bannerQueue = NotificationBannerQueue.default

As of right now, the only thing that can be obtained from the banner queue is a property called numberOfBanners which tells you how many notification banners are currently on the queue.

New CocoaPods Release: v1.2.0 ✅ Closes #8 🎉 Thanks @JoniVr! 👍

NotificationBanner Release v1.1.0 - 2017-04-29 18:11:10

New Features:

Custom Banner Style Colors

You can now override the predefined colors that NotificationBanner uses for any style by conforming to the BannerColorsProtocol:

public protocol BannerColorsProtocol {
    func color(for style: BannerStyle) -> UIColor
}

Its as easy as creating a custom banner colors class:

class CustomBannerColors: BannerColorsProtocol {

    internal override func color(for style: BannerStyle) -> UIColor {
        switch style {
            case .danger:   // Your custom .danger color
            case .info:     // Your custom .info color
            case .none:     // Your custom .none color
            case .success:  // Your custom .success color
            case .warning:  // Your custom .warning color
        }
    }
       
}

And then passing in that class to any notification banner you create:

let banner = NotificationBanner(title: title, style: .success, colors: CustomBannerColors())
banner.show()

Swipe Up Support

Notification banners (by default) will now also be dismissed if the user swipes up on the banner. To detect when a user swipes up on a banner, simply:

banner.onSwipeUp = {
	// Do something regarding the banner
}

Better Documentation

Added more documentation for most functions in most of the classes