WLEmptyState is an iOS based component that lets you customize the view when the dataset of a UITableView or a UICollectionView is empty.

Overview

WLEmptyState_Banner WLEmptyState CI Version Carthage compatible Twitter MIT license

Table of Content

Overview

WLEmptyState is an iOS based component that lets you customize the message when the dataset of UITableView or UICollectionView is empty. We created a sample project with the WLEmptyState component to show how you can use it.

Running an Example Project

To run the Example project:

  1. Clone the repo with the following command:

    git clone [email protected]:wizeline/WLEmptyState.git

  2. Move to the Example directory and run the following command:

    pod install

Installing WLEmptyState

CocoaPods

WLEmptyState is available through CocoaPods. To install it, add the following command to your Podfile:

pod 'WLEmptyState'

Carthage

Carthage is a decentralized dependency manager that builds your dependencies and provides you with binary frameworks. To integrate WLEmptyState into your Xcode project using Carthage, specify it in your Cartfile:

github "wizeline/WLEmptyState"

Configuring WLEmptyState

The WLEmptyState component uses Method Swizzling. Therefore, to configure WLEmptyState, follow these steps:

  1. Import the module in the AppDelegate class by adding import WLEmptyState.

  2. Call the static method configure() on application(_ application:, didFinishLaunchingWithOptions:) method.

    Your AppDelegate class should look like this:

    import WLEmptyState
        ...
    func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
        WLEmptyState.configure()
        return true
    }

Using WLEmptyState

Once you have configured WLEmptyState, you can use it for your UITableViewController or UICollectionViewController. You need to conform the WLEmptyStateDataSource protocol. For example,

class YourTableViewController: UITableViewController, WLEmptyStateDataSource {

    override func viewDidLoad() {
        super.viewDidLoad()
        tableView.emptyStateDataSource = self
    }

}

After you run your project with an empty dataset for your entity, you'll be able to see a default WLEmptyState view.

Default Image

Default WLEmptyState

Customizing Default WLEmptyState

If you want to customize the text, description, or image, of the default component you need to implement the WLEmptyStateDataSource function. You can find the code for customization in the following list:

  • Customize Image
func imageForEmptyDataSet() -> UIImage? {
    return UIImage(named: "bubble_icon")
}
  • Customize Title
func titleForEmptyDataSet() -> NSAttributedString {
    let title = NSAttributedString(string: "No messages", attributes: [NSAttributedString.Key.font: UIFont.preferredFont(forTextStyle: .headline)])
    return title
}
  • Customize Description
func descriptionForEmptyDataSet() -> NSAttributedString {
    let title = NSAttributedString(string: "There's no messages to show.", attributes: [NSAttributedString.Key.font: UIFont.preferredFont(forTextStyle: .caption1)])
    return title
}

Customized Image

Creating your own EmptyState

Using customViewForEmptyState() allows you to provide your own implementation for Empty State.

func customViewForEmptyState() -> UIView? {
  let activityIndicatorView = UIActivityIndicatorView()
  activityIndicatorView.startAnimating()
  activityIndicatorView.color = .purple
  return activityIndicatorView
}

Simulator Screen Shot - iPhone X - 2019-07-24 at 16 07 43

Disable scroll

You can disable the scroll when the Empty State is showing. You only need to conform the WLEmptyStateDelegate protocol and return false in the enableScrollForEmptyState() function:

// Conform the WLEmptyStateDelegate protocol
class YourTableViewController: UITableViewController, WLEmptyStateDataSource, WLEmptyStateDelegate {

    override func viewDidLoad() {
        super.viewDidLoad()

        tableView.emptyStateDataSource = self        
        tableView.emptyStateDelegate = self // Set your delegate
    }

    func enableScrollForEmptyState() -> Bool {        
        // To enable/disable the scroll return true or false
        return false
    }

}

Contributing to WLEmptyState

We actively welcome your pull requests. We are trying to make contributions to this project as transparent and accessible as possible, please read our Contributing guidelines and follow the Code of conduct. If you face any problem with the code, please open an issue on GitHub.

