BulletinBoard is an iOS library that generates and manages contextual cards displayed at the bottom of the screen

Overview

BulletinBoard

Version License Platform Documentation Contact: @_alexaubry

BulletinBoard is an iOS library that generates and manages contextual cards displayed at the bottom of the screen. It is especially well suited for quick user interactions such as onboarding screens or configuration.

It has an interface similar to the cards displayed by iOS for AirPods, Apple TV/HomePod configuration and NFC tag scanning. It supports both the iPhone, iPhone X and the iPad.

It has built-in support for accessibility features such as VoiceOver and Switch Control.

Here are some screenshots showing what you can build with BulletinBoard:

Demo Screenshots

Requirements

  • Xcode 11 and later
  • iOS 9 and later
  • Swift 5.1 and later (also works with Objective-C).

Demo

A demo project is included in the BulletinBoard workspace. It demonstrates how to:

  • integrate the library (setup, data flow)
  • create standard page cards
  • create custom page subclasses to add features
  • create custom cards from scratch

Two demo targets are available:

  • BB-Swift (demo written in Swift)
  • BB-ObjC (demo written in Objective-C)

Build and run the scheme for your favorite language to open the demo app.

Installation

Swift Package Manager

To install BulletinBoard using the Swift Package Manager, add this dependency to your Package.swift file:

.package(url: "https://github.com/alexaubry/BulletinBoard.git", from: "5.0.0")

CocoaPods

To install BulletinBoard using CocoaPods, add this line to your Podfile:

pod 'BulletinBoard'

Carthage

To install BulletinBoard using Carthage, add this line to your Cartfile:

github "alexaubry/BulletinBoard"

Documentation

  • The full library documentation is available here.
  • To learn how to start using BulletinBoard, check out our Getting Started guide.

Contributing

Thank you for your interest in the project! Contributions are welcome and appreciated.

Make sure to read these guides before getting started:

Author

Written by Alexis Aubry. You can find me on Twitter.

License

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

