Now You See Me
NowYouSeeMe is a view tracking framework written in Swift that can be attached to an instance of UIView or any of its subclasses with a single API written on UIView. Views can also add custom viewability conditions and listeners.
Ideology:
- 60 fps (all calculations on background thread)
- No trackable wrappers on views
- Viewability rules injected by view
- Viewability callbacks back to the view (on main thread)
- Simple and easy to use APIs
Usage
To enable the framework you need to call the following method before the UI is created:
NowYou.seeMe() // didFinishLaunchingWithOptions is a good place to initialise the framework
View
Gone are the days, when you had to create custom view subclasses for tracking viewability.
Tracking a view is now as simple as:
view.trackView() // can be UIView or any of its subclasses
You will also need to call trackView on the parent UIViewController's view for managing viewcontroller lifecycle based viewability callbacks
override func viewDidLoad() {
super.viewDidLoad()
self.view.trackView()
}
ScrollView
In case you want to track viewability of children of scrollView, you must also call trackView()
on scrollView.
scrollView.trackView() // can be UIScrollView, UITableView, UICollectionView, or any other scrollable view
This enables tracking on contentOffset
of scrollView, to calculate correct visibility of children.
Recyclable View
In case you want to track viewability of children of a recyclable view, you must also call trackView()
on the recyclable view.
cell.trackView() // can be UITableViewCell, UICollectionViewCell, or any other recyclable view
Listener
No point tracking view if you can can't listen to the changes.
You can provide a ViewabilityListener
for the view in trackView()
call to listen to viewStarted(:)
and viewEnded(:)
events.
class CustomListener: ViewabilityListener {
// view has entered the view port (visibility percentage > 0)
func viewStarted(_ view: UIView) {
view.backgroundColor = .green
}
// complete view has exited the viewport (visibility percentage == 0)
func viewEnded(_ view: UIView) {
view.backgroundColor = .red
}
}
view.trackView(CustomListener()) // listener attached to the view
Conditions
Want more control over viewability callbacks?
You can provide your custom ViewCondition
's for the view in trackView()
call.
class CustomCondition: ViewCondition {
func evaluate(for state: ScrollState, viewPercentage: Float) {
// custom evaluation here based on scroll state and visible view percentage
}
}
view.trackView(conditions: [CustomCondition()]) // view condition added to the view
Default Conditions
A few default view conditions are exposed to save you from calculations.
API Documentation
The full documentation for NowYouSeeMe is available here.
More information can be found in the Wiki section.
Installation
To integrate NowYouSeeMe into your Xcode project using CocoaPods, specify it in your Podfile
:
pod 'NowYouSeeMe'
Then, run the following command:
$ pod install
Dependencies
Requirements
- iOS 10.0+
- Swift 5