• This repository has been archived on 06/Jun/2023
  • Stars
    star
    1,089
  • Rank 42,533 (Top 0.9 %)
  • Language
    Swift
  • License
    MIT License
  • Created over 11 years ago
  • Updated about 2 years ago

Reviews

There are no reviews yet. Be the first to send feedback to the community and the maintainers!

Repository Details

Simple, extensible interpolation framework

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.