Comments
  • Customizing the stock PageBulletinItem

    Customizing the stock PageBulletinItem

    For my app, I wanted to customize the stock PageBulletinItem class with additional views so that we have a consistent look and feel between stock and modified Pages. Unfortunately, some parts of PageBulletinItem are public instead of open and can't be overridden, and the stack view of buttons is not available outside of makeArrangedSubviews().

    Do you have any interest in exposing additional customization, and/or would you accept a PR for such a feature? I think it could be done cleanly with either additional function variables (like actionHandler), optional protocol funcs, or override-able funcs in PageBulletinItem. These customization points would be called inside PageBulletinItem.makeArrangedSubviews(). Example: open func viewsAboveTitle(_ interfaceBuilder: BulletinInterfaceBuilder) -> [UIView] and so on for the "space" before and after each element: | title | image | description | buttons |

    Here's an example I made with a local copy of PageBulletinItem. screen shot 2017-11-30 at 4 12 43 pm

    class TextFieldPageBulletinItem: CustomizedPageBulletinItem {
        
        fileprivate var errorLabel: UILabel?
        fileprivate var textField: UITextField?
        public var textInputHandler: ((_ text: String) -> Void)?
        
        override func makeArrangedSubviews() -> [UIView] {
            var arrangedSubviews = super.makeArrangedSubviews()
            
            let interfaceBuilder = InterfaceBuilderType.init(appearance: appearance)
            errorLabel = interfaceBuilder.makeDescriptionLabel()
            errorLabel!.text = ""
            errorLabel!.textColor = .red
            
            textField = UITextField()
            textField!.delegate = self
            textField!.borderStyle = .roundedRect
            textField!.returnKeyType = .done
            
            // find the optional stack view of buttons and insert above it
            var buttonStack: UIStackView?
            for view in arrangedSubviews {
                if let bs = view as? UIStackView {
                    buttonStack = bs
                    break
                }
            }
            if let buttonStack = buttonStack, let idx = arrangedSubviews.index(of: buttonStack) {
                // insert in reverse order
                arrangedSubviews.insert(textField!, at: idx)
                arrangedSubviews.insert(errorLabel!, at: idx)
            } else {
                // insert in correct order
                arrangedSubviews.append(errorLabel!)
                arrangedSubviews.append(textField!)
            }
            
            // since there isn't a method similar to "viewDidAppear" for BulletinItems,
            // we're using a workaround open the keyboard after a certain amount of time has elapsed
            DispatchQueue.main.asyncAfter(deadline: .now() + 0.5) { [weak self] in
                self?.textField?.becomeFirstResponder()
            }
            return arrangedSubviews
        }
    }
    
    extension TextFieldPageBulletinItem: UITextFieldDelegate {
        func isInputValid(text: String?) -> Bool {
            if text != nil && !text!.isEmpty {
                 return true
            }
             return false
        }
        
        func textFieldShouldReturn(_ textField: UITextField) -> Bool {
            if let text = textField.text, isInputValid(text: text) {
                textField.resignFirstResponder()
                textInputHandler?(text)
                return true
            } else {
                errorLabel?.text = "You must enter some text to continue."
                textField.backgroundColor = .red
                return false
            }
        }
    }
    
    feature next-release implemented 
    opened by eliburke 13
  • Version 5.0

    Version 5.0

    In this version, we add support for the Swift Package Manager. To make these changes possible, we decided to make the following breaking changes:

    • Require iOS 11
    • Remove the possibility to create items in Objective-C

    We are planning to release this version on October 25, 2020. During the next month, please reply to this PR with feedback about any bugs or request.

    To use the release candidate version, please use the following tag in your package manager: 5.0.0-rc.2

    opened by alexisakers 10
  • Update for Xcode 10

    Update for Xcode 10

    Hi i want to use this library inside my Xcode project but i can't do this because i'm using swit 4.2 and the master branch (installed with pod) use the 4.1 version. The library will be updated ?

    good first issue tooling 
    opened by Gianlo98 8
  • IOS 13 Dark Mode

    IOS 13 Dark Mode

    Hi, thank you for your great BulletinBoard. Unfortunately, this is broken in IOS 13 in Darkmode, since e.g. the date picker is no longer visible, because the background of the bulletin board is not set by .systemBackground (white on white) Can you look at this please? Maybe you can set the backgrounds via .systemBackground and the font by .label. Thank you and best regards

    opened by DK-Web 7
  • How to check whether BLTNItemManager is displaying?

    How to check whether BLTNItemManager is displaying?

    I can't see a way to tell if the bulletin manager is already displaying an item. This would be super useful in my app if it could be implemented, if not already. Thanks!

    opened by yusuftor 7
  • CloseGlyph - Unexpectedly found nil while unwrapping an Optional value

    CloseGlyph - Unexpectedly found nil while unwrapping an Optional value

    New Issue Checklist

    Issue Description

    Hi 👋, I just installed BulletinBoard 2.0.0 and I get a crash when I'm running my build. I get Thread 1: Fatal error: Unexpectedly found nil while unwrapping an Optional value in BulletinCloseButton.swift, line 50: let glyph = UIImage(named: "CloseGlyph", in: Bundle(for: BulletinCloseButton.self), compatibleWith: nil)!.

    It looks like the CloseGlyph image is missing or something. I tried to set requiresCloseButton to false in my BLTNPageItem but it didn't change anything...

    I looked into the BulletinBoard pod folder in my project and could find the CloseGlyph image. I can share some code if you need too.

    Thanks!

    Environment

    • BulletinBoard Version: 2.0.0
    • iOS Version: 11.3
    • Device(s): iPhone 7, iPhone X simulator
    opened by victor-sarda 7
  • Corner radius and matches iPhone X

    Corner radius and matches iPhone X

    Checklist

    • [x] I've tested my changes.
    • [x] I've read the Contribution Guidelines.
    • [x] I've updated the documentation if necessary.

    Motivation and Context

    More customization for more controls and who doesn't love customization, right?

    Description

    1. Changed font sizes properties from let to var, making them alterable so users can define font size on their own
    2. Added actionButtonCornerRadius and alternativeButtonCornerRadius for appearance in page items, cardCornerRadius for the bulletin card corner radius. (All default to 12)

    Example use:

    /// Card corner radius
    bulletinManager.cardCornerRadius = 20
    bulletinManager.prepare()
    bulletinManager.presentBulletin(above: self)
    
    /// Action button corner radius, make it rounder
    page.appearance.actionButtonCornerRadius = 18
    
    1. Make bulletin cards rounder and match more like when AirPods card shows up for iPhone X. (Default corner radius of 34, I know it's a lot but it does look good with the rounded edges on iPhone X)

    Screenshots: This is what AirPods pairing looks like in iPhone X: img_0194

    If user does not define cardCornerRadius before calling prepare on manager: img_0195 img_0196

    opened by CaliCastle 7
  • Swipe to dimiss not triggering dismissalHandler

    Swipe to dimiss not triggering dismissalHandler

    When swiping to dismiss a PageBulletinItem, it dismisses correctly but does not trigger the dismissalHandler. The dismissalHandler works fine with tap to dismiss.

    New Issue Checklist

    Issue Description

    After setting up a simple PageBulletinItem providing a title, descriptiontext, actionbuttontitle, alternativebuttontitle, setting isDismissable to TRUE as well as supplying an actionHandler and dismissalHandler. When presenting this item, tapping to dismiss triggers the dismissalHandler where as swiping does not.

    simple_bulletinmanager_with_item

    Environment

    • iOS Version: iOS 11.0.3
    • Device(s): iPhone 6s
    bug 
    opened by SoaringEarth 7
  • Fix for iPad split view bug

    Fix for iPad split view bug

    Checklist

    • [x] I've tested my changes.
    • [x] I've read the Contribution Guidelines.
    • [x] I've updated the documentation if necessary.

    Motivation and Context

    This fixes the issue #172 Changes were tested with the example application provided.

    Description

    Fix was done by setting the correct frame in the BulletinPresentationAnimationController when animating the view in. Also fixed couple activity indicator style deprecation warnings.

    opened by Piidro 6
  • UI Freezes after swiping bulletin and tapping close button

    UI Freezes after swiping bulletin and tapping close button

    Problem Description: Tapping on the close button after swiping upwards on the bulletin causes the UI to freeze. I believe this is an issue with the interactive pan gesture and the dismissBulletin method called by the close button.

    Steps to reproduce:

    1. Display a bulletin with requiresCloseButton = true.
    2. Pan the bulletin controller upwards using the gesture. This is tricky but you basically need to pan while holding your finger down. Don't release the gesture.
    3. Before releasing the window use your other finger to tap on the close button as many times as needed.
    4. Release the finger being used to pan the controller.

    Result The bulletin UI will freeze completely. The close button, actions, gesture, background view, and all subviews in the bulletin controller will no longer handle touches.

    Expected Result The bulletin should be dismissed.

    Notes We've had some users come across this while swiping downwards over the area where the close button is. I think this is the same issue but I could not reproduce it reliably.

    Environment:

    • Device: iPhone XR
    • OS: iOS 12.0
    • Version of BulletinBoard: 2.0.2
    opened by bsweett 6
  • Upgrade framework and example to Swift 4.2

    Upgrade framework and example to Swift 4.2

    Checklist

    • [x] I've tested my changes.
    • [x] I've read the Contribution Guidelines.
    • [x] I've updated the documentation if necessary.

    Motivation and Context

    Issue #97.

    Description

    Upgrade the Swift version of the framework and sample project from Swift 3 to Swift 4.2.

    opened by a2 6
  • Wrong title will be used after set alternativeButtonTitle

    Wrong title will be used after set alternativeButtonTitle

    There is a bug when changing the alternativeButtonTitle: after setting the property the alternativeButton always receives the actionButtonTitle.

    See BLTNActionItem.swift#L57:

    • wrong: .setTitle(actionButtonTitle, for: .normal)
    • fixed: .setTitle(alternativeButtonTitle, for: .normal)
    opened by BigDada1 0
  • Could not find module 'BLTNBoard' for target 'x86_64-apple-ios-simulator'; found: arm64, arm64-apple-ios-simulator, at: .../Build/Products/Debug-iphonesimulator/BLTNBoard.swiftmodule

    Could not find module 'BLTNBoard' for target 'x86_64-apple-ios-simulator'; found: arm64, arm64-apple-ios-simulator, at: .../Build/Products/Debug-iphonesimulator/BLTNBoard.swiftmodule

    Problem Description: BLTNBoard not building on simulator with M1 Mac

    Steps to reproduce: On M1 Mac try to build project importing BLTNBoard via SPM

    Environment:

    • Device: Simulator
    • Version of BulletinBoard: 5.0.0
    opened by neobeppe 1
  • Documentation & Youtube Video Links Broken.

    Documentation & Youtube Video Links Broken.

    Links to YouTube video, documentation, etc are all broken.

    Sad to see such a great repository with so many stars not be maintained properly /: was really looking forward to using this and I cannot imagine how many people don't want to use after the documentation isn't even properly available/maintained.

    opened by cvcoder1 1
  • Adjust tableView height when keyboard appears

    Adjust tableView height when keyboard appears

    Hi! I created a page containing a searchBar and a tableView. When the keyboard appears, the page goes up and the top comes out of the screen. I have tried several things, but I am unable to reduce the size of the tableView so that the search bar stays visible.

    Here is my code, simplified, to use and try as is:

    import UIKit
    import BLTNBoard
    
    class HistoricPage: FeedbackPageBLTNItem {
    	
    	fileprivate var tableView: UITableView?
    	fileprivate var searchBar: UISearchBar?
    	
    	fileprivate var numberOfItems: Int = 20
    	
    	override func tearDown() {
    		super.tearDown()
    		tableView?.dataSource = nil
    		tableView?.delegate = nil
    		searchBar?.delegate = nil
    	}
    	
    	override func makeViewsUnderTitle(with interfaceBuilder: BLTNInterfaceBuilder) -> [UIView]? {
    		let stack = interfaceBuilder.makeGroupStack(spacing: 0)
    		stack.alignment = .fill
    		stack.distribution = .fill
    		
    		let searchBar = UISearchBar(frame: .zero)
    		searchBar.searchBarStyle = .minimal
    		let searchBarWrapper = interfaceBuilder.wrapView(searchBar, width: nil, height: nil, position: .pinnedToEdges)
    		self.searchBar = searchBar
    		
    		let tableView = UITableView(frame: .zero, style: .plain)
    		tableView.register(UITableViewCell.self, forCellReuseIdentifier: "CellIdentifier")
    		tableView.rowHeight = 38
    		let tableWrapper = interfaceBuilder.wrapView(tableView, width: nil, height: NSNumber(value: numberOfItems * Int(tableView.rowHeight)), position: .pinnedToEdges)
    		self.tableView = tableView
    		
    		tableView.dataSource = self
    		tableView.delegate = self
    		searchBar.delegate = self
    		
    		stack.addArrangedSubview(searchBarWrapper)
    		stack.addArrangedSubview(tableWrapper)
    		return [stack]
    	}
    }
    
    extension HistoricPage: UITableViewDataSource, UITableViewDelegate {
    	
    	func numberOfSections(in tableView: UITableView) -> Int {
    		return 1
    	}
    	
    	func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
    		return numberOfItems
    	}
    	
    	func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    		let cell = tableView.dequeueReusableCell(withIdentifier: "CellIdentifier", for: indexPath)
    		cell.textLabel?.text = String(indexPath.row+1)
    		return cell
    	}
    	
    	func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
    		self.searchBar?.resignFirstResponder()
    	}
    }
    
    extension HistoricPage: UISearchBarDelegate {
    	
    	func searchBarTextDidBeginEditing(_ searchBar: UISearchBar) {
    		// Something to do here to resize tableView/tableWrapper?
    	}
    	
    	func searchBar(_ searchBar: UISearchBar, textDidChange searchText: String) {
    		if let text = searchBar.text, let numberOfItems = Int(text) {
    			tableView?.setContentOffset(.zero, animated: true) // scroll to top
    			self.numberOfItems = numberOfItems
    			self.tableView?.reloadData()
    			// Something to do here to resize tableView/tableWrapper according to number of items?
    		}
    	}
    }
    

    Simulator Screen Shot - iPod touch (7th generation) - 2021-04-13 at 21 35 20 Simulator Screen Shot - iPod touch (7th generation) - 2021-04-13 at 21 35 30

    Thanks for the help anyone can give me 🙏

    opened by link60 2
  • Finish issue #128

    Finish issue #128

    Checklist

    • [x] I've tested my changes.
    • [x] I've read the Contribution Guidelines.
    • [x] I've updated the documentation if necessary.

    Motivation and Context

    This is a Pull Request to fix issue #128. Someone requested that you could change the alignments of the title text, description text as well as the image.

    This PR solves that problem.

    I tested on Xcode's 12.4 simulators of iPhone 8 and iPhone 12

    Description

    To change the alignment of title when instantiating a page FeedbackPageBLTNItem() set the page's .titleAlignment to be whatever you want (.left, .right, ect). If a user does not specify then the default alignment is center.

    Similarly, to change the alignment of description use the .descriptionAlignment to set to desirable alignment And also to change the alignment of image use the .imageContentMode to set to desirable alignment

    opened by caocmai 1
