A custom paging behavior that peeks the previous and next items in a collection view

Overview

MSPeekCollectionViewDelegateImplementation

Version 3.0.0 is here! πŸŽ‰

The peeking logic is now done using a custom UICollectionViewLayout which makes it easier to integrate and will introduce less bugs! (And hopefully it will solve all the issues you were facing)

Migrating from 2.0.0 to 3.0.0

I've tried to keep minimal effort to migrate from v2 to v3. Here are the steps:

1- Replace MSPeekCollectionViewDelegateImplementation initialization with MSCollectionViewPeekingBehavior

2- On your collectionView, call configureForPeekingBehavior like this:

collectionView.configureForPeekingBehavior(behavior: behavior)

3- Set the collection view's delegate as the view controller (Or any other class you want)

4- In the collection view delegate function scrollViewWillEndDragging, call the behavior's scrollViewWillEndDragging like this:

func scrollViewWillEndDragging(_ scrollView: UIScrollView, withVelocity velocity: CGPoint, targetContentOffset: UnsafeMutablePointer<CGPoint>) {
        behavior.scrollViewWillEndDragging(scrollView, withVelocity: velocity, targetContentOffset: targetContentOffset)
}

5- ???

6- Profit πŸ’°

You can check out the example for a detailed use

Introduction

Build Status

ezgif-2-9f7a86182f

Current design trends require complex designs which allow horizontal scrolling inside vertical scrolling. So to show the users that they can scroll vertically, a peeking item should be shown on the side. This library does exactly that. I wrote this library because there's no pod that does this simple feature. Also, other libraries require me to inherit from a UICollectionViewController, which doesn't give alot of freedom if I'm inheriting from other View Controllers.

Example

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

Requirements

  • XCode 11.2.1
  • Swift 5

This pod will probably work on older versions of XCode but I haven't tested it.

Installation

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

pod 'MSPeekCollectionViewDelegateImplementation'

Usage

Storyboard

  1. Drag-Drop a UICollectionView

  2. Set the reuse identifier for the collection view's cell to Cell

  3. Create a reference for the collection view

@IBOutlet weak var collectionView: UICollectionView!
  1. Bind collection view to outlet

  2. Import library

import MSPeekCollectionViewDelegateImplementation
  1. Create a variable of type MSCollectionViewPeekingBehavior
var behavior: MSCollectionViewPeekingBehavior!
  1. In viewDidLoad(), , initialize the behavior and configure the collectionView for peek behavior:
behavior = MSCollectionViewPeekingBehavior()
collectionView.configureForPeekingBehavior(behavior: behavior)

Or you can use whatever arguments from the ones below (Can be combined together as needed):

behavior = MSCollectionViewPeekingBehavior(cellSpacing: 10)
behavior = MSCollectionViewPeekingBehavior(cellPeekWidth: 20)
//minimumItemsToScroll is the minimum number of items that can be scrolled
behavior = MSCollectionViewPeekingBehavior(minimumItemsToScroll: 1)
//maximumItemsToScroll is the maximum number of items that can be scrolled if the scroll distance is large
behavior = MSCollectionViewPeekingBehavior(maximumItemsToScroll: 3)
//numberOfItemsToShow is the number of items that will be shown at the same time.
behavior = MSCollectionViewPeekingBehavior(numberOfItemsToShow: 3)

peek explanation

  1. In viewDidLoad(), set the collection view's delegate to self:
collectionView.delegate = self
  1. In the collection view delegate function scrollViewWillEndDragging, call the behavior's scrollViewWillEndDragging like this:
func scrollViewWillEndDragging(_ scrollView: UIScrollView, withVelocity velocity: CGPoint, targetContentOffset: UnsafeMutablePointer<CGPoint>) {
        behavior.scrollViewWillEndDragging(scrollView, withVelocity: velocity, targetContentOffset: targetContentOffset)
}
  1. Create the data source implementation as an extension for the ViewController
extension ViewController: UICollectionViewDataSource {
    func numberOfSections(in collectionView: UICollectionView) -> Int {
        return 1
    }
    
    func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
        return 4
    }
    
    func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
        let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "Cell", for: indexPath)
        //TODO: Configure cell
        return cell
    }
}
  1. In viewDidLoad(), Set the collection view's data source to self
