pop

An extensible iOS and OS X animation library, useful for physics-based interactions.

Subscribe to updates I use pop


Statistics on pop

Number of watchers on Github 18712
Number of open issues 44
Average time to close an issue 4 days
Main language Objective-C++
Average time to merge a PR 4 days
Open pull requests 12+
Closed pull requests 16+
Last commit 7 months ago
Repo Created over 4 years ago
Repo Last Updated 4 months ago
Size 632 KB
Organization / Authorfacebook
Latest Release1.0.10
Contributors50
Page Updated
Do you use pop? Leave a review!
View open issues (44)
View pop activity
View on github
Latest Open Source Launches
Trendy new open source projects in your inbox! View examples

Subscribe to our mailing list

Evaluating pop for your project? Score Explanation
Commits Score (?)
Issues & PR Score (?)

pop

Pop is an extensible animation engine for iOS, tvOS, and OS X. In addition to basic static animations, it supports spring and decay dynamic animations, making it useful for building realistic, physics-based interactions. The API allows quick integration with existing Objective-C or Swift codebases and enables the animation of any property on any object. It's a mature and well-tested framework that drives all the animations and transitions in Paper.

Build Status

Installation

Pop is available on CocoaPods. Just add the following to your project Podfile:

pod 'pop', '~> 1.0'

Bugs are first fixed in master and then made available via a designated release. If you tend to live on the bleeding edge, you can use Pop from master with the following Podfile entry:

pod 'pop', :git => 'https://github.com/facebook/pop.git'

Framework (manual)

By adding the project to your project and adding pop.embedded framework to the Embedded Binaries section on the General tab of your app's target, you can set up pop in seconds! This also enables @import pop syntax with header modules.

Note: because of some awkward limitations with Xcode, embedded binaries must share the same name as the module and must have .framework as an extension. This means that you'll see three pop.frameworks when adding embedded binaries (one for OS X, one for tvOS, and one for iOS). You'll need to be sure to add the right one; they appear identically in the list but note the list is populated in order of targets. You can verify the correct one was chosen by checking the path next to the framework listed, in the format <configuration>-<platform> (e.g. Debug-iphoneos).

Embedded Binaries

Note 2: this method does not currently play nicely with workspaces. Since targets can only depend on and embed products from other targets in the same project, it only works when pop.xcodeproj is added as a subproject to the current target's project. Otherwise, you'll need to manually set the build ordering in the scheme and copy in the product.

Static Library (manual)

Alternatively, you can add the project to your workspace and adopt the provided configuration files or manually copy the files under the pop subdirectory into your project. If installing manually, ensure the C++ standard library is also linked by including -lc++ to your project linker flags.

Usage

Pop adopts the Core Animation explicit animation programming model. Use by including the following import:

Objective-C

#import <pop/POP.h>

or if you're using the embedded framework:

@import pop;

Swift

import pop

Start, Stop & Update

To start an animation, add it to the object you wish to animate:

Objective-C

POPSpringAnimation *anim = [POPSpringAnimation animation];
...
[layer pop_addAnimation:anim forKey:@"myKey"];

Swift

let anim = POPSpringAnimation()
...
layer.pop_add(anim, forKey: "myKey")

To stop an animation, remove it from the object referencing the key specified on start:

Objective-C

[layer pop_removeAnimationForKey:@"myKey"];

Swift

layer.pop_removeAnimation(forKey: "myKey")

The key can also be used to query for the existence of an animation. Updating the toValue of a running animation can provide the most seamless way to change course:

Objective-C

anim = [layer pop_animationForKey:@"myKey"];
if (anim) {
  /* update to value to new destination */
  anim.toValue = @(42.0);
} else {
  /* create and start a new animation */
  ....
}

Swift

if let anim = layer.pop_animation(forKey: "myKey") as? POPSpringAnimation {
    /* update to value to new destination */
    anim.toValue = 42.0
} else {
    /* create and start a new animation */
    ....
}

While a layer was used in the above examples, the Pop interface is implemented as a category addition on NSObject. Any NSObject or subclass can be animated.

Types

There are four concrete animation types: spring, decay, basic and custom.

Spring animations can be used to give objects a delightful bounce. In this example, we use a spring animation to animate a layer's bounds from its current value to (0, 0, 400, 400):

Objective-C

POPSpringAnimation *anim = [POPSpringAnimation animationWithPropertyNamed:kPOPLayerBounds];
anim.toValue = [NSValue valueWithCGRect:CGRectMake(0, 0, 400, 400)];
[layer pop_addAnimation:anim forKey:@"size"];