Releases(4.1.1)
  • 4.1.1(May 14, 2020)

  • 4.1.0(Oct 4, 2019)

  • 3.0.0(Dec 17, 2018)

    ⚠ You will need Xcode 10 to use BulletinBoard 3.0.

    New Features

    • Add isShowingBulletin property (thanks @kennyDang)
    • Add willDisplay method to BLTNItem (thanks @kizitonwose)
    • Add option to show the bulletin above the whole application (thanks @alexeichhorn)

    Fixes

    • Upgrade to Swift 4.2 (thanks @a2)
    • Fix frozen dismissal after initial interaction (thanks @a2)
    Source code(tar.gz)
    Source code(zip)
  • 2.0.2(Sep 17, 2018)

    • Fix setters and retain semantics
    • Add workaround to allow static library usage
    • Fix Swift version in Podspec for compatibility with Xcode 10

    Note: Carthage binaries won't be supplied anymore, for security and convenience reasons; as we can't provide reliable support for past and upcoming versions of Xcode in that file.

    Source code(tar.gz)
    Source code(zip)
  • 2.0.1(May 28, 2018)

  • 2.0.0(May 28, 2018)

    This is the second major release of the BulletinBoard framework! Thanks to every contributor for their bug reports, feature requests and help implementing the new features.

    📦 Updating

    CocoaPods

    In your Podfile, change the line where your declare BulletinBoard as a dependency:

    pod "BulletinBoard", "~> 2.0"
    

    And run pod update.

    Carthage

    In your Cartfile, change the line where your declare BulletinBoard as a dependency:

    github "alexaubry/BulletinBoard" ~> 2.0
    

    And run carthage update.

    ⚠️ Breaking Changes

    This version contains major source breaking changes. If you need help, please refer to the migration guide, or open an issue.

    📝 Release Notes

    New Features

    • Make page items more open to customization: if you create custom pages, you no longer need to recreate the standard components yourself
    • Customize fonts and more colors
    • Customize status bar colors
    • Customize bulletin background color
    • Customize corner radius
    • Customize padding between screen and bulletin
    • Hide the activity indicator without changing the current item
    • Annotate library to support Objective-C apps
    • Handle keyboard frame updates (support for text fields)
    • Support for tinting images with template rendering mode
    • Allow customization of the background view
    • Add text field as a standard control
    • Show activity indicator immediately after item is presented
    • Callback for configuration and presentation from BulletinItem

    User-Facing Changes

    • On iPad, the bulletin will be presented at the center of the screen and can only be dismissed by a tap (no swipe)
    • The item will not be dismissed on swipe unless the user lifts their finger from the screen
    • Use screen corner radius on iPhone X

    Bug fixes

    • Fix dismiss tap background gesture being called for touches inside the content view
    • Fix width contraint not being respected for regular layouts
    • Fix iTunes Connect rejection bug due to LLVM code coverage
    • Fix action button not being hidden when changing the item
    • Fix dismissal handler not being called
    • Fix controls inside the card not receiving touchesEnded events
    • Fix cropped bulletin when presenting above split view controller
    • Correctly reset non-dismissable cards position when swipe ends
    • Fix Auto Layout conflicts during transitions
    • Fix crash when reusing bulletin manager

    Library

    • Split BulletinInterfaceFactory in two more open classes: BLTNAppearance for appearance customization, andBLTNInterfaceBuilde for interface components creation
    • CreateBLTNActionItem as a root bulletin item for items with buttons. Handles button creation and tap events. Views above and below buttons are customizable
    • Add example of a collection view bulletin item
    • Remove HighlightButton from public API
    • Various gardening operations to make comments and code more clear
    Source code(tar.gz)
    Source code(zip)
    BLTNBoard.framework.zip(3.44 MB)
  • 1.3.0(Oct 18, 2017)

    ⚠️ Source-breaking changes

    - You can no longer pass a completion block on dismissal

    To execute some code when the item is dismissed, set the dismissalHandler property when creating the item.

    Old

    manager.dismissBulletin(animated: true) {
        print("Bulletin dismissed")
    }
    

    New

    let item: BulletinItem = ...
    
    item.dismissalHandler = { item in
        print("Bulletin dismissed")
    }
    
    manager.dismissBulletin(animated: true) // calls the dismissalHandler
    

    ✨ New Features

    • Customize the background blur

    🐛 Fixes

    • Better iPhone X support
    • Auto Layout improvements

    📦 Updating

    • If you are using CocoaPods : pod update
    • If you are using Carthage : carthage update

    ℹ️ Info

    • SHA-256 checksum : 95e3057f8d39731da134c5dac05f8aaece0c253f8967c28b4b3a495a993a733a
    Source code(tar.gz)
    Source code(zip)
    BulletinBoard.framework.zip(2.97 MB)
  • 1.2.0(Oct 6, 2017)

  • 1.1.0(Oct 5, 2017)

    ✨ New Features

    • Add Accessibility technologies support (VoiceOver, Switch Control) - thanks @lennet!
    • Add an optional activity indicator before transitions

    🐛 Fixes

    • Improve memory management and fix retain cycles/leaks

    📦 Updating

    • If you are using CocoaPods : pod update
    • If you are using Carthage : carthage update

    ℹ️ Info

    • SHA-256 checksum : 2149ce8f0580ead3650bcdbea96bb176eddffec6b880e5613bdebbe245b40193
    Source code(tar.gz)
    Source code(zip)
    BulletinBoard.framework.zip(2.54 MB)
  • 1.0.0(Oct 1, 2017)

