A generic stretchy header for UITableView and UICollectionView

Overview

GSKStretchyHeaderView, by gskbyte

License Platform Carthage compatible Version

CI Status Coverage

Example 1 Example 2 Example 3 Example 4 Example 5

GSKStretchyHeaderView is an implementation of the stretchy header paradigm as seen on many apps, like Twitter, Spotify or airbnb. It's designed in order to accomplish the following requirements:

  • Compatibility with UITableView and UICollectionView
  • Data source and delegate independency: can be added to an existing view controller withouth interfering with your existing delegate or dataSource
  • Provide support for frame layout, auto layout and Interface Builder .xib files
  • No need to subclass a custom view controller or to use a custom UICollectionViewLayout
  • Simple usage: just implement your own subclass and add it to your UIScrollView subclass
  • Two expansion modes: the header view can grow only when the top of the scroll view is reached, or as soon as the user scrolls down.

If you are using this library in your project, I would be more than glad to know about it!

Usage

To add a stretchy header to your table or collection view, you just have to do this:

var stretchyHeader: GSKStretchyHeaderViewSubclass!

...

func viewDidLoad() {
    super.viewDidLoad()
    let headerSize = CGSize(width: self.tableView.frame.size.width, 
                            height: 200) // 200 will be the default height
    self.stretchyHeader = GSKStretchyHeaderViewSubclass(frame: CGRect(x: 0, y: 0,
                                                                      width: headerSize.width, 
                                                                      height: headerSize.height))
    self.stretchyHeader.delegate = self // this is completely optional
    self.tableView.addSubview(self.stretchyHeader)
}

or

func viewDidLoad() {
    super.viewDidLoad()
    let nibViews = Bundle.main.loadNibNamed("GSKTabsStretchyHeaderView", owner: self, options: nil)
    self.stretchyHeaderView = nibViews.firstObject
    self.tableView.addSubview(self.stretchyHeaderView)
}

Compatibility with iOS 11 and the iPhone X

After the changes introduced in iOS 11, some issues have appeared with the safe area adjustments to scroll views. To avoid glitches and strange behaviours, just do the following when you set up your header view:

if #available(iOS 11.0, *) {
    self.tableView.contentInsetAdjustmentBehavior = .never
}

For the time being, we haven't found a better way to deal with the contentInset adjustment, so the support for the iPhone X and the safeAreaInsets is not there yet. This may require a major refactor of the header view and a major release. For more information, see this issue and this PR (#68).

Configuration

You can change multiple parameters in your stretchy header view:

// you can change wether it expands at the top or as soon as you scroll down
headerView.expansionMode = .immediate

// You can change the minimum and maximum content heights
headerView.minimumContentHeight = 64 // you can replace the navigation bar with a stretchy header view
headerView.maximumContentHeight = 280

// You can specify if the content expands when the table view bounces, and if it shrinks if contentView.height < maximumContentHeight. This is specially convenient if you use auto layout inside the stretchy header view
headerView.contentShrinks = true
headerView.contentExpands = false // useful if you want to display the refreshControl below the header view

// You can specify wether the content view sticks to the top or the bottom of the header view if one of the previous properties is set to `false`
// In this case, when the user bounces the scrollView, the content will keep its height and will stick to the bottom of the header view
headerView.contentAnchor = .bottom

Creating your stretchy header

There are two ways to create your own stretchy header:

  • Create a stretchy header subclass and add subviews to its contentView. You can layout its subviews manipulating their frames or using Auto Layout (also works with GranadaLayout :trollface:).
  • Create an Interface Builder file and map it to your GSKStretchyHeaderView subclass. Subviews added to the stretchy header will be automatically moved to the content view, keeping their constraints. Remember to set the properties maximumContentHeight and minimumContentHeight in the attributes inspector (fourth tab on the right panel in Interface Builder).

To modify the behaviour and layout of your stretchy header, just override the method -didChangeStretchFactor: in your subclass, where you can adjust it by using the stretchFactor. To get a more detailed description of the properties, please have a look at the source code. There are also a few usage examples in the example project. You can also take them as a reference for your own stretchy headers.

Example project

To run the example project, clone the repo and open the workspace file GSKStretchyHeaderView.xcworkspace.