Swift

if let anim = POPSpringAnimation(propertyNamed: kPOPLayerBounds) {
    anim.toValue = NSValue(cgRect: CGRect(x: 0, y: 0, width: 400, height: 400))
    layer.pop_add(anim, forKey: "size")
}

Decay animations can be used to gradually slow an object to a halt. In this example, we decay a layer's positionX from it's current value and velocity 1000pts per second:

Objective-C

POPDecayAnimation *anim = [POPDecayAnimation animationWithPropertyNamed:kPOPLayerPositionX];
anim.velocity = @(1000.);
[layer pop_addAnimation:anim forKey:@"slide"];

Swift

if let anim = POPDecayAnimation(propertyNamed: kPOPLayerPositionX) {
    anim.velocity = 1000.0
    layer.pop_add(anim, forKey: "slide")
}

Basic animations can be used to interpolate values over a specified time period. To use an ease-in ease-out animation to animate a view's alpha from 0.0 to 1.0 over the default duration:

Objective-C

POPBasicAnimation *anim = [POPBasicAnimation animationWithPropertyNamed:kPOPViewAlpha];
anim.timingFunction = [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseInEaseOut];
anim.fromValue = @(0.0);
anim.toValue = @(1.0);
[view pop_addAnimation:anim forKey:@"fade"];

Swift

if let anim = POPBasicAnimation(propertyNamed: kPOPViewAlpha) {
    anim.timingFunction = CAMediaTimingFunction(name: kCAMediaTimingFunctionEaseInEaseOut)
    anim.fromValue = 0.0
    anim.toValue = 1.0
    view.pop_add(anim, forKey: "fade")
}

POPCustomAnimation makes creating custom animations and transitions easier by handling CADisplayLink and associated time-step management. See header for more details.

Properties

The property animated is specified by the POPAnimatableProperty class. In this example we create a spring animation and explicitly set the animatable property corresponding to -[CALayer bounds]:

Objective-C

POPSpringAnimation *anim = [POPSpringAnimation animation];
anim.property = [POPAnimatableProperty propertyWithName:kPOPLayerBounds];

Swift

let anim = POPSpringAnimation()
if let property = POPAnimatableProperty.property(withName: kPOPLayerBounds) as? POPAnimatableProperty {
    anim.property = property
}

The framework provides many common layer and view animatable properties out of box. You can animate a custom property by creating a new instance of the class. In this example, we declare a custom volume property:

Objective-C

prop = [POPAnimatableProperty propertyWithName:@"com.foo.radio.volume" initializer:^(POPMutableAnimatableProperty *prop) {
  // read value
  prop.readBlock = ^(id obj, CGFloat values[]) {
    values[0] = [obj volume];
  };
  // write value
  prop.writeBlock = ^(id obj, const CGFloat values[]) {
    [obj setVolume:values[0]];
  };
  // dynamics threshold
  prop.threshold = 0.01;
}];

anim.property = prop;

Swift

if let prop = POPAnimatableProperty.property(withName: "com.foo.radio.volume", initializer: { prop in
    guard let prop = prop else {
        return
    }
    // read value
    prop.readBlock = { obj, values in
        guard let obj = obj as? Volumeable, let values = values else {
            return
        }

        values[0] = obj.volume
    }
    // write value
    prop.writeBlock = { obj, values in
        guard var obj = obj as? Volumeable, let values = values else {
            return
        }

        obj.volume = values[0]
    }
    // dynamics threshold
    prop.threshold = 0.01
}) as? POPAnimatableProperty {
    anim.property = prop
}

For a complete listing of provided animatable properties, as well more information on declaring custom properties see POPAnimatableProperty.h.

Debugging

Here are a few tips when debugging. Pop obeys the Simulator's Toggle Slow Animations setting. Try enabling it to slow down animations and more easily observe interactions.

Consider naming your animations. This will allow you to more easily identify them when referencing them, either via logging or in the debugger:

Objective-C

anim.name = @"springOpen";

Swift

anim.name = "springOpen"

Each animation comes with an associated tracer. The tracer allows you to record all animation-related events, in a fast and efficient manner, allowing you to query and analyze them after animation completion. The below example starts the tracer and configures it to log all events on animation completion:

Objective-C

POPAnimationTracer *tracer = anim.tracer;
tracer.shouldLogAndResetOnCompletion = YES;
[tracer start];

Swift

if let tracer = anim.tracer {
    tracer.shouldLogAndResetOnCompletion = true
    tracer.start()
}

See POPAnimationTracer.h for more details.

Testing