List of Contributors. ⭐️

License

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

Comments
  • Setup snapshot tests

    Setup snapshot tests

    What does this PR do? Any background context you want to provide?

    It adds the setup of FBSnapshotTestCase to test the SampleViewController view within the example project.

    When the record mode is turned on in the snapshot tests, It captures a reference image inside the folder specified by the environment variable FB_REFERENCE_IMAGE_DIR. Once it is saved and the record mode is turned off, it is ready to execute UI test by comparing the saved image to the view generated by the controller. If there is a difference between these two, it will fail the test and a difference image will be stored in the folder specified by the environment variable IMAGE_DIFF_DIR.

    For this project, the setup is done to be stored like the following:

    | Variable | Folder | | ------------- | ------------- | | FB_REFERENCE_IMAGE_DIR | Example/Tests/ReferenceImages | | IMAGE_DIFF_DIR | Example/Tests/FailureDiffs |

    Where should the reviewer start?

    • SnapshotTests.swift

    How should this be manually tested?

    Just run the test included in the class SnapshotTests.

    Right now reference images for iPhone XR and iPhone X executions are being included. Make sure to select any of these 2 simulators to run the tests and check. Otherwise, you can turn on the record mode and generate a new reference for any other device.

    Although, please be aware that FBSnapshotTestCase generates only one reference image per scale. Therefore, if you choose some other simulator with the same scales as the previous (i.e. 2x and 3x respectively), it will not only fail the test and save the diff, but also it will ask to record again and overwrite the previous reference due to the image size differences.

    What are the relevant tickets?

    #8

    Screenshots (if appropriate)

    Testing the view:

    screen shot 2019-02-04 at 9 43 32 pm

    Tests 
    opened by leonardo-garcia 3
  • Update readme

    Update readme

    What does this PR do? Any background context you want to provide?

    Update with example for simple implementation

    Where should the reviewer start?

    Readme

    How should this be manually tested?

    --

    What are the relevant tickets?

    https://github.com/wizeline/WLEmptyState/issues/6

    Screenshots (if appropriate)

    --

    Questions

    --

    Documentation 
    opened by alexandercg 3
  • Add documentation to README.md about the enable/disable scrolling

    Add documentation to README.md about the enable/disable scrolling

    What does this PR do? Any background context you want to provide?

    Add documentation to the readme file about the feature enable/disable scroll

    Where should the reviewer start?

    README.md

    How should this be manually tested?

    Test the code example

    What are the relevant tickets?

    Allow Enable/Disable Scrolling

    Questions

    N/A

    opened by calosth 2
  • Swift Package Manager Support

    Swift Package Manager Support

    Hi,

    it would be great if Swift package Manager would also be supported.

    I've already forked it https://github.com/benweidig/WLEmptyState/commit/01783571d7cc97f9bd6369d528108a619008b436 and made the necessary changes.

    I would also have create a pull request BUT Swift Package Manager doesn't support assets, so either the default image must be removed, or it must be drawn in code.

    Cheers, Ben

    opened by benweidig 2
  • Add basic implementation of WLEmptyState

    Add basic implementation of WLEmptyState

    What does this PR do? Any background context you want to provide?

    This PR adds the basic implementation of EmptyState for UITableViews.

    • Adds DataSource and Delegate for emptyState.
    • It is based on method swizzling of the ReloadData(), checking the amount of items to add an EmptyScreen.

    Where should the reviewer start?

    • WLEmptyState/Classes/UITable+Extension.swift

    How should this be manually tested?

    Run the Example, as the DataSet is empty the empty state should be rendered.

    Screenshots (if appropriate)

    simulator screen shot - iphone xr - 2018-12-18 at 17 02 51

    Questions

    N/A

    enhancement 
    opened by lojals 2
  • Adding custom views as Empty State

    Adding custom views as Empty State

    What does this PR do? Any background context you want to provide?

    This PR allows users to use custom views as empty states

    Where should the reviewer start?

    • WLEmptyState/Classes/Protocols/WLEmptyStateDataSource.swift
    • WLEmptyState/Classes/Protocols/WLEmptyStateProtocol.swift

    How should this be manually tested?

    Implement customViewForEmptyState() returning a custom view.

    What are the relevant tickets?

    --

    Questions

    N/A

    opened by lojals 1
  • Outdated docs

    Outdated docs

    In several places of the documentation (Readme, repo description, WLEmptyState.swift comments) you say that it works on UITableView without mentioning that it also works on UICollectionView.

    Documentation 
    opened by rlaguilar 1
  • Empty state always shown if `numberOfSections` is not implemented

    Empty state always shown if `numberOfSections` is not implemented

    Describe the bug If a UIViewController, which implements UITableViewDataSource does not implement the optional method numberOfSections, the UITableView always shows the empty state, even if the numberOfRownInSection method return a number != 0.

    Expected behavior The empty state should not be shown if the numberOfSections is not implemented, it should be shown if the numberOfSections method is implemented and returns 0.

    Smartphone (please complete the following information):

    • Device: iPhone6
    • OS: iOS 12.2
    • Version 1.0.2

    Additional context The problem should be in these lines of UITable+Extensions file:

        private var numberOfItems: Int {
            var items = 0
            let numberOfSections = dataSource?.numberOfSections?(in: self) ?? 0
            for section in 0..<numberOfSections {
                items += dataSource?.tableView(self, numberOfRowsInSection: section) ?? 0
            }
            return items
        }
    

    The numberOfSections method (as UITableViewDataSource protocol documentation) should default to 1 if not implemented, but with this code if numberOfSections is not implemented it defaults to 0.

    opened by neokree 1
  • UICollectionView Support Added

    UICollectionView Support Added

    What does this PR do? Any background context you want to provide?

    Support added for empty state on UICollectionViews

    Where should the reviewer start?

    Review the abstraction in WLEmptyStateProtocol and the specific extensions for each class (UITableView & UICollectionView)

    How should this be manually tested?

    Added new tab bar on example app with a UITableView and UICollectionView

    What are the relevant tickets?

    #26 UICollectionView support

    Screenshots (if appropriate)

    | Collection | Table | | ------------- | ------------- | | Simulator Screen Shot - iPhone X - 2019-05-05 at 15 03 14 | Simulator Screen Shot - iPhone X - 2019-05-05 at 15 03 13 |

    CI New Feature 
    opened by Abel7x 1
  • Add tests for DataSource methods

    Add tests for DataSource methods

    What does this PR do? Any background context you want to provide?

    This PR adds unit tests for DataSource protocol and increased the Test Coverage to 83%.

    Where should the reviewer start?

    • Example/Tests/DataSourceTests.swift

    How should this be manually tested?

    Run the tests :trollface:

    What are the relevant tickets?

    https://github.com/wizeline/WLEmptyState/issues/4

    Screenshots (if appropriate)

    N/A

    Questions

    N/A

    Tests CI 
    opened by lojals 1
  • Improve accessibility support

    Improve accessibility support

    What does this PR do? Any background context you want to provide?

    Currently there's no easy way to set the accessibility label for the empty state view. This PR shows a proposal to allow the users to set an accessibility description for the empty state view.

    Also in this PR the accessibility trait header is added to the title label in order to improve the navigation while using the accessibility rotor.

    In which scenarios can this be useful?

    Giving the user an easy way to set the accessibility label can be useful on the following scenarios:

    • When a user provides an empty string to the title and description of the empty view and wants to provide a localized description for the empty view

    showing an empty state view with no title or description

    • When a user provides a title or description that relies on a visual element to provide the user context information

    showing an empty state view with no description and using visual characters to give the user contextual information

    Where should the reviewer start?

    • By using the project example you can add the following code to the SampleTableViewController or SampleCollectionViewController
    func accessibilityDescriptionForEmptyDataSet() -> String? {
          return "This is a test for an accessible description"
    }
    

    How should this be manually tested?

    • Activate VoiceOver
    • Navigate through the title and description of an empty view
    opened by zippi-MD 0
  • Bump tzinfo from 1.2.7 to 1.2.10

    Bump tzinfo from 1.2.7 to 1.2.10

    Bumps tzinfo from 1.2.7 to 1.2.10.

    Release notes

    Sourced from tzinfo's releases.

    v1.2.10

    TZInfo v1.2.10 on RubyGems.org

    v1.2.9

    • Fixed an incorrect InvalidTimezoneIdentifier exception raised when loading a zoneinfo file that includes rules specifying an additional transition to the final defined offset (for example, Africa/Casablanca in version 2018e of the Time Zone Database). #123.

    TZInfo v1.2.9 on RubyGems.org

    v1.2.8

    • Added support for handling "slim" format zoneinfo files that are produced by default by zic version 2020b and later. The POSIX-style TZ string is now used calculate DST transition times after the final defined transition in the file. The 64-bit section is now always used regardless of whether Time has support for 64-bit times. #120.
    • Rubinius is no longer supported.

    TZInfo v1.2.8 on RubyGems.org

    Changelog

    Sourced from tzinfo's changelog.

    Version 1.2.10 - 19-Jul-2022

    Version 1.2.9 - 16-Dec-2020

    • Fixed an incorrect InvalidTimezoneIdentifier exception raised when loading a zoneinfo file that includes rules specifying an additional transition to the final defined offset (for example, Africa/Casablanca in version 2018e of the Time Zone Database). #123.

    Version 1.2.8 - 8-Nov-2020

    • Added support for handling "slim" format zoneinfo files that are produced by default by zic version 2020b and later. The POSIX-style TZ string is now used calculate DST transition times after the final defined transition in the file. The 64-bit section is now always used regardless of whether Time has support for 64-bit times. #120.
    • Rubinius is no longer supported.
    Commits
    • 0814dcd Fix the release date.
    • fd05e2a Preparing v1.2.10.
    • b98c32e Merge branch 'fix-directory-traversal-1.2' into 1.2
    • ac3ee68 Remove unnecessary escaping of + within regex character classes.
    • 9d49bf9 Fix relative path loading tests.
    • 394c381 Remove private_constant for consistency and compatibility.
    • 5e9f990 Exclude Arch Linux's SECURITY file from the time zone index.
    • 17fc9e1 Workaround for 'Permission denied - NUL' errors with JRuby on Windows.
    • 6bd7a51 Update copyright years.
    • 9905ca9 Fix directory traversal in Timezone.get when using Ruby data source
    • Additional commits viewable in compare view

    Dependabot compatibility score

    Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting @dependabot rebase.


    Dependabot commands and options

    You can trigger Dependabot actions by commenting on this PR:

    • @dependabot rebase will rebase this PR
    • @dependabot recreate will recreate this PR, overwriting any edits that have been made to it
    • @dependabot merge will merge this PR after your CI passes on it
    • @dependabot squash and merge will squash and merge this PR after your CI passes on it
    • @dependabot cancel merge will cancel a previously requested merge and block automerging
    • @dependabot reopen will reopen this PR if it is closed
    • @dependabot close will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually
    • @dependabot ignore this major version will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself)
    • @dependabot ignore this minor version will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself)
    • @dependabot ignore this dependency will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)
    • @dependabot use these labels will set the current labels as the default for future PRs for this repo and language
    • @dependabot use these reviewers will set the current reviewers as the default for future PRs for this repo and language
    • @dependabot use these assignees will set the current assignees as the default for future PRs for this repo and language
    • @dependabot use this milestone will set the current milestone as the default for future PRs for this repo and language

    You can disable automated security fix PRs for this repo from the Security Alerts page.

    dependencies 
    opened by dependabot[bot] 0
  • Bump cocoapods-downloader from 1.4.0 to 1.6.3

    Bump cocoapods-downloader from 1.4.0 to 1.6.3

    Bumps cocoapods-downloader from 1.4.0 to 1.6.3.

    Release notes

    Sourced from cocoapods-downloader's releases.

    1.6.3

    Enhancements
    • None.
    Bug Fixes
    • None.

    1.6.2

    Enhancements
    • None.
    Bug Fixes
    • None.

    1.6.1

    Enhancements
    • None.
    Bug Fixes
    • None.

    1.6.0

    Enhancements
    • None.
    Bug Fixes
    • Adds a check for command injections in the input for hg and git.
      orta #124

    1.5.1

    Enhancements
    • None.
    Bug Fixes
    • Fix "can't modify frozen string" errors when pods are integrated using the branch option
      buju77 #10920

    1.5.0

    ... (truncated)

    Changelog

    Sourced from cocoapods-downloader's changelog.

    1.6.3 (2022-04-01)

    Enhancements
    • None.
    Bug Fixes
    • None.

    1.6.2 (2022-03-28)

    Enhancements
    • None.
    Bug Fixes
    • None.

    1.6.1 (2022-03-23)

    Enhancements
    • None.
    Bug Fixes
    • None.

    1.6.0 (2022-03-22)

    Enhancements
    • None.
    Bug Fixes
    • Adds a check for command injections in the input for hg and git.
      orta #124

    1.5.1 (2021-09-07)

    Enhancements
    • None.

    ... (truncated)

    Commits
    • c03e2ed Release 1.6.3
    • f75bccc Disable Bazaar tests due to macOS 12.3 not including python2
    • 52a0d54 Merge pull request #128 from CocoaPods/validate_before_dl
    • d27c983 Ensure that the git pre-processor doesn't accidentally bail also
    • 3adfe1f [CHANGELOG] Add empty Master section
    • 591167a Release 1.6.2
    • d2564c3 Merge pull request #127 from CocoaPods/validate_before_dl
    • 99fec61 Switches where we check for invalid input, to move it inside the download fun...
    • 96679f2 [CHANGELOG] Add empty Master section
    • 3a7c54b Release 1.6.1
    • Additional commits viewable in compare view

    Dependabot compatibility score

    Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting @dependabot rebase.


    Dependabot commands and options

    You can trigger Dependabot actions by commenting on this PR:

    • @dependabot rebase will rebase this PR
    • @dependabot recreate will recreate this PR, overwriting any edits that have been made to it
    • @dependabot merge will merge this PR after your CI passes on it
    • @dependabot squash and merge will squash and merge this PR after your CI passes on it
    • @dependabot cancel merge will cancel a previously requested merge and block automerging
    • @dependabot reopen will reopen this PR if it is closed
    • @dependabot close will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually
    • @dependabot ignore this major version will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself)
    • @dependabot ignore this minor version will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself)
    • @dependabot ignore this dependency will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)
    • @dependabot use these labels will set the current labels as the default for future PRs for this repo and language
    • @dependabot use these reviewers will set the current reviewers as the default for future PRs for this repo and language
    • @dependabot use these assignees will set the current assignees as the default for future PRs for this repo and language
    • @dependabot use this milestone will set the current milestone as the default for future PRs for this repo and language

    You can disable automated security fix PRs for this repo from the Security Alerts page.

    dependencies 
    opened by dependabot[bot] 0
  • 循环引用问题cyclic Referenced

    循环引用问题cyclic Referenced

    emptyStateDelegate、emptyStateDataSource objc_setAssociatedObject(self, &AssociatedKeys.emptyStateDataSource, newValue, .OBJC_ASSOCIATION_RETAIN_NONATOMIC)

    ->

                objc_setAssociatedObject(self, &AssociatedKeys.emptyStateDataSource, newValue, .OBJC_ASSOCIATION_ASSIGN)
    
    opened by 13546490786 0