You can also use pod try GSKStretchyHeaderView.

Installation

GSKStretchyHeaderView is available through CocoaPods. To install it, simply add the following line to your Podfile, you can check the Example Podfile to see how it looks like:

pod "GSKStretchyHeaderView"

GSKStretchyHeaderView is also available through Carthage. To install it, just add this line to your `Cartfile:

github "gskbyte/GSKStretchyHeaderView"

and run

carthage update GSKStretchyHeaderView

Author

Jose Alcalá Correa

Contributions

Contributions are more than welcome! If you find a solution for a bug or have an improvement, don't hesitate to open a pull request!

License

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

If your app uses GSKStretchyHeaderView, I'd be glad if you ping me via Twitter or via email.

Changelog

Comments
  • iOS 11 Header problem

    iOS 11 Header problem

    Hi, There is a small problem with GSKStretchyHeaderView on iOS 11, above the tableview there is a blank space, how to fix the problem is urgent for me. Can you help me ? Thanks Watch the screenshots :

    simulator screen shot - iphone 8 - 2017-09-26 at 13 45 55 simulator screen shot - iphone 8 - 2017-09-26 at 13 49 26

    bug iOS 11 Hacktoberfest 
    opened by victorpierre789 14
  • Issue when using with UITableView section header view

    Issue when using with UITableView section header view

    Hello @gskbyte,

    Thank you for the awesome library! :)

    I am having an issue when using this library with an UITableView that has sections and sections header views. The problem is that, as we already know, UITableView section header views are sticky, and the remain on the top when scrolling, but when using them with GSKStretchyHeaderView, they never reach the top, instead, they are stuck at the maximumContentHeight distance from the top.

    Do you have any workaround for this issue? I was reading through the already closed issues here, and some users reported a similar problem (#5), but the solution suggested there did not work for me.

    I have noticed that a similar solution is included in your example project:

    - (void)scrollViewDidScroll:(UIScrollView *)scrollView {
        UIEdgeInsets scrollViewContentInset = scrollView.contentInset;
        if (scrollView.contentOffset.y > -self.stretchyHeaderViewMinimumContentHeight) {
            scrollViewContentInset.top = self.stretchyHeaderViewMinimumContentHeight;
        } else if (scrollView.contentOffset.y < -self.stretchyHeaderViewMaximumContentHeight) {
            scrollViewContentInset.top = self.stretchyHeaderViewMaximumContentHeight;
        } else {
            scrollViewContentInset.top = -scrollView.contentOffset.y;
        }
        scrollView.contentInset = scrollViewContentInset;
    }
    

    but there is a problem with this workaround - when you scroll back, the UITableView does not scroll smoothly. Feel free to check it out, the same applies for the example project.

    I would really appreciate you assistance in solving this.

    Thanks in advance, and keep up the good work!

    opened by sasojadrovski 13
  • Adjust height Dynamically

    Adjust height Dynamically

    I really like this library, and so far it is working great with one small issue. I have a Xib that I use for the header view. The Xib has a vertical Stackview with one element as a UILabel. Now this UILabel gets data from API and is a multi line label. There could 1, 2,3 lines or no text at all. The Stackview also uses auto layout in the Xib and is pinned to the top, bottom, left. What I am noticing is that GSKStretchyHeaderView is always using the default maximumContentHeight (240) no matter what the content of the Stackview is, which is resulting in gaps being left in the header. Is there a way to calculate the maximumContentHeight dynamically based on the content of the Stackview inside the Xib? any help will be greatly appreciated.

    opened by annjawn 9
  • Pagination problems

    Pagination problems

    Hi! I've been using GSKStretchyHeaderView on a project. It works great, except when I use pagination on a tableView. As soon as the tableView loads more items/rows, the header jumps back to expanded mode. Also, when scrolling through pages, it jumps between totally contracted/expanded states. (eg. if my pagination count is 5, every 5 items it jumps). I suppose these issues are respectively related to:

    1. tableView.reloadData() fired by the pagination, which causes the header to go back to its original state.
    2. changes in the tableView's content height, which is breaking something. Does anyone have any idea how to solve these issues?
    opened by yvesbastos 8
  • HeaderView not visible

    HeaderView not visible

    I implemented this functionality on table view. i outlet my header view and map it with GSKStretchyHeaderView and add as a subview on table view.

    When we go to view controller header not visible then i scroll table view then header visible and invisible. i am using auto layout in header view.

    can you tell me what is the problem?

    opened by DomenicoGranito 8
  • Bad Calculation for UICollectionView

    Bad Calculation for UICollectionView

    There is a bug when you use this library for a collectionView: Steps for replicate the bug:

    1. Create a collection view.
    2. Set the property: sectionHeadersPinToVisibleBounds = YES. (for the UICollectionViewFlowLayout)
    3. Add a header for any section.
    4. Configure the strechy subclass like this: header.minimumContentHeight = 64 header.maximumContentHeight = 200 header.expansionMode = GSKStretchyHeaderViewExpansionMode.topOnly header.contentShrinks = true header.contentExpands = true header.contentAnchor = GSKStretchyHeaderViewContentAnchor.top
    5. Run the app and you will see that the section header pins to the maximumContentHeight but the sticky header could be minimized at that moment. So that's the issue.

    Attach you will find an screenshot. (PS: The header is located in section 1, not in section 0, so this collection view has: 3 rows in section 0 1 header in section 1 5 rows in section 1) img_3622

    opened by glassipbel 8
  • using swift GSKStretchyHeaderView with nib

    using swift GSKStretchyHeaderView with nib

    I'm having problems using a GSKStretchyHeaderView associated with a nib file that exposes IBOutlet property. I'm getting this error when I try to load the nib: `let nibViews = NSBundle.mainBundle().loadNibNamed("GSKNibStretchyHeaderView", owner: self, options: nil)

    setValue:forUndefinedKey:]: this class is not key value coding-compliant for the key backgroundImageView.`

    could you see if you can reproduce it, an eventually add it to the Example project.

    Thanks for this library

    opened by violabg 8
  • Header covers table view while cell is animating

    Header covers table view while cell is animating

    Hi! Great work! I noticed something weird and haven't quite figured out a solution yet. I subclassed GSKStretchyHeaderView and added it to my table view. Everything works great but the header always covers table view cells during cell's animation (to be more specific, this is the table view animation I'm using: https://github.com/Ramotion/folding-cell). This only happens when header's height is smaller than its max height(aka, when scrolled up). It looks like this issue #5 but I'm not sure what exactly is causing this problem. Any ideas?

    opened by Jackson0111 8
  • Twitter-Like Header: doesn't snap back

    Twitter-Like Header: doesn't snap back

    We have implemented a header view based pretty much exactly off the Twitter-like example. The main difference is that we centered the UserImage View and made it larger. We also added an additional field below the description field you had. So some pretty minor layout changes.

    It looks great when the view first loads. However, (only after) I scroll through a page of data in the view and THEN scroll back to the top, when the top scrolls to the full size again. the header background image stays extremely large, and forces all the fields below it to compress and clip.

    Why would this be happening?

    Example image attached.

    gsk-header-example

    Sorry for the blurs. (Customer data)

    opened by btrzupek 8
  • AutoLayout Issue

    AutoLayout Issue

    XIB file 2017-10-23 7 16 36

    and

        self.userProfileView = UserProfileHeaderView.view()
        
        self.tableView.addSubview(userProfileView)
    

    if no autoLayout then

    2017-10-23 7 18 10

    if set autoLayout then

    Terminating app due to uncaught exception 'NSGenericException', reason: 'Unable to activate constraint with anchors <NSLayoutXAxisAnchor:0x60c000467dc0 "UILayoutGuide:0x60c0001b74c0'UIViewSafeAreaLayoutGuide'.trailing"> and <NSLayoutXAxisAnchor:0x60c000467e00 "UILabel:0x7fd3b8b3d580'nickname'.trailing"> because they have no common ancestor. Does the constraint or its anchors reference items in different view hierarchies? That's illegal.'

    what is my missing? help me bro

    opened by yunchiri 7
  • Extra padding space in my tableView

    Extra padding space in my tableView

    Hi, I've been using this library since the time I discovered this, until now. However, now I am experiencing an annoying problem. I am putting a custom view which has a map inside in my stretchyHeader, and my tableView is having an extra space. When I use the Debug View Hierarchy feature of Xcode, I can see that the extra space is called UITableViewWrapper. See the screenshots.

    screen shot 2017-04-19 at 4 27 04 pm

    screen shot 2017-04-19 at 4 27 13 pm

    So... how to remove this one? Or what's causing this? Similar question from SO: http://stackoverflow.com/questions/18880341/why-is-there-extra-padding-at-the-top-of-my-uitableview-with-style-uitableviewst

    However, no answer worked and I believe this is caused by the library.

    opened by glennposadas 7
  • Bump nokogiri from 1.13.9 to 1.13.10

    Bump nokogiri from 1.13.9 to 1.13.10

    Bumps nokogiri from 1.13.9 to 1.13.10.

    Release notes

    Sourced from nokogiri's releases.

    1.13.10 / 2022-12-07

    Security

    • [CRuby] Address CVE-2022-23476, unchecked return value from xmlTextReaderExpand. See GHSA-qv4q-mr5r-qprj for more information.

    Improvements

    • [CRuby] XML::Reader#attribute_hash now returns nil on parse errors. This restores the behavior of #attributes from v1.13.7 and earlier. [#2715]

    sha256 checksums:

    777ce2e80f64772e91459b943e531dfef387e768f2255f9bc7a1655f254bbaa1  nokogiri-1.13.10-aarch64-linux.gem
    b432ff47c51386e07f7e275374fe031c1349e37eaef2216759063bc5fa5624aa  nokogiri-1.13.10-arm64-darwin.gem
    73ac581ddcb680a912e92da928ffdbac7b36afd3368418f2cee861b96e8c830b  nokogiri-1.13.10-java.gem
    916aa17e624611dddbf2976ecce1b4a80633c6378f8465cff0efab022ebc2900  nokogiri-1.13.10-x64-mingw-ucrt.gem
    0f85a1ad8c2b02c166a6637237133505b71a05f1bb41b91447005449769bced0  nokogiri-1.13.10-x64-mingw32.gem
    91fa3a8724a1ce20fccbd718dafd9acbde099258183ac486992a61b00bb17020  nokogiri-1.13.10-x86-linux.gem
    d6663f5900ccd8f72d43660d7f082565b7ffcaade0b9a59a74b3ef8791034168  nokogiri-1.13.10-x86-mingw32.gem
    81755fc4b8130ef9678c76a2e5af3db7a0a6664b3cba7d9fe8ef75e7d979e91b  nokogiri-1.13.10-x86_64-darwin.gem
    51d5246705dedad0a09b374d09cc193e7383a5dd32136a690a3cd56e95adf0a3  nokogiri-1.13.10-x86_64-linux.gem
    d3ee00f26c151763da1691c7fc6871ddd03e532f74f85101f5acedc2d099e958  nokogiri-1.13.10.gem
    
    Changelog

    Sourced from nokogiri's changelog.

    1.13.10 / 2022-12-07

    Security

    • [CRuby] Address CVE-2022-23476, unchecked return value from xmlTextReaderExpand. See GHSA-qv4q-mr5r-qprj for more information.

    Improvements

    • [CRuby] XML::Reader#attribute_hash now returns nil on parse errors. This restores the behavior of #attributes from v1.13.7 and earlier. [#2715]
    Commits
    • 4c80121 version bump to v1.13.10
    • 85410e3 Merge pull request #2715 from sparklemotion/flavorjones-fix-reader-error-hand...
    • 9fe0761 fix(cruby): XML::Reader#attribute_hash returns nil on error
    • 3b9c736 Merge pull request #2717 from sparklemotion/flavorjones-lock-psych-to-fix-bui...
    • 2efa87b test: skip large cdata test on system libxml2
    • 3187d67 dep(dev): pin psych to v4 until v5 builds in CI
    • a16b4bf style(rubocop): disable Minitest/EmptyLineBeforeAssertionMethods
    • See full diff 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
  • TableView does not show the header

    TableView does not show the header

    Hi I'm getting, a weird behaviour using the lib, when I run the app I get the app with the table view set to 0,0 position of the screen. This problem is not happening on ios 13.2.1, it happens on earlier version. If I scroll down I can see the header view and it works as expected, the issue is that when it starts for the first time it is hidden.

    Screenshot 2019-12-02 at 23 00 42 Screenshot 2019-12-02 at 23 01 15

    This is the setup of my stretchy view:

        private let stretchyHeader: StretchyHeaderView = {
            let stretchyHeader = StretchyHeaderView(headerHeight: 350)
            stretchyHeader.expansionMode = .topOnly
            return stretchyHeader
        }()
    

    I set it as subview of my table view in the viewDidLoad() method. The StretchyHeaderView is a custom subview where I setup a main image with auto layout, I use snapkit. The image is constrained to all the edges of the content view. If I inspect the view using the UI debugger I can see that the StretchyHeaderView has a weird value of height of -0.

    Do you have any suggestions? Thanks.

    opened by mulp 0
  • TableView section grouped

    TableView section grouped

    Hi , i am using the stretchyheaderview for a tableView which have sections. the problem is that the sections are over the header , how can i resolve this issue please ??

    opened by yankelandroid 2
  • Drop shadow issue

    Drop shadow issue

    I ve tried to give bottom drop shadow to headerView but none of them worked, is there anything should I know ? I ve tried these code blocks:

    headerView.layer.shadowOpacity = 1
    headerView.layer.shadowOffset = CGSize(width: 0, height: 1)
    headerView.layer.shadowRadius = 1
    

    let layer : CAGradientLayer
    layer.colors = [fromColor.cgColor, toColor.cgColor]
    layer.shadowRadius = 1
    layer.startPoint = CGPoint(x: 0.5, y: 1.0)
    layer.endPoint = CGPoint(x: 0.5, y: 0.0)
    layer.frame = CGRect(x: 0.0, y: headerView.frame.height - shadowRadius, width: headerView.frame.width, height: shadowRadius)
    headerView.layer.addSublayer(layer)
    
    opened by ahmetcanakgl 0
  • Refresh control above header?

    Refresh control above header?

    I need to implement the refresh control above the header, right now we show it below the header, between the header and the collection view data thank you :)

    opened by aberguno 0
Owner
Jose Alcalá Correa
ahora vas y lo cascas
Jose Alcalá Correa
Parallax scrolling effect on UITableView header view when a tableView is scrolled

ParallaxTableViewHeader Parallax scrolling effect on UITableView header view when a tableView is scrolled Usage Create a ParallaxHeaderView using eith

Vinodh Swamy 1.3k Nov 27, 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
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
Parallax scrolling effect on UITableView header view when a tableView is scrolled

ParallaxTableViewHeader Parallax scrolling effect on UITableView header view when a tableView is scrolled Usage Create a ParallaxHeaderView using eith

Vinodh Swamy 1.3k Nov 27, 2022
Simple way to add parallax header to UIScrollView/UITableView written in Swift.

ParallaxHeader Simple way to add parallax header to UIScrollView or it's subclasses. One image view Slider with images Blur vibrant text Blur round ic

Roman Sorochak 998 Dec 11, 2022
Pull-to-refresh animation in UICollectionView with a sticky header flow layout, written in Swift :large_orange_diamond:

ReplaceAnimation Implementation of Zee Young's Dribbble animation (https://dribbble.com/shots/2067564-Replace) Info I really liked Zee Young's animati

Alex Türk 957 Sep 13, 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
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
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
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 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
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
Appstore card animation transition. UICollectionView and UITableView card expand animated transition

Appstore card animation transition. UICollectionView and UITableView card expand animated transition. This library tries to add the appstore transition to your own app. The goal is to be as simple as possible to integrate in an app while keeping the flexibility and customization alive.

appssemble 544 Dec 28, 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
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
WLEmptyState is an iOS based component that lets you customize the view when the dataset of a UITableView or a UICollectionView is empty.

Table of Content Overview Running an Example Project Installing WLEmptyState Configuring WLEmptyState Using WLEmptyState Customizing WLEmptyState Cont

Wizeline 315 Dec 5, 2022
ZHTCView - UITableview & UICollectionView

ZHTCView 这是一个使用Block替换代理的UITableview & UICollectionView。 使用方法如下: - (DSTableView *)tableView { if (!_tableView) { _tableView = DSTableView.

黑酒一 0 Jan 10, 2022