An iOS picker view to serve all your "picking" needs

Related tags

UI Mandoline
Overview

Mandoline

Version License Platform BuddyBuild

The PickerView is a UICollectionView that provides a smooth "picking" interface. In order to get the most out of it, a consuming view controller should support the Selectable protocol in the intended UICollectionViewCells that dictates whether a cell isSelectable.

Why would I want to use this library?

If you want to have a boss scrolling experience like this:

Blue Apron Meal Rescheduler

It also has responsive haptic feedback that is generated upon selection and moving across cells.

Note: this view is optimized to display a medium-sized collection, given that its primary offering is allowing a user to scroll to a given cell that may be off the screen. One way to offset this natural requirement is to consider the intended size of the UICollectionViewCell that will be used.

Example

To run the example project, clone the repo, and run pod install from the Example directory first.

Installation

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

pod 'Mandoline'

Usage

In the ViewController of use, you can initialize the PickerView like a UIView like so:

let pickerView: PickerView = {
    let view = PickerView()
    view.cellSize = ScrollableCell.cellSize
    return view
}()

You'll also want to set the PickerView's dataSource and delegate to self. Similar to a UICollectionView, be sure to register YourCellClass before the view will appear.

override func viewDidLoad() {
    super.viewDidLoad()

    pickerView.register(cellType: YourCellClass.self)
    pickerView.delegate = self
    pickerView.dataSource = self
}

PickerViewDataSource

The Selectable protocol dictates whether an item is available (isSelectable), as observed by the size of the Overlay's dot.

public protocol Selectable {
    var isSelectable: Bool { get set }
}

The DataSource is an array of Selectable's.

public protocol PickerViewDataSource: class {
    var selectableCells: [Selectable] { get }
}

PickerViewDelegate

The PickerView has a number of UIScrollView and UICollectionView delegate functions that can be called on the view. These are all optional.

func collectionView(_ view: PickerView, didSelectItemAt indexPath: IndexPath) {

}

func scrollViewWillBeginDragging(_ view: PickerView) {

}

func scrollViewWillEndDragging(_ view: PickerView, withVelocity velocity: CGPoint, targetContentOffset: UnsafeMutablePointer<CGPoint>) {

}

func scrollViewDidScroll(_ scrollView: UIScrollView) {

}

There is also a configure function that is called in collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell for customization of UICollectionViewCells.

func configure(cell: UICollectionViewCell, for: IndexPath) {

}

Mutable Properties

There are a number of settable properties on the PickerView:

Required

  • cellSize: Set the size of the cell

If the cellSize is not set, the default cellSize from the PickerViewCell is used.

Optional

  • selectedOverlayColor: Change the color of the overlay's border
  • dotColor: Change the color of the dot
  • triangleSize: Change the size of the picker triangle
  • dotSize: Change the size of the dot
  • dotDistanceFromTop: Change the distance of the dot from the top of the UICollectionView
  • backgroundColor: Change the background color of the UICollectionView

Requirements

  • iOS 8+
  • Xcode 8+

License

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

Contributing

Interested in contributing or learning more about the project? Check out our engineering site for more information.

Third-Party Licenses

SnapKit

Copyright (c) 2011-Present SnapKit Team - https://github.com/SnapKit

Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.

You might also like...
🏞 A simple iOS photo and video browser with optional grid view, captions and selections written in Swift5.0
🏞 A simple iOS photo and video browser with optional grid view, captions and selections written in Swift5.0

Introduction 🏞 MediaBrowser can display one or more images or videos by providing either UIImage objects, PHAsset objects, or URLs to library assets,

Full configurable spreadsheet view user interfaces for iOS applications. With this framework, you can easily create complex layouts like schedule, gantt chart or timetable as if you are using Excel.
Full configurable spreadsheet view user interfaces for iOS applications. With this framework, you can easily create complex layouts like schedule, gantt chart or timetable as if you are using Excel.

kishikawakatsumi/SpreadsheetView has moved! It is being actively maintained at bannzai/SpreadsheetView. This fork was created when the project was mov

Simple and highly customizable iOS tag list view, in Swift.
Simple and highly customizable iOS tag list view, in Swift.

TagListView Simple and highly customizable iOS tag list view, in Swift. Supports Storyboard, Auto Layout, and @IBDesignable. Usage The most convenient

SwiftUI view enabling navigation between pages of content, imitating the behaviour of UIPageViewController for iOS and watchOS
SwiftUI view enabling navigation between pages of content, imitating the behaviour of UIPageViewController for iOS and watchOS

PageView SwiftUI view enabling page-based navigation, imitating the behaviour of UIPageViewController in iOS. Why SwiftUI doesn't have any kind of pag

iOS custom controller used in Jobandtalent app to present new view controllers as cards
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

