UIScrollView ∞ scroll category

Overview

UIScrollView+InfiniteScroll

Infinite scroll implementation as a category for UIScrollView.

* The content used in demo app is publicly available and provided by hn.algolia.com and Flickr. Both can be inappropriate.

Swizzling

Be aware that this category swizzles setContentOffset and setContentSize on UIScrollView.

CocoaPods

Just add the following line in your Podfile:

pod 'UIScrollView-InfiniteScroll', '~> 1.2.0'

Carthage

Just add the following line in your Cartfile:

github "pronebird/UIScrollView-InfiniteScroll" ~> 1.2.0

Examples

This component comes with example app written in Swift and Objective-C.

If you use CocoaPods you can try it by running:

pod try UIScrollView-InfiniteScroll

Documentation

http://pronebird.github.io/UIScrollView-InfiniteScroll/

Before using module

Objective-C

Import header file in Objective-C:

#import <UIScrollView_InfiniteScroll/UIScrollView+InfiniteScroll.h>

Swift

Add the following line in your bridging header file:

#import <UIScrollView_InfiniteScroll/UIScrollView+InfiniteScroll.h>

Basics

In order to enable infinite scroll you have to provide a handler block using addInfiniteScrollWithHandler. The block you provide is executed each time infinite scroll component detects that more data needs to be provided.

The purpose of the handler block is to perform asynchronous task, typically networking or database fetch, and update your scroll view or scroll view subclass.

The block itself is called on main queue, therefore make sure you move any long-running tasks to background queue. Once you receive new data, update table view by adding new rows and sections, then call finishInfiniteScroll to complete infinite scroll animations and reset the state of infinite scroll components.

viewDidLoad is a good place to install handler block.

Make sure that any interactions with UIKit or methods provided by Infinite Scroll happen on main queue. Use dispatch_async(dispatch_get_main_queue, { ... }) in Objective-C or DispatchQueue.main.async { ... } in Swift to run UI related calls on main queue.

Many people make mistake by using external reference to table view or collection view within the handler block. Don't do this. This creates a circular retention. Instead use the instance of scroll view or scroll view subclass passed as first argument to handler block.

Objective-C

// setup infinite scroll
[tableView addInfiniteScrollWithHandler:^(UITableView* tableView) {
    // update table view
    
    // finish infinite scroll animation
    [tableView finishInfiniteScroll];
}];

Swift

tableView.addInfiniteScroll { (tableView) -> Void in
    // update table view
            
    // finish infinite scroll animation
    tableView.finishInfiniteScroll()
}

Collection view quirks

UICollectionView.reloadData causes contentOffset to reset. Instead use UICollectionView.performBatchUpdates when possible.

Objective-C

[self.collectionView addInfiniteScrollWithHandler:^(UICollectionView* collectionView) {    
    [collectionView performBatchUpdates:^{
        // update collection view
    } completion:^(BOOL finished) {
        // finish infinite scroll animations
        [collectionView finishInfiniteScroll];
    }];
}];

Swift

collectionView.addInfiniteScroll { (collectionView) -> Void in
    collectionView.performBatchUpdates({ () -> Void in
        // update collection view
    }, completion: { (finished) -> Void in
        // finish infinite scroll animations
        collectionView.finishInfiniteScroll()
    });
}

Start infinite scroll programmatically

You can reuse infinite scroll flow to load initial data or fetch more using beginInfiniteScroll(forceScroll). viewDidLoad is a good place for loading initial data, however absolutely up to you to decide.

When forceScroll parameter is positive, Infinite Scroll component will attempt to scroll down to reveal indicator view. Keep in mind that scrolling will not happen if user is interacting with scroll view.

Objective-C

[self.tableView beginInfiniteScroll:YES];

Swift

tableView.beginInfiniteScroll(true)

Prevent infinite scroll

Sometimes you need to prevent the infinite scroll from continuing. For example, if your search API has no more results, it does not make sense to keep making the requests or to show the spinner.

Objective-C

[tableView setShouldShowInfiniteScrollHandler:^BOOL (UITableView *tableView) {
    // Only show up to 5 pages then prevent the infinite scroll
    return (weakSelf.currentPage < 5);
}];

