// the find
CoderMJLee/MJRefresh
An easy way to use pull-to-refresh.
MJRefresh is a pull-to-refresh library for iOS that attaches header and footer controls to any UIScrollView subclass. It's been the de-facto standard for this pattern in the Chinese iOS developer community since 2015, and the 13k stars reflect years of production use across hundreds of apps.
The class hierarchy is well thought out — a base component with separate header/footer/trailer branches means you can subclass at exactly the right level without fighting the framework. The trailer (horizontal) refresh for collection views is a nice addition most alternatives don't bother with. Dynamic i18n switching at runtime, without restarting the component, is actually non-trivial to get right and they've done it cleanly. SPM support landed in 3.7.1, so you're not stuck with CocoaPods.
The library is Objective-C at its core and the Swift API is a thin wrapper — you get chaining syntax but none of the type safety or async/await integration you'd expect from a modern library. The author's README openly says they don't have time to maintain it and is recruiting co-maintainers; the last meaningful activity is sporadic. There's no SwiftUI support — if you're not in UIKit, this doesn't help you at all. The documentation is heavy on animated GIFs showing every permutation of the API but light on explaining the state machine underneath, which makes debugging edge cases in custom subclasses painful.