collectionView.dataSource = self

Working Example

import UIKit
import MSPeekCollectionViewDelegateImplementation

class ViewController: UIViewController {
    
    @IBOutlet weak var collectionView: UICollectionView!
    var behavior = MSCollectionViewPeekingBehavior()

    override func viewDidLoad() {
        super.viewDidLoad()
        collectionView.configureForPeekingBehavior(behavior: behavior)
        collectionView.delegate = self
        collectionView.dataSource = self
    }
}

extension ViewController: UICollectionViewDataSource {
    func numberOfSections(in collectionView: UICollectionView) -> Int {
        return 1
    }
    
    func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
        return 4
    }
    
    func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
        let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "Cell", for: indexPath)
        cell.contentView.backgroundColor = UIColor.red
        return cell
    }
}

extension ViewController: UICollectionViewDelegate {
    func scrollViewWillEndDragging(_ scrollView: UIScrollView, withVelocity velocity: CGPoint, targetContentOffset: UnsafeMutablePointer<CGPoint>) {
        behavior.scrollViewWillEndDragging(scrollView, withVelocity: velocity, targetContentOffset: targetContentOffset)
    }
    
    func scrollViewDidEndDecelerating(_ scrollView: UIScrollView) {
        print(behavior.currentIndex)
    }
}

Features

Scrolling to a specific item

The MSCollectionViewPeekingBehavior now has a function to scroll to a specific index

public func scrollToItem(at index: Int, animated: Bool)

You can do something like:

behavior.scrollToItem(at: 1, animated: true)

Listen to index changes

You can use the scroll view's delegate function to do that (Make sure you conform to UICollectionViewDelegate):

func scrollViewDidEndDecelerating(_ scrollView: UIScrollView) {
    print(behavior.currentIndex)
}

Customization

Vertical Scroll Direction

The implementation supports collection views with vertical directions and will automatically position cells correctly, you can set the scrolling and peeking to be vertical using:

delegate = MSCollectionViewPeekingBehavior(scrollDirection: .vertical)
collectionView.configureForPeekingBehavior(behavior: behavior)

Author

Maher Santina, [email protected]

Sponsor

If you're liking this repo I'd really appreciate it if you sponsor me (Orange Juice) so that I can continue supporting this project. I'm also working on adding more reusable UI elements similar to this one to make developer's lives easier. Please see my sponsor page for more details

Contributing

Any contribution is highly appreciated, please see CONTRIBUTING.md for more info.

License

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