Owner
Alexis (Aubry) Akers
Alexis (Aubry) Akers
LicensePlist is a command-line tool that automatically generates a Plist of all your dependencies, including files added manually

LicensePlist is a command-line tool that automatically generates a Plist of all your dependencies, including files added manually(specifi

Masayuki Ono (mono) 2.2k Dec 29, 2022
iOS custom controller used in Jobandtalent app to present new view controllers as cards

CardStackController iOS custom controller used in the Jobandtalent app to present new view controllers as cards. This controller behaves very similar

jobandtalent 527 Dec 15, 2022
A SwiftUI bottom-up controller, like in the Maps app. Drag to expand or minimize.

SwiftUI Drawer A SwiftUI bottom-up controller, like in the Maps app. Drag to expand or minimize. Contents Add the Package Basic Usage Examples Credits

Michael Verges 695 Jan 3, 2023
⬆️ A SwiftUI view component sliding in from bottom

⬆️ A SwiftUI view component sliding in from bottom

Tieda 595 Dec 28, 2022
SwiftUI-Drawer - A bottom-up drawer in swiftUI

SwiftUI-Drawer A bottom-up drawer view. Contents Installation Examples Installat

Bruno Wide 9 Dec 29, 2022
SwiftUI-Drawer A bottom-up drawer view.

SwiftUI-Drawer A bottom-up drawer view.

Perimeter AI Inc. 9 Dec 29, 2022
FSPagerView is an elegant Screen Slide Library implemented primarily with UICollectionView.

FSPagerView is an elegant Screen Slide Library implemented primarily with UICollectionView. It is extremely helpful for making Banner、Product Show、Welcome/Guide Pages、Screen/ViewController Sliders.

Wenchao Ding 6.7k Jan 2, 2023
UIAdapter - An elegant solution to the iOS screen adaptation problem

UIAdapter - An elegant solution to the iOS screen adaptation problem ???? 天朝子民 Features Numerical type fast conversion Storyboard equal scale adaptati

LEE 39 Dec 25, 2022
DesafioMobile2You - This project consists of creating a replica of a TodoMovies screen

DesafioMobile2You Swift IOS Este projeto consiste na criação da réplica de uma t

Leonardo P M 0 Feb 3, 2022
Bar Button Item that can be moved anywhere in the screen, like Android's stickers button.

FlowBarButtonItem Bar Button Item that can be moved anywhere in the screen, like Android's stickers button. [![CI Status](http://img.shields.io/travis

noppefoxwolf 153 Sep 15, 2022
⚡️ A library of widgets and helpers to build instant-search applications on iOS.

By Algolia. InstantSearch family: InstantSearch iOS | InstantSearch Android | React InstantSearch | InstantSearch.js | Angular InstantSearch | Vue Ins

Algolia 567 Dec 20, 2022
StarryStars is iOS GUI library for displaying and editing ratings

StarryStars StarryStars is iOS GUI library for displaying and editing ratings Features StarryStars' RatingView is both IBDesignable and IBInspectable

Peter Prokop 175 Nov 19, 2022
A drop-in universal library helps you to manage the navigation bar styles and makes transition animations smooth between different navigation bar styles

A drop-in universal library helps you to manage the navigation bar styles and makes transition animations smooth between different navigation bar styles while pushing or popping a view controller for all orientations. And you don't need to write any line of code for it, it all happens automatically.

Zhouqi Mo 3.3k Dec 21, 2022
Powerful and easy-to-use vector graphics Swift library with SVG support

Macaw Powerful and easy-to-use vector graphics Swift library with SVG support We are a development agency building phenomenal apps. What is Macaw? Mac

Exyte 5.9k Jan 1, 2023
Lightweight touch visualization library in Swift. A single line of code and visualize your touches!

TouchVisualizer is a lightweight pure Swift implementation for visualising touches on the screen. Features Works with just a single line of code! Supp

Morita Naoki 851 Dec 17, 2022
ScrollViewPlus is a small library that provides some helpful extension and capabilities for working with NSScrollView.

ScrollViewPlus is a small library that provides some helpful extension and capabilities for working with NSScrollView.

Chime 12 Dec 26, 2022
A highly configurable and out-of-the-box-pretty UI library

We absolutely love beautiful interfaces! As an organization named Unicorn, we are obligated to be unique and majestic.

Clayton (McIlrath) Unicorn 225 Feb 11, 2022
A library to recreate the iOS Apple Music now playing transition

DeckTransition DeckTransition is an attempt to recreate the card-like transition found in the iOS 10 Apple Music and iMessage apps. Hereʼs a GIF showi

Harshil Shah 2.2k Dec 15, 2022