finds.dev← search

// the find

CoderMJLee/MJRefresh

★ 13,813 · Objective-C · MIT · updated Nov 2025

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.

View on GitHub →

// want more like this?

We dig through GitHub every week and send a few repos picked for what you actually care about — each with an honest take like this one.

Get finds in your inbox → Search again →