Comments
  • Consider velocity while EndDragging.

    Consider velocity while EndDragging.

    Act more like isPagingEnabled.

    If the velocity of EndDragging is zero, use "if scrollDistance more than half the page width" to decide destinationIndex, instead of "scrollThreshold". #52 #

    opened by N1nomiya 16
  • Issue when implementing didSelectItem protocol

    Issue when implementing didSelectItem protocol

    I've implemented my collection views this way :

    mapCollectionView.configureForPeekingDelegate()
          delegate = MSPeekCollectionViewDelegateImplementation()
          delegate = MSPeekCollectionViewDelegateImplementation(cellSpacing: 5)
          delegate = MSPeekCollectionViewDelegateImplementation(numberOfItemsToShow: 3)
          delegate = MSPeekCollectionViewDelegateImplementation(cellPeekWidth: 5)
          mapCollectionView.delegate = delegate
          mapCollectionView.dataSource = self
          
          
          shortcutCollectionView.configureForPeekingDelegate()
          shortcutDelegate = MSPeekCollectionViewDelegateImplementation()
          shortcutDelegate = MSPeekCollectionViewDelegateImplementation(numberOfItemsToShow: 4)
          shortcutCollectionView.delegate = shortcutDelegate
          shortcutCollectionView.dataSource = self
          shortcutCollectionView.backgroundColor = .clear
    

    and when calling func peekImplementation(_ peekImplementation: MSPeekCollectionViewDelegateImplementation, didSelectItemAt indexPath: IndexPath)
    it seems like the function doesn't detect any of the collection vies that are implemented, swift doesn't seem to go through the function.. .

    If you guys have any tips i'll be greatufull :)

    opened by xtnguyen 12
  • Scrolling with 0 velocity will not land on the correct page

    Scrolling with 0 velocity will not land on the correct page

    If we drag a bit backwards to the previous page and remove our finger, the paging will always go to the previous page. The expected behavior should be to stay on the current page if the threshold is low

    Same goes to when scrolling to the next page with no velocity, no matter how much we scroll, we'll always end up on the current page. The expected behavior is to go to the next page if the scroll is greater than the threshold

    bug help wanted good first issue 
    opened by MaherKSantina 11
  • Collection view item is getting cut off

    Collection view item is getting cut off

    Hi there!

    I'm coming across an issue where my item gets cut off before showing it's full contents. I've attached a video of me using it.

    https://user-images.githubusercontent.com/6272594/107335992-9ac9a400-6a86-11eb-9799-3dcf898d56be.MP4

    opened by ssamkough 8
  • sizeForItem delegate function is not called when peek behavior is configured

    sizeForItem delegate function is not called when peek behavior is configured

    Hi there,

    I noticed that when I have MSPeekCollectionViewDelegateImplementation implemented, that my collectionView's sizeForItem delegate function is not called. I'm not sure why though. Is this expected or perhaps I have a bug in my code? sizeForItem is called as expected when the peeking behavior is not configured.

    I need to be able to configure my item's size while also implementing peek behavior. Does anybody have any advice?

    opened by johnCbogil 6
  • iOS 9.3 support

    iOS 9.3 support

    Hello, thanks for this nice implementation, but why did you drop support of iOS 9.3 starting from v. 1.2.0? It works perfectly on iOS 9 and no need for additional legacy code.

    opened by NEXTKING 6
  • MSPeekImplementationDelegate returns under/over index in race conditions

    MSPeekImplementationDelegate returns under/over index in race conditions

    MSPeekImplementationDelegate method:

    func peekImplementation(_ peekImplementation: MSPeekCollectionViewDelegateImplementation,
                                didChangeActiveIndexTo activeIndex: Int)   
    

    Returns -1 if continuous fast swipe attempts made to go below the first cell...
    or returns dataSource.count if trying to swipe beyond max cell.

    This only happens when I really push it and swipe super fast.

    Device: iPhone SE running 13.3.1 Xcode 11.3.1 Installed via cocoapods

    pod 'MSPeekCollectionViewDelegateImplementation', '~> 2.0.0'
    
    Screen Shot 2563-06-26 at 20 33 21 waiting for reply 
    opened by fareast555 5
  • Active cell support

    Active cell support

    I want to congratulate you for this lib, it's very cool. However, I think one key feature is missing and it is an active cell support. Is there a way to easily understand (from the controller) which cell is active?

    opened by HristiyanZahariev 5
  • extra space !?

    extra space !?

        behavior = MSCollectionViewPeekingBehavior(cellSpacing: 0)
        behavior = MSCollectionViewPeekingBehavior(cellPeekWidth: 0)
        behavior = MSCollectionViewPeekingBehavior(minimumItemsToScroll: 1)
        behavior = MSCollectionViewPeekingBehavior(maximumItemsToScroll: 1)
        behavior = MSCollectionViewPeekingBehavior(numberOfItemsToShow: 1)
        leagueCollectionView.configureForPeekingBehavior(behavior: behavior)
    

    why this extra space !!?

    Simulator Screen Shot - iPhone SE - 2020-05-24 at 15 55 51

    cell

    Screen Shot 2020-05-24 at 3 56 31 PM
    opened by ahmedsafadii 4
  • Use of undeclared type 'MSCollectionViewPeekingBehavior'

    Use of undeclared type 'MSCollectionViewPeekingBehavior'

    After installing the pod pod 'MSPeekCollectionViewDelegateImplementation' and using it in a ViewController. I get this error on declaration of behaviour variable

    var behavior: MSCollectionViewPeekingBehavior!

    Error: Use of undeclared type 'MSCollectionViewPeekingBehavior'

    waiting for reply 
    opened by ihsaan-ullah 4
  • Selection not working.

    Selection not working.

    @objc optional func peekImplementation(_ peekImplementation: MSPeekCollectionViewDelegateImplementation, didSelectItemAt indexPath: IndexPath) doesn't work and not even appears on the autocomplete in Xcode.

    Checking MSPeekCollectionViewDelegateImplementation from the Pod project it seems it is not in the MSPeekImplementationDelegate. Only the following is shown:

    public protocol MSPeekImplementationDelegate: AnyObject {
        func peekImplementation(_ peekImplementation: MSPeekCollectionViewDelegateImplementation, didChangeActiveIndexTo activeIndex: Int)
    }
    

    func peekImplementation(_ peekImplementation: MSPeekCollectionViewDelegateImplementation, didChangeActiveIndexTo activeIndex: Int) seems to be working fine.

    And my current implementation is as below:

    let peekImplementation = MSPeekCollectionViewDelegateImplementation(cellSpacing: 16.0, cellPeekWidth: 16.0)
    
    collectionView?.dataSource = self
    collectionView?.configureForPeekingDelegate()
    collectionView?.delegate = peekImplementation
    peekImplementation.delegate = self
    

    Am I missing something?

    opened by thejeraldo 4
  • Scroll bars not visible

    Scroll bars not visible

    If I create the default behavior for peeking the cells from the horizontal UICollectionView, my scrolling indicators are only visible directly on cells and I am unable to use edge offset to move it down because then they moved out of the collection view and they are not visible at all.. Can you please make some suggestions how to fix this? Since cell is automatically set to fill up the entire collection view so I am unable to increase the height to get more space.

    opened by PeHk 0
  • Backward scroll

    Backward scroll

    Please fix backward scroll... because if I want make backward scroll for example on 2-3 cell I can do this only on one cell, I made small research and found problem in MSCollectionViewPaging.swift in func getNewTargetOffset(startingOffset: CGFloat, velocity: CGFloat, targetOffset: CGFloat) -> CGFloat if I change var offset = max(targetIndex - currentIndex, 1) on var offset = max(abs(targetIndex - currentIndex), 1) all work correctly, please, check this. Thanks a lot)

    opened by Serg-Pogrebnyak 0
  • SPM Fail

    SPM Fail

    Trying to integrate using SPM but getting Package Resolution Failed. Im using the URL :

    https://github.com/MaherKSantina/MSPeekCollectionViewDelegateImplementation

    image

    opened by shokaveli 1
  • Crash on behavior.scrollViewWillEndDragging call in v3.1.1

    Crash on behavior.scrollViewWillEndDragging call in v3.1.1

    After updating to v3.1.1 the app crashes when releasing finger after a swipe. It works without any change with the 2 previous versions.

    • The crash happens on the behavior.scrollViewWillEndDragging call
    • behavior is not nil
    func scrollViewWillEndDragging(_ scrollView: UIScrollView, withVelocity velocity: CGPoint, targetContentOffset: UnsafeMutablePointer<CGPoint>) {
            behavior.scrollViewWillEndDragging(scrollView, withVelocity: velocity, targetContentOffset: targetContentOffset)
    }
    

    Didn't see anything in the changelogs that would explain this sudden crash.

    Any ideas why this is happening ?

    opened by mouchegmouradian 0
  • RxCollectionView only shows one cell always

    RxCollectionView only shows one cell always

    Good morning Maher! again thanks for your work.

    I'm having a doubt, I'm using RxCollectionView and in that case the dataSource it's fileprivate func dataSource() -> RxCollectionViewSectionedReloadDataSource and MSPeek collectionView it's only showing one cell in all cases...

    Do you have any idea, what can I do?

    Thanks!

    waiting for reply 
    opened by Sk8er22 1