Releases(3.1.0)
Owner
Wizeline
Wizeline is an insights and optimization company whose suite of products helps companies increase product engagement.
Wizeline
Nice library to show placeholders and Empty States for any UITableView/UICollectionView in your project

HGPlaceholders Example To run the example project, clone the repo, and run pod install from the Example directory first. Requirements iOS 8.0+ Xcode 9

Hamza Ghazouani 2.2k Dec 24, 2022
ListPlaceholder is a swift library allows you to easily add facebook style animated loading placeholder to your tableviews or collection views.

ListPlaceholder ListPlaceholder Facebook news feed style animation Features ListPlaceholder is a swift library allows you to easily add facebook style

Moayad Al Kouz 628 Dec 19, 2022
A drop-in UITableView/UICollectionView superclass category for showing empty datasets whenever the view has no content to display

DZNEmptyDataSet Projects using this library Add your project to the list here and provide a (320px wide) render of the result. The Empty Data Set Patt

Ignacio Romero Zurbuchen 12.1k Jan 8, 2023
Nice library to show placeholders and Empty States for any UITableView/UICollectionView in your project

HGPlaceholders Example To run the example project, clone the repo, and run pod install from the Example directory first. Requirements iOS 8.0+ Xcode 9

Hamza Ghazouani 2.2k Dec 24, 2022
Carbon🚴 A declarative library for building component-based user interfaces in UITableView and UICollectionView.

