Skip to content
This repository has been archived by the owner on Jun 6, 2023. It is now read-only.
/ Popsicle Public archive

Simple, extensible interpolation framework

License

Notifications You must be signed in to change notification settings

davdroman/Popsicle

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

28 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

THIS PROJECT IS NO LONGER MAINTAINED.


Popsicle header

Carthage compatible CocoaPods compatible

GIF 1

Popsicle is a Swift framework for creating and managing interpolations of different value types with built-in UIKit support.

Installation

Carthage

github "DavdRoman/Popsicle"

CocoaPods

pod 'Popsicle'

Manual

Drag and copy all files in the Popsicle folder into your project.

At a glance

Interpolating UIView (or any other NSObject) values

First, you need an Interpolator instance:

let interpolator = Interpolator()

Next, you need to add some Interpolation<T> instances to your interpolator. In the example below, we are going to interpolate the alpha value of a UIView for times between 0 and 150:

let interpolation = Interpolation(yourView, alpha)
interpolation[0] = 0
interpolation[150] = 1
self.interpolator.addInterpolation(interpolation)

Note alpha is a built-in KeyPath<T, U> constant. Popsicle offers a nice set of UIKit-related KeyPaths ready to be used. You may also use a completely custom key path.

You can also modify the easing function used at a given time:

interpolation.setEasingFunction(EasingFunctionEaseOutQuad, forTime: 0)

There's a bunch of built-in easing functions to choose from.

Finally, just make your interpolator vary its time depending on whatever you want. For example, the content offset of a UITableView:

func scrollViewDidScroll(scrollView: UIScrollView) {
	interpolator.time = Double(scrollView.contentOffset.y)
}

Interpolating custom values

You can declare a value type as interpolable by making it conform to the Interpolable protocol.

As an example, check out how CGPoint conforms to Interpolable:

extension CGSize: Interpolable {
	public static func interpolate(from fromValue: CGSize, to toValue: CGSize, withProgress progress: Progress) -> CGSize {
		let width = CGFloat.interpolate(from: fromValue.width, to: toValue.width, withProgress: progress)
		let height = CGFloat.interpolate(from: fromValue.height, to: toValue.height, withProgress: progress)

		return CGSizeMake(width, height)
	}

	public static func objectify(value: CGSize) -> AnyObject {
		return NSValue(CGSize: value)
	}
}

License

Popsicle is available under the MIT license.