Pop has extensive unit test coverage. To install test dependencies, navigate to the root pop directory and type:

pod install

Assuming CocoaPods is installed, this will include the necessary OCMock dependency to the unit test targets.

SceneKit

Due to SceneKit requiring iOS 8 and OS X 10.9, POP's SceneKit extensions aren't provided out of box. Unfortunately, weakly linked frameworks cannot be used due to issues mentioned in the Xcode 6.1 Release Notes.

To remedy this, you can easily opt-in to use SceneKit! Simply add this to the Preprocessor Macros section of your Xcode Project:

POP_USE_SCENEKIT=1

Resources

A collection of links to external resources that may prove valuable:

Contributing

See the CONTRIBUTING file for how to help out.

License

Pop is released under a BSD License. See LICENSE file for details.

pop open issues Ask a question     (View All Issues)
  • over 1 year How to test?
  • almost 2 years Replace OSSpinLock with os_unfair_lock_t/pthread_mutex_t
  • almost 2 years Please update to Swift 3.0 Xcode 8! :)
  • almost 2 years iOS10 behavior: isPrefetchingEnabled causes issues with scaling.
  • almost 2 years Repeat "shake" animation : repeatForever doesn't work
  • about 2 years READ ME in Swift
  • about 2 years Reverse animation with a delay
  • over 2 years use pop as a dependency of a custom pod will not compile
  • about 3 years POPBasicAnimation randomly "jump" when repeatForever with autoreverses is enabled
  • over 3 years Start/stop events are being called twice on reverse animations
  • over 3 years Adjust decay animation to stop at desired point
  • over 3 years Create a POPAnimationGroup
  • over 3 years fromValue get current value and not initial value
  • over 3 years add support for graphical depiction of animation values
  • over 3 years Rollback animation support
  • about 4 years The occasional POPSpringAnimation doesn't animate where fromValue = toValue
  • about 4 years Mapping to and from CGFloat[]; support user defined animatable types
  • about 4 years Support POPAnimator observing publicly
  • about 4 years add asserts to help catch NAN errors sooner
  • about 4 years improve rotation handling
  • about 4 years Improve support for 3rd party animatable properties
  • about 4 years support more timing functions
  • about 4 years Pop Animation Bug - Locks Up Animation - Intermittent Working Behavior
  • about 4 years Provide a way to chain animations
  • about 4 years support for animating CGPathRef properties
pop open pull requests (View All Pulls)
  • Add bitcode support for iOS
  • Transactions
  • Animation groups
  • keyPath property animations
  • Allows animations to be paused *now*
  • Simulate display link with timer if display link creation failed.
  • Fixed OSSpinLock usage.
  • Add Swift usage examples to README.md
  • Add convenience initializer for custom animation
  • Develop lichangqing
  • Fix typo for kPOPSCNNodeScaleY
  • Update function declaration to latest iOS SDK conventions.
pop questions on Stackoverflow (View All Questions)
  • How to show a pop up message with dark background
  • CefSharp Support Flash Plugin,But in the load pop-up DOS window
  • The modal pop up is not responsive. The website is responsive and the content inside the popup is responsive as well
  • Pop to previous scene using React-Native-Scrollable-Tab-View
  • Exist Pop Blocker
  • How to hack chrome.dll to get rid of the "disable developer mode extensions" pop up
  • How to pop fragment off backstack
  • Auth pop up returning blank page
  • Selected values could not fetched from drop down list present inside Modal pop up using Angular.js
  • How can I pop last repeating item from the list in Groovy?
  • Disable Gnome 3 notifications/pop-ups/integrated notifications
  • Javascript function is undefined + making a pop up
  • Single linked list in Python, how to write pop and push
  • PHP / JS / JQUERY Open a pop-up with different Browser
  • Open project does not pop up in Visual Studio 2010
  • Javascript (onclick) pop up bigger image window from image array
  • pop at the beginning of playback
  • New layout doesn't pop up
  • Implement pop up Menu with margin
  • Capture pop up dialog using webbrowser control
  • UITabBar disappears when NavigationController pop the view back to the said ViewController
  • Why is the big O of pop() different from pop(0) in python
  • why is pop() faster than pop(0)?
  • Printer Status Pop-Up
  • Custom pop up contextual action bar
  • How to change the background color of pop up header?
  • How to put a pop up box to each cell in a table when mouse over the cell
  • I want to pop a modal when fname already exist in DB
  • Making a hover over pop up display in angularjs
  • Yii2 : Getting values from pop up in controller
pop list of languages used
Other projects in Objective-C++