Swift

// Provide a block to be called right before a infinite scroll event is triggered.  Return YES to allow or NO to prevent it from triggering.
tableView.setShouldShowInfiniteScrollHandler { _ -> Bool in
    // Only show up to 5 pages then prevent the infinite scroll
    return currentPage < 5 
}

Seamlessly preload content

Ideally you want your content to flow seamlessly without ever showing a spinner. Infinite scroll offers an option to specify offset in points that will be used to start preloader before user reaches the bottom of scroll view.

The proper balance between the number of results you load each time and large enough offset should give your users a decent experience. Most likely you will have to come up with your own formula for the combination of those based on kind of content and device dimensions.

// Preload more data 500pt before reaching the bottom of scroll view.
tableView.infiniteScrollTriggerOffset = 500;

Custom indicator

You can use custom indicator instead of default UIActivityIndicatorView.

Custom indicator must be a subclass of UIView and implement the following methods:

- (void)startAnimating;
- (void)stopAnimating;

Objective-C

CustomInfiniteIndicator *infiniteIndicator = [[CustomInfiniteIndicator alloc] initWithFrame:CGRectMake(0, 0, 40, 40)];
self.tableView.infiniteScrollIndicatorView = indicator;

Swift

let frame = CGRect(x: 0, y: 0, width: 24, height: 24)
tableView.infiniteScrollIndicatorView = CustomInfiniteIndicator(frame: frame)

Please see example implementation of custom indicator view:

At the moment InfiniteScroll uses indicator's frame directly so make sure you size custom indicator view beforehand. Such views as UIImageView or UIActivityIndicatorView will automatically resize themselves so no need to setup frame for them.

Contributors

Please see CHANGES

Attributions

Demo app icon by PixelResort.