A declarative library for building component-based user interfaces in UITableView and UICollectionView. Declarative Component-Based Non-Destructive Pr

Ryo Aoyama 1.2k Jan 5, 2023
🚴 A declarative library for building component-based user interfaces in UITableView and UICollectionView.

A declarative library for building component-based user interfaces in UITableView and UICollectionView. Declarative Component-Based Non-Destructive Pr

Ryo Aoyama 1.2k Jan 5, 2023
Swift Paging is a framework that helps you load and display pages of data from a larger dataset from local storage or over network.

Swift Paging is a framework that helps you load and display pages of data from a larger dataset from local storage or over network. This approach allows your app to use both network bandwidth and system resources more efficiently. It's built on top of Combine, allowing you to harness its full power, handle errors easily, etc.

Gordan Glavaš 12 Dec 9, 2022
UITableView based component designed to display a hierarchy of expandable/foldable comments.

SwiftyComments UITableView based component designed to display a hierarchy of expandable/foldable comments. Installation Manually Just copy the .swift

Stéphane Sercu 220 Dec 22, 2022
HoverConversion realized vertical paging with UITableView. UIViewController will be paged when reaching top or bottom of UITableView contentOffset.

HoverConversion ManiacDev.com referred. https://maniacdev.com/2016/09/hoverconversion-a-swift-ui-component-for-navigating-between-multiple-table-views