An easy to use FAQ view for iOS written in Swift
An easy to use FAQ view for iOS written in Swift

FAQView An easy to use FAQ view for iOS written in Swift. This view is a subclass of UIView. Setup with CocoaPods If you are using CocoaPods add this

Provides an iOS view controller allowing a user to draw their signature with their finger in a realistic style.
Provides an iOS view controller allowing a user to draw their signature with their finger in a realistic style.

Swift version now available! Mimicking pen-on-paper signatures with a touch screen presents a difficult set of challenges. The rate touch events are e

Meet Page View Controller for iOS by Cleveroad
Meet Page View Controller for iOS by Cleveroad

While a standard page view allows you to navigate between pages by using simple gestures, our component goes further

Play BreakOut while loading - A playable pull to refresh view using SpriteKit
Play BreakOut while loading - A playable pull to refresh view using SpriteKit

BreakOutToRefresh Play BreakOut while loading - A playable pull to refresh view using SpriteKit BreakOutToRefresh uses SpriteKit to add a playable min

Comments
  • compile error

    compile error

    I check the Podfile that this example is using the dynamic framework Mandoline,But there is an compile error: could not read data from '/Users/macache/Downloads/WorkPlace/UI Stuff/Mandoline-master/Example/Pods/Target Support Files/Mandoline/ResourceBundle-Mandoline-Info.plist': The file “ResourceBundle-Mandoline-Info.plist” couldn’t be opened because there is no such file.

    And can not find Mandoline framework. jietu20171102-084004

    opened by sishenyihuba 4
  • Remove SnapKit dependency

    Remove SnapKit dependency

    This PR removes the SnapKit dependency from Mandoline. It's still being used in the example project. I've created a small extension to make creating constraints a little bit more readable.

    opened by fpg1503 1
  • Using Mandoline with SnapKit 4.0.0

    Using Mandoline with SnapKit 4.0.0

    I'm using SnapKit 4.0.0 in my project, and trying to install Mandoline through Cocoapods raises the error:

    [!] Unable to satisfy the following requirements:

    • SnapKit (~> 4.0.0) required by Podfile
    • SnapKit (= 4.0.0) required by Podfile.lock
    • SnapKit (~> 3.2.0) required by Mandoline (1.0.0)
    opened by gabriel-jones 1
Owner
Blue Apron
Blue Apron provides you with all the ingredients that you need to make a delicious meal in exactly the right proportions.
Blue Apron
A customizable color picker for iOS in Swift

IGColorPicker is a fantastic color picker ?? written in Swift. Table of Contents Documentation Colors Style Other features Installation Example Gettin

iGenius 272 Dec 17, 2022
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
SpriteKit Floating Bubble Picker (inspired by Apple Music) 🧲

Magnetic Magnetic is a customizable bubble picker like the Apple Music genre selection. Demo Video $ pod try Magnetic Features Adding/Removing Nodes

Lasha Efremidze 1.4k Jan 6, 2023
Confetti View lets you create a magnificent confetti view in your app

ConfettiView Confetti View lets you create a magnificent confetti view in your app. This was inspired by House Party app's login screen. Written in Sw

Or Ron 234 Nov 22, 2022
Fetch the star wars api from all the planets and list and show details using Swift UI and Combine

Star Wars Planets Fetch the star wars planet data by using stat war api, list and show details using SwiftUI and Combine frameworks ?? Swift UI Framew

null 1 Aug 10, 2022
A way to quickly add a notification badge icon to any view. Make any view of a full-fledged animated notification center.

BadgeHub A way to quickly add a notification badge icon to any view. Demo/Example For demo: $ pod try BadgeHub To run the example project, clone the r

Jogendra 772 Dec 28, 2022
A child view controller framework that makes setting up your parent controllers as easy as pie.

Description Family is a child view controller framework that makes setting up your parent controllers as easy as pie. With a simple yet powerful publi

Christoffer Winterkvist 246 Dec 28, 2022
A custom stretchable header view for UIScrollView or any its subclasses with UIActivityIndicatorView and iPhone X safe area support for content reloading. Built for iOS 10 and later.

Arale A custom stretchable header view for UIScrollView or any its subclasses with UIActivityIndicatorView support for reloading your content. Built f

Putra Z. 43 Feb 4, 2022
A simple, customizable view for efficiently collecting country information in iOS apps.

CountryPickerView CountryPickerView is a simple, customizable view for selecting countries in iOS apps. You can clone/download the repository and run

Kizito Nwose 459 Dec 27, 2022
An easy to use FAQ view for iOS written in Swift

FAQView An easy to use FAQ view for iOS written in Swift. This view is a subclass of UIView. Setup with CocoaPods If you are using CocoaPods add this

Mukesh Thawani 467 Dec 5, 2022