Comments
  • Seeing Crash on iOS 10 beta 8

    Seeing Crash on iOS 10 beta 8

    iOS version: 10.0.0 (14A5309d) Lib version: latest

    Crashed: com.apple.main-thread
    0  libobjc.A.dylib                0x1930b6eb0 objc_msgSend + 16
    1  CoreFoundation                 0x1939cd584 -[NSArray makeObjectsPerformSelector:] + 232
    2  UIKit                          0x199bd75a0 -[UIScrollView(UIScrollViewInternal) _notifyDidScroll] + 180
    3  UIKit                          0x1998e45dc -[UIScrollView setContentOffset:] + 384
    4  UIScrollView_InfiniteScroll    0x1017b00c8 -[UIScrollView(InfiniteScroll) pb_setContentOffset:] (UIScrollView+InfiniteScroll.m:307)
    5  UIKit                          0x19999c748 -[UITableView setContentOffset:] + 272
    6  UIKit                          0x199a6c2e8 -[UIScrollView _updatePanGesture] + 1816
    7  UIKit                          0x199e7b3b8 -[UIGestureRecognizerTarget _sendActionWithGestureRecognizer:] + 64
    8  UIKit                          0x199e7e9d8 _UIGestureRecognizerSendTargetActions + 124
    9  UIKit                          0x199a58fdc _UIGestureRecognizerSendActions + 532
    10 UIKit                          0x1998f7d70 -[UIGestureRecognizer _updateGestureWithEvent:buttonEvent:] + 1016
    11 UIKit                          0x199e6ea9c _UIGestureEnvironmentUpdate + 808
    12 UIKit                          0x199e6e720 -[UIGestureEnvironment _deliverEvent:toGestureRecognizers:usingBlock:] + 408
    13 UIKit                          0x199e6d958 -[UIGestureEnvironment _updateGesturesForEvent:window:] + 268
    14 UIKit                          0x1998f5e90 -[UIWindow sendEvent:] + 2960
    15 UIKit                          0x1998c69b0 -[UIApplication sendEvent:] + 248
    16 UIKit                          0x19a0901d8 __dispatchPreprocessedEventFromEventQueue + 2832
    17 UIKit                          0x19a089a08 __handleEventQueue + 784
    18 CoreFoundation                 0x193a5a418 __CFRUNLOOP_IS_CALLING_OUT_TO_A_SOURCE0_PERFORM_FUNCTION__ + 24
    19 CoreFoundation                 0x193a59d60 __CFRunLoopDoSources0 + 524
    20 CoreFoundation                 0x193a57960 __CFRunLoopRun + 804
    21 CoreFoundation                 0x1939878d8 CFRunLoopRunSpecific + 444
    22 GraphicsServices               0x19538e198 GSEventRunModal + 180
    23 UIKit                          0x1999317c8 -[UIApplication _run] + 664
    24 UIKit                          0x19992c534 UIApplicationMain + 208
    25 ios                            0x100160280 main (AppDelegate.swift:24)
    26 libdispatch.dylib              0x1935285b8 (Missing)
    
    uikit-bug 
    opened by allaire 20
  • Trigger offset added

    Trigger offset added

    I added a property to set an offset between the real end of the scroll view content and the scroll position, so the handler can be triggered before reaching end. I also updated the example.

    enhancement 
    opened by GorkaMM 14
  • Activity Indicator hides a little late

    Activity Indicator hides a little late

    After fetching the data from server, when the new collection view items are inserted then the activity indicator hides late for 1 sec. What i want to do is to hide the activity indicator before the items are inserted, so inorder to resolve this what has to be done.

    Thank you.

    wontfix 
    opened by vinod93 13
  • Manually trigger loading (displaying loading indicator and calling infinite scroll handler)

    Manually trigger loading (displaying loading indicator and calling infinite scroll handler)

    On initial loading data for a scrollView I want to display the same loading indicator. So without user interaction I want loading indicator to appear in scroll view and infinite scroll handler to be called. As far as I can see it's not possible in current implementation. I think this functionality could be useful.

    enhancement 
    opened by pankkor 12
  • Using [weak self] in Swift closure results crash when popping from UINavigationController.

    Using [weak self] in Swift closure results crash when popping from UINavigationController.

    I reproduced the crash here:

    https://github.com/gbmksquare/InfiniteScrollCrash-Sample

    I have the infinite scroll view in a navigation stack. I set up with the code below.

    tableView.addInfiniteScrollWithHandler { [weak self] (_) -> Void in
        let delay = dispatch_time(DISPATCH_TIME_NOW, Int64(1 * Double(NSEC_PER_SEC)))
            dispatch_after(delay, dispatch_get_main_queue(), { () -> Void in
            self?.tableView.finishInfiniteScroll()
        })
    }
    

    And I have a UIScrollViewDelegate method implemented.

    func scrollViewDidScroll(scrollView: UIScrollView) {
        // Some code
    }
    

    When I activate the infinite scrolling and pop the view, the app crashes at - (void)pb_setContentOffset:(CGPoint)contentOffset;

    I think it is caused by view controller not retained when it is popping from the navigation stack, and found two workarounds.

    override func viewWillDisappear(animated: Bool) {
        tableView.finishInfiniteScroll()
        super.viewWillDisappear(animated)
    }
    // or
    override func viewDidDisappear(animated: Bool) {
        tableView.delegate = nil
        super.viewDidDisappear(animated)
    }
    

    But I have no idea how I can fix it from the library level.

    uikit-bug 
    opened by gbmksquare 10
  • cant click on item in table view when then page list doesnt fill the screen

    cant click on item in table view when then page list doesnt fill the screen

    If you have a collection view or table view with only like 3 items in it, if you scroll down just a little bit and there are no more items the loader dismisses but doesn't fully scroll back to the top. Then after that clicking on an item just tries to load more items and doesn't let you click it until you pull down manually. see attached video

    https://drive.google.com/open?id=0B4kg_oK02hFPd3M0YjRma2ZJNjQ

    bug 
    opened by eclair4151 9
  • Not scrolling back when new content arrives

    Not scrolling back when new content arrives

    By default, when new content arrives, the bottomInset resets; so the scrollView scrolls up a bit and the only notification for new content is decrease length of scroll bar. I've changed this so the bottomInset won't reset and there is always a constant inset at the bottom of table, except when the scrollable content has been ended.


    This change is Reviewable

    awaiting-input 
    opened by Kianoosh76 8
  • Объяните плиз)

    Объяните плиз)

    В категории есть метод

    • (void)addInfiniteScrollWithHandler:(void(^)(UIScrollView* scrollView))handler; Зачем он нужен?что он начинает делать? И так же
    • (void)removeInfiniteScroll; Его необходимо всегда вызывать или только когда используешь первый метод?
    opened by SergeyOleynich 8
  • Infinite Scroll not triggered with small number of items

    Infinite Scroll not triggered with small number of items

    We're using your control to pull data down from a web service using a date range and display them in a UICollectionView. We've noticed that if we only have a small number of items (small enough that they all fit on the screen with no need to scroll) scrolling down to the bottom of the page does not trigger an infinite scroll event the way it would if we had a large number of items. The event is never started, so our infinite scroll handler block is not called to grab the next set of items in the next date range.

    Any idea how we can go about fixing this? Ideally, if the scroll bounces to the bottom of the scroll view we'd like to have the infinite scroll handler kicked off.

    bug 
    opened by TheGeekPharaoh 8
  • Content size problems.

    Content size problems.

    When calling finishInfiniteScroll, tableView's content size changing, so when i drag up - table view lagging, becouse, i think, it recalculating size. For note: i use UITableViewAutomaticDimension for calculating row height.

    bug 
    opened by NikKovIos 7
  • Scroll to Top Not Working with Infinite Scroll

    Scroll to Top Not Working with Infinite Scroll

    I have a UIViewController with tableView which has headerView in it. I am trying to implement a scroll to top functionality if tab bar is tapped. This is how I implement the scrollToTop functionality:

    tableView.scrollRectToVisible(CGRectMake(0, 0, 1, 1), animated: true)
    

    But somehow, it only scrolls halfway. The more I call infinite scroll, the farther it gets from the top. I suspect that it sets contentSize with the wrong value. I also tried setContentOffset but it was not working as well.

    uikit-bug 
    opened by wlzch 7
  • Scroll content a bit after hiding

    Scroll content a bit after hiding

    Is it possible to show that new content is being loaded? For now, it's quite unclear to the user until they manually scroll to the bottom. For instance, it could be scrolling a bit to the bottom to show a part of the new cell that appeared.

    opened by denis-obukhov 1
  • Infinite scroll handler never called

    Infinite scroll handler never called

    Hi, I'll explain you my situation:

    1. I have a framework where I added UIScrollView-InfiniteScroll with Carthage, where I have a page with a simple table view
    2. In the same project an example app to test the page and there the scroll works perfectly
    3. I have a main app where I use the framework (point 1) that provides the page with the infinite scroll and when I try to scroll from the main app the scrolling handler is never called

    I checked with the debugger and addInfiniteScroll is called correctly when the table is initialised. Also in the main app (point 3) we have a dependency to UIScrollView-InfiniteScroll but with cocoa pods, but I don't think that's the reason of the problem.

    Edit: I tried to add ordersTableView.beginInfiniteScroll(true) snd the automatic scroll works and load the second page, but if I scroll manually it doesn't work. Any Idea about what it can depend on?

    opened by ilahomesick 1
  • Need controll ScrollViewDragging

    Need controll ScrollViewDragging

    This pull requet solves the problem when table is on scrollview. And when scrolling the table the content offset of the scrollview changes.

    In this case, the library does not work, since dragging is not called.

    opened by vklmksm 1
  • setContentOffset/scrollRectToVisible works unexpected after infinite scroll handler invoked at least once

    setContentOffset/scrollRectToVisible works unexpected after infinite scroll handler invoked at least once

    The same behaviour can be noticed in demo app: add leftNavBarItem "Up", which will handle tap as tableView.setContentOffset(CGPoint(x: 0, y: -tableView.contentInset.top), animated: true) for example. Scroll by finger to bottom, wait till fetching will be completed, then tap "Up" button and you will end up with messed contentOffset. When I was debugging this in my project I noticed that swizzled method pb_setContentOffset wasn't logging last values, i.e. contentSize was (375, 12000), contentOffset was (0, 6000), after setContentOffset (or scrollRectToVisivle with (0,0,tableView.frame.size.width, 1.0)) final log in pb_setContentOffset was like ±600, and it was the exact position according to View Debugger. Second tap when have an offset of 600 is driving contentOffset to be correct. Any thoughts or workarounds?

    opened by Aft3rmathpwnz 7
  • Crash on proxy method

    Crash on proxy method "setContentOffset"

    Hello, i cant reproduce constantly crash but sometimes it happens and i dont know why. It start crashing after we add library to project. I make exception breakpoint and it shows that it crashes on swizzled method pb_setContentOffset:

    2018-09-14 15:22:30.361572+0700 TestApp[78861:15083844] *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[UILayoutGuide nsli_engineToUserScalingCoefficients]: unrecognized selector sent to instance 0x6040005bf3a0'
    
    First throw call stack:
    (
    0 CoreFoundation 0x0000000110a881e6 __exceptionPreprocess + 294
    1 libobjc.A.dylib 0x000000010fcd4031 objc_exception_throw + 48
    2 CoreFoundation 0x0000000110b09784 -[NSObject(NSObject) doesNotRecognizeSelector:] + 132
    3 UIKit 0x000000010e31f0e2 -[UILayoutGuide forwardInvocation:] + 95
    4 CoreFoundation 0x0000000110a0a5f8 __forwarding__ + 760
    5 CoreFoundation 0x0000000110a0a278 _CF_forwarding_prep_0 + 120
    6 Foundation 0x000000010f83d7b1 -[NSLayoutAnchor nsli_lowerIntoExpression:withCoefficient:forConstraint:] + 275
    7 Foundation 0x000000010f7029a5 -[NSLayoutConstraint _lowerIntoExpression:reportingConstantIsRounded:] + 99
    8 Foundation 0x000000010f707fc0 -[NSLayoutConstraint _containerGeometryDidChange] + 88
    9 UIKit 0x000000010d58c10b -[UIView(Geometry) setBounds:] + 2516
    10 UIKit 0x000000010d5b58aa -[UIScrollView setBounds:] + 1140
    11 UIKit 0x000000010d5b6b09 -[UIScrollView setContentOffset:] + 438
    12 UIScrollView_InfiniteScroll 0x000000010f6716ef -[UIScrollView(InfiniteScroll) pb_setContentOffset:] + 63
    13 UIKit 0x000000010d5d9a83 -[UIScrollView(UIScrollViewInternal) _adjustContentOffsetIfNecessary] + 53
    14 UIKit 0x000000010d5d2cd0 -[UIScrollView(UIScrollViewInternal) _stopScrollingNotify:pin:tramplingDragFlags:] + 462
    15 UIKit 0x000000010d5b8565 -[UIScrollView removeFromSuperview] + 32
    16 UIKit 0x000000010d577c07 -[UIView dealloc] + 508
    17 UIKit 0x000000010d67947c -[UIViewController dealloc] + 665
    18 CoreFoundation 0x00000001109c03dd -[__NSArrayI dealloc] + 61
    19 libobjc.A.dylib 0x000000010fce8a6e _ZN11objc_object17sidetable_releaseEb + 202
    20 UIKit 0x000000010d6ac398 _destroy_helper_block.538 + 31
    21 libsystem_blocks.dylib 0x00000001131f998a _Block_release + 111
    22 libsystem_blocks.dylib 0x00000001131f998a _Block_release + 111
    23 UIKit 0x000000010d6c3976 _destroy_helper_block.1809 + 19
    24 libsystem_blocks.dylib 0x00000001131f998a _Block_release + 111
    25 UIKit 0x000000010d6c58d9 -[UINavigationController _startDeferredTransitionIfNeeded:] + 1569
    26 UIKit 0x000000010d6c686c -[UINavigationController __viewWillLayoutSubviews] + 150
    27 UIKit 0x000000010d91ed0b -[UILayoutContainerView layoutSubviews] + 231
    28 UIKit 0x000000010d5a87a8 -[UIView(CALayerDelegate) layoutSublayersOfLayer:] + 1515
    29 QuartzCore 0x000000011197b456 -[CALayer layoutSublayers] + 177
    30 QuartzCore 0x000000011197f667 _ZN2CA5Layer16layout_if_neededEPNS_11TransactionE + 395
    31 QuartzCore 0x00000001119060fb _ZN2CA7Context18commit_transactionEPNS_11TransactionE + 343
    32 QuartzCore 0x000000011193379c _ZN2CA11Transaction6commitEv + 568
    33 UIKit 0x000000010d4d32ef _UIApplicationFlushRunLoopCATransactionIfTooLate + 167
    34 UIKit 0x000000010de38662 __handleEventQueueInternal + 6875
    35 CoreFoundation 0x0000000110a2abb1 _CFRUNLOOP_IS_CALLING_OUT_TO_A_SOURCE0_PERFORM_FUNCTION_ + 17
    36 CoreFoundation 0x0000000110a0f4af __CFRunLoopDoSources0 + 271
    37 CoreFoundation 0x0000000110a0ea6f __CFRunLoopRun + 1263
    38 CoreFoundation 0x0000000110a0e30b CFRunLoopRunSpecific + 635
    39 GraphicsServices 0x000000011792ba73 GSEventRunModal + 62
    40 UIKit 0x000000010d4d9057 UIApplicationMain + 159
    41 Betolimp 0x000000010b924e57 main + 55
    42 libdyld.dylib 0x0000000113187955 start + 1
    )
    libc++abi.dylib: terminating with uncaught exception of type NSException```
    opened by andymedvedev 4
Releases(1.3.0)
  • 1.3.0(Aug 7, 2022)

  • 1.2.0(Aug 7, 2022)

  • 1.1.0(Apr 15, 2018)

  • 1.0.2(Jul 22, 2017)

  • 1.0.1(Apr 12, 2017)

    • Fixed bug when there was weird animation which shifts offset (@rr-dw)
    • Retain contentOffset.x in scroll to top – based on @rr-dw's fix (@pronebird)
    Source code(tar.gz)
    Source code(zip)
  • 1.0.0(Dec 20, 2016)

  • 0.9.1(Jul 3, 2016)

    • Fixed issue with activity indicator teleportation in table views
    • Fixed issue when bounce back animation wouldn't properly complete due to user interactions
    • Fixed nullability attribute for -setShouldShowInfiniteScrollHandler:
    • Added trigger offset, see -infiniteScrollTriggerOffset (@GorkaMM)
    Source code(tar.gz)
    Source code(zip)
  • 0.9.0(Jul 3, 2016)

  • 0.8.0(Jul 3, 2016)

  • 0.7.4(Jul 3, 2016)

  • 0.7.3(Jul 3, 2016)

  • 0.7.2(Jul 3, 2016)

  • 0.7.1(Jul 3, 2016)

  • 0.7.0(Jul 3, 2016)

    • Accommodate bottom bar inset (@pronebird)
    • Add collection view demo (@pronebird)
    • Restart animations when custom indicator comes back from offscreen (@pronebird)
    • Drop previously deprecated infiniteIndicatorView (use infiniteScrollIndicatorView instead) (@pronebird)
    Source code(tar.gz)
    Source code(zip)
  • 0.6.0(Jul 3, 2016)

    • Add option to setup indicator margin (@pronebird)
    • Convert certain methods to properties (@pronebird)
    • Change custom indicator implementation to pulse animation (@pronebird)
    • Deprecate infiniteIndicatorView in favor of newer infiniteScrollIndicatorView (@pronebird)
    Source code(tar.gz)
    Source code(zip)
  • 0.5.2(Jul 3, 2016)

Owner
Andrej Mihajlov
Andrej Mihajlov
HPParallaxHeader is a simple parallax header class for UIScrollView.

HPParallaxHeader is a simple parallax header class for UIScrollView.

null 40 Dec 15, 2022
ScrollingFollowView is a simple view which follows UIScrollView scrolling.

ScrollingFollowView ScrollingFollowView is a simple view which follows UIScrollView scrolling. ScrollingFollowView Sample Images SearchBarSample : Sea

Tanaka Kenji 186 Dec 21, 2022
GoAutoSlideView extends UIScrollView by featuring infinitely and automatically slide.

GoAutoSlideView GoAutoSlideView extends UIScrollView by featuring infinitely and automatically slide. #ScreenShot Installation ###CocoaPods pod 'GoAut

Jamie 57 Jan 12, 2021
Multi-tier UIScrollView nested scrolling solution. 😋😋😋

Multi-tier UIScrollView nested scrolling solution. Snapshots Requirements iOS 9.0+ Xcode 10.0+ Swift 4.2+ Installation CocoaPods CocoaPods is a depend

Jiar 1.2k Dec 30, 2022
A data-driven UIScrollView + UIStackView framework for building fast and flexible lists

JKListKit A data-driven UIScrollView + UIStackView framework for building fast and flexible lists. Full Oficial documentation Main Features ?? Create

Juan Vasquez 2 Mar 15, 2022
AutoKeyboardScrollView is an UIScrollView subclass which makes showing and dismissing keyboard for UITextFields much easier. So called keyboard avoidance.

AutoKeyboardScrollView AutoKeyboardScrollView is a smart UIScrollView which can: Scroll to proper position and make sure the active textField is visib

HongHao Zhang 120 Jul 31, 2022
This is a control that helps you dramatically ease your infinite scroll processing.

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

Minseok Kang 0 Nov 15, 2021
App store style horizontal scroll view

ASHorizontalScrollView App store style horizontal scroll view It acts similar to apps sliding behaviours in App store. There are both Objective-C (do

Terence Chen 663 Nov 26, 2022
SwiftUI ScrollView with custom pull to refresh & scroll to load-more implementations

PaginatedScrollView SwiftUI ScrollView with custom "pull to refresh" & "scroll to load-more" implementations. example usage PaginatedScrollView {

Aung Ko Min 7 Sep 20, 2022
A non gesture blocking, non clipping by default custom scroll view implementation with example code

A non gesture blocking, non clipping by default custom scroll view implementation with example code

Marco Boerner 10 Dec 6, 2022
OpenSwiftUIViews - A non gesture blocking, non clipping by default custom scroll view implementation with example code.

OpenSwiftUIViews - A non gesture blocking, non clipping by default custom scroll view implementation with example code.

Marco Boerner 11 Jan 4, 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
A scroll view with a sticky header which shrinks as you scroll. Written with SwiftUI.

Scaling Header Scroll View A scroll view with a sticky header which shrinks as you scroll. Written with SwiftUI. We are a development agency building

Exyte 395 Dec 31, 2022
Asynchronous image downloader with cache support as a UIImageView category

This library provides an async image downloader with cache support. For convenience, we added categories for UI elements like UIImageView, UIButton, M

null 24.4k Jan 5, 2023
A "time ago", "time since", "relative date", or "fuzzy date" category for NSDate and iOS, Objective-C, Cocoa Touch, iPhone, iPad

Migration 2014.04.12 NSDate+TimeAgo has merged with DateTools. DateTools is the parent project and Matthew York is the project head. This project is n

Kevin Lawler 1.8k Dec 2, 2022
slider view for choosing categories. add any UIView type as category item view. Fully customisable

CategorySliderView Horizontal or vertical slider view for choosing categories. Add any UIView type as category item view. Fully customisable Demo Inst

Cem Olcay 353 Nov 6, 2022
A simple UIColor category to get color with hex code.

TFTColor A simple UIColor library to get UIColor object from RGB hex string/value, CMYK hex string/value or CMYK base component values. You can also r

Burhanuddin Sunelwala 18 Jun 21, 2022
A UINavigationController's category to enable fullscreen pop gesture with iOS7+ system style.

FDFullscreenPopGesture An UINavigationController's category to enable fullscreen pop gesture in an iOS7+ system style with AOP. Overview 这个扩展来自 @J_雨 同

null 5.9k Dec 28, 2022
UIView category which makes it easy to create layout constraints in code

FLKAutoLayout FLKAutoLayout is a collection of categories on UIView which makes it easy to setup layout constraints in code. FLKAutoLayout creates sim

Florian Kugler 1.5k Nov 24, 2022
Nice category that adds the ability to set the retry interval, retry count and progressiveness.

If a request timed out, you usually have to call that request again by yourself. AFNetworking+RetryPolicy is an objective-c category that adds the abi

Jakub Truhlář 209 Dec 2, 2022