Taiki Suzuki 166 Feb 1, 2022
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
UICollectionView replacement of UITableView. Do even more like Parallax Header, Sticky Section Header. Made for iOS 7.

CSStickyHeaderFlowLayout Contributors For anyone who'd like to be a contributor to the repository, please read the Contribution Guideline Parallax, St

null 5.1k Jan 6, 2023
Placeholder views based on content, loading, error or empty states

StatefulViewController A protocol to enable UIViewControllers or UIViews to present placeholder views based on content, loading, error or empty states

Alexander Schuch 2.1k Dec 8, 2022
Placeholder views based on content, loading, error or empty states

StatefulViewController A protocol to enable UIViewControllers or UIViews to present placeholder views based on content, loading, error or empty states

Alexander Schuch 2.1k Dec 8, 2022
A UICollectionViewLayout subclass displays its items as rows of items similar to the App Store Feature tab without a nested UITableView/UICollectionView hack.

CollectionViewShelfLayout A UICollectionViewLayout subclass displays its items as rows of items similar to the App Store Feature tab without a nested

Pitiphong Phongpattranont 374 Oct 22, 2022
Animated top menu for UITableView / UICollectionView / UIScrollView written in Swift

Persei Animated top menu for UITableView / UICollectionView / UIScrollView written in Swift! Made in Yalantis. Check this project on Dribbble Check th

Yalantis 3.4k Dec 14, 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
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
A generic small reusable components for data source implementation for UITableView/UICollectionView in Swift.

GenericDataSource A generic small reusable components for data source implementation for UITableView/UICollectionView written in Swift. Features Basic

null 132 Sep 8, 2021
A generic stretchy header for UITableView and UICollectionView

GSKStretchyHeaderView, by gskbyte GSKStretchyHeaderView is an implementation of the stretchy header paradigm as seen on many apps, like Twitter, Spoti

Jose Alcalá Correa 1.7k Dec 30, 2022