Releases(3.2.0)
  • 3.2.0(Mar 22, 2021)

  • 3.1.1(May 8, 2020)

    • Added ability to listen to index change when the paging finishes
    func scrollViewDidEndDecelerating(_ scrollView: UIScrollView) {
        print(behavior.currentIndex)
    }
    
    Source code(tar.gz)
    Source code(zip)
  • 3.1.0(May 6, 2020)

  • 3.0.4(Feb 5, 2020)

  • 3.0.3(Dec 16, 2019)

    • Fixed issue #50
    • Fixed an issue when scrolling backwards on the first item or forwards on the last item.
    • Added some tests around the content length
    Source code(tar.gz)
    Source code(zip)
  • 3.0.2(Dec 13, 2019)

  • 3.0.1(Dec 13, 2019)

    Added scrollToItem function on the behavior. You can now do something like:

    behavior.scrollToItem(at: 1, animated: true)
    

    It's recommended to use this function instead of the collection view's scrolling function because we're using a custom collection view layout and the calculation is different

    Source code(tar.gz)
    Source code(zip)
  • 3.0.0(Dec 7, 2019)

    New version is here with less bugs! (Hopefully πŸ™ ) The implementation is now using a custom collection view layout which spaces components based on the collection view's frame

    The paging behavior is now in it's separate component so that it would be easier to customize and maintain

    The new layout should fix most issues with items clipping but please feel free to raise issues if you're still experiencing them

    Thank you for your comments and support everyone! ❀️

    Source code(tar.gz)
    Source code(zip)
  • 2.0.0(Sep 5, 2019)

  • 1.3.0(Jun 5, 2019)

    • Added minimumItemsToScroll

    minimumItemsToScroll is the number of items that the user will scroll when the scroll distance is greater than the threshold. This is quite useful when you have multiple cells showing at once and you need to do a paging behavior.

    For example, let's say I'm showing 2 items at the same time, but I still want to have some kind of paging behavior by scrolling to another 2 items without the need to scroll 1 item at a time. This can be achieved by setting the number of items to show to 2 and minimum items to scroll to 2

    Source code(tar.gz)
    Source code(zip)
  • 1.2.2(May 30, 2019)

  • 1.2.1(Mar 27, 2019)

  • 1.2.0(Mar 26, 2019)

  • 1.1.0(Feb 3, 2019)

    • Moved value conversion functions to UIScrollViewDirection enum
    • Moved the UICollectionViewDelegate functions into an extension
    • Renamed variable to make the implementation clearer
    • Added a delegate function to listen to index selection
    • Added comments and fixed readme
    Source code(tar.gz)
    Source code(zip)
  • 1.0.0(Jan 31, 2019)

    First Production Release πŸŽ‰πŸŽ‰πŸŽ‰πŸŽ‰

    • Added pagingEnabled = false in the configuration function to make the peeking work without setting it in the interface builder

    Since multiple people are starting to use this pod in their production code, more stability and improvement will be implemented in a backward compatible manner (When possible)

    Source code(tar.gz)
    Source code(zip)
  • 0.13.0(Oct 18, 2018)

  • 0.12.0(Sep 6, 2018)

  • 0.11.0(Sep 6, 2018)

  • 0.10.0(Jul 30, 2018)

    Changelog

    • Fixed paging not working properly if cell spacing or cell peek width is large #20
    • Added convenience function to get the index of an item based on its content offset #21
    Source code(tar.gz)
    Source code(zip)
  • 0.9.0(Jul 3, 2018)

  • 0.8.0(Jun 27, 2018)

  • 0.7.0(Jun 26, 2018)

  • 0.6.0(Jun 25, 2018)

  • 0.5.0(Jun 22, 2018)

    Changelog

    • Added support for subclassing implementation to add new features or to listen to events.
    • Added Customization section in Readme for subclassing
    Source code(tar.gz)
    Source code(zip)
  • 0.4.0(Jun 16, 2018)

  • 0.3.0(Jun 16, 2018)

  • 0.2.0(Jun 16, 2018)

  • 0.1.0(Jun 13, 2018)

    First Release

    • MSPeekCollectionViewDelegateImplementation can be initialized using itemsCount, cellPeekWidth, cellSpacing and scrollThreshold
    • Added extension function configureForPeekingDelegate() for UICollectionView to easily configure a collection view
    Source code(tar.gz)
    Source code(zip)
Owner
Maher Santina
Enthusiastic iOS developer finding his way through Open Source
Maher Santina
Reusable iOS's behavior drag or swipe to pop ViewController

DLSwipeToPopController Reusable iOS's behavior to pop ViewController base on SwipeRightToPopController: Swipe from Right to Left to pop ViewController

Le Ngoc Duy 1 Sep 17, 2022
Custom CollectionViewLayout class for CollectionView paging mode to work properly

PagingCollectionViewLayout About How to use About ⚠️ Custom class, which is inherited from UICollectionViewFlowLayout, developed for properly work Col

Vladislav 2 Jan 17, 2022
A SwiftUI collection view with support for custom layouts, preloading, and more.

ASCollectionView A SwiftUI implementation of UICollectionView & UITableView. Here's some of its useful features: supports preloading and onAppear/onDi

Apptek Studios 1.3k Dec 24, 2022
Custom transition between two collection view layouts

Display Switcher We designed a UI that allows users to switch between list and grid views on the fly and choose the most convenient display type. List

Yalantis 2.3k Dec 14, 2022
Lightweight custom collection view inspired by Airbnb.

ASCollectionView Lightweight custom collection view inspired by Airbnb. Screenshots Requirements ASCollectionView Version Minimum iOS Target Swift Ver

Abdullah Selek 364 Nov 24, 2022
Infinite paging, Smart auto layout, Interface of similar to UIKit.

Infinite paging, Smart auto layout, Interface of similar to UIKit. Appetize's Demo Requirements Swift 4.2 iOS 8.0 or later How to Install PagingView C

Kyohei Ito 314 Dec 6, 2022
Generic collection view controller with external data processing

FlexibleCollectionViewController Swift library of generic collection view controller with external data processing of functionality, like determine ce

Dmytro Pylypenko 3 Jul 16, 2018
A component to quickly scroll between collection view sections

SectionScrubber The scrubber will move along when scrolling the UICollectionView it has been added to. When you pan the scrubber you 'scrub' over the

Elvis 190 Aug 17, 2022
Easy and type-safe iOS table and collection views in Swift.

Quick Start TL;DR? SimpleSource is a library that lets you populate and update table views and collection views with ease. It gives you fully typed cl

Squarespace 96 Dec 26, 2022
TLIndexPathTools is a small set of classes that can greatly simplify your table and collection views.

TLIndexPathTools TLIndexPathTools is a small set of classes that can greatly simplify your table and collection views. Here are some of the awesome th

SwiftKick Mobile 347 Sep 21, 2022
Modern Collection Views

The goal is to showcase different compositional layouts and how to achieve them. Feel free to use any code you can find and if you have interesting layout idea - open PR!

Filip NΔ›meček 536 Dec 28, 2022
A Swift mixin for reusing views easily and in a type-safe way (UITableViewCells, UICollectionViewCells, custom UIViews, ViewControllers, Storyboards…)

Reusable A Swift mixin to use UITableViewCells, UICollectionViewCells and UIViewControllers in a type-safe way, without the need to manipulate their S

Olivier Halligon 2.9k Jan 3, 2023
An iOS drop-in UITableView, UICollectionView and UIScrollView superclass category for showing a customizable floating button on top of it.

MEVFloatingButton An iOS drop-in UITableView, UICollectionView, UIScrollView superclass category for showing a customizable floating button on top of

Manuel Escrig 298 Jul 17, 2022
Automates prefetching of content in UITableView and UICollectionView

Automates preheating (prefetching) of content in UITableView and UICollectionView. Deprecated on iOS 10. This library is similar to UITableViewDataSou

Alexander Grebenyuk 633 Sep 16, 2022
A data-driven UICollectionView framework for building fast and flexible lists.

A data-driven UICollectionView framework for building fast and flexible lists. Main Features ?? Never call performBatchUpdates(_:, completion:) or rel

Instagram 12.5k Jan 1, 2023
Netflix and App Store like UITableView with UICollectionView, written in pure Swift 4.2

GLTableCollectionView Branch Status master develop What it is GLTableCollectionView is a ready to use UITableViewController with a UICollectionView fo

Giulio 708 Nov 17, 2022
Incremental update tool to UITableView and UICollectionView

EditDistance is one of the incremental update tool for UITableView and UICollectionView. The followings show how this library update UI. They generate

Kazuhiro Hayashi 90 Jun 9, 2022
PJFDataSource is a small library that provides a simple, clean architecture for your app to manage its data sources while providing a consistent user interface for common content states (i.e. loading, loaded, empty, and error).

PJFDataSource PJFDataSource is a small library that provides a simple, clean architecture for your app to manage its data sources while providing a co

Square 88 Jun 30, 2022
Collapse and expand UICollectionView sections with one method call.

This library provides a custom UICollectionView that allows to expand and collapse sections. Provides a simple API to manage collection view appearanc

Touchlane 172 Dec 26, 2022