Code Monkey home page Code Monkey logo

advance's Introduction

Build Status Swift 5.0 GitHub release SwiftPM compatible CocoaPods compatible

Advance

An animation library for iOS, tvOS, and macOS that uses physics-based animations (including springs) to power interactions that move and respond realistically.

let view = UIView(frame: CGRect(x: 0, y: 0, width: 100, height: 100))

// Springs animate changes to a value
let spring = Spring(initialValue: view.center)

// The `onChange` closure will be called every time the spring updates
spring.onChange = { [view] newCenter in
    view.center = newCenter
}

/// The view's center will realistically animate to the new target value.
spring.target = CGPoint(x: 300, y: 200)

Installation

There are several ways to integrate Advance into your project.

  • Manually: add Advance.xcodeproj to your project, then add Advance-{iOS|macOS|tvOS}.framework as an "Embedded Binary" to your application target (under General in target settings). From there, add import Advance to your code and you're good to go.

  • Carthage: add github "timdonnelly/Advance" to your Cartfile.

  • CocoaPods: add pod 'Advance' to your Podfile.

  • Swift Package Manager: add a dependency to your Project.swift: .package(url: "http://github.com/timdonnelly/Advance", from: "3.0.0")

Requirements
  • iOS 10+, tvOS 10+, or macOS 10.12+
  • Swift 5.0 (Xcode 10.2 or higher)

Usage

API documentation is available here.

Advance animations are applied on every frame (using CADisplayLink on iOS/tvOS, and CVDisplayLink on macOS), allowing for fine-grained control at any time.

Spring

Spring instances animate changes to a value over time, using spring physics.

let spring = Spring(initialValue: 0.0)
spring.onChange = { [view] newAlpha in 
    view.alpha = newAlpha 
}

// Off it goes!
spring.target = 0.5

Configuring a spring

/// Spring values can be adjusted at any time.
spring.tension = 30.0 /// The strength of the spring
spring.damping = 2.0 /// The resistance (drag) that the spring encounters
spring.threshold = 0.1 /// The maximum delta between the current value and the spring's target (for each component) for which the simulation can enter a converged state.

/// Update the simulation state at any time.
spring.velocity = 6.5
spring.value = 0.2

/// Sets the spring's target and the current simulation value, and removes all velocity. This causes the spring to converge at the given value.
spring.reset(to: 0.5)

Animator

Animator allows for more flexibility in the types of animation that can be performed, but gives up some convenience in order to do so. Specifically, animators allow for any type of animation or simulation to be performed for a single value.

let view = UIView(frame: CGRect(x: 0, y: 0, width: 100, height: 100))

/// Animators coordinate animations to drive changes to a value.
let sizeAnimator = Animator(initialValue: view.bounds.size)

sizeAnimator.onChange = { [view] newSize in
    view.bounds.size = newSize
}

/// A simple timed animation
sizeAnimator.animate(to: CGSize(width: 123, height: 456), duration: 0.25, timingFunction: .easeInOut)

/// Some time in the future (before the previous timed animation was complete)...

/// Spring physics will move the view's size to the new value, maintaining the velocity from the timed animation.
sizeAnimator.simulate(using: SpringFunction(target: CGSize(width: 300, height: 300)))

/// Some time in the future (before the previous spring animation was complete)...

/// The value will keep the same velocity that it had from the preceeding spring
/// animation, and a decay function will slowly bring movement to a stop.
sizeAnimator.simulate(using: DecayFunction(drag: 2.0))

Animators support two fundamentally different types of animations: timed and simulated.

Timed animations

Timed animations are, well, timed: they have a fixed duration, and they animate to a final value in a predictable manner.

animator.animate(to: CGSize(width: 123, height: 456), duration: 0.25, timingFunction: .easeInOut)

TimingFunction described the pacing of a timed animation.

TimingFunction comes with a standard set of functions:

TimingFunction.linear // No easing
TimingFunction.easeIn
TimingFunction.easeOut
TimingFunction.easeInOut
TimingFunction.swiftOut // Similar to Material Design's default curve

Custom timing functions can be expressed as unit beziers (described here).

let customTimingFunction = TimingFunction(x1: 0.1, y1: 0.2, x2: 0.6, y2: 0.0)

Simulated animations

Simulated animations use a simulation function to power a physics-based transition. Simulation functions are types conforming to the SimulationFunction protocol.

Simulated animations may be started using two different methods:

// Begins animating with the custom simulation function, maintaining the previous velocity of the animator.
animator.simulate(using: MyCustomFunction())

// or...

// Begins animating with the custom simulation function, imparting the specified velocity into the simulation.
animator.simulate(using: DecayFunction(), initialVelocity: dragGestureRecognizer.velocity(in: view))

Animating Custom Types

Values conforming to the VectorConvertible protocol can be animated by Advance. Conforming types can be converted to and from a Vector implementation.

public protocol VectorConvertible: Equatable, Interpolatable {
    associatedtype VectorType: SIMD where VectorType.Scalar == Double
    init(vector: VectorType)
    var vector: VectorType { get }
}

The library adds conformance for many common types through extensions.

Contributing

If you encounter any issues or surprises, please open an issue.

For suggestions or new features, please consider opening a PR with a functional implementation. Issues may be used if you aren't sure how to implement the change, but working code is typically easier to evaluate.

License

This project is released under the BSD 2-clause license.

advance's People

Contributors

antoinelamy avatar astrochili avatar davidcelis avatar dkhamsing avatar joeldev avatar marcbaldwin avatar sgl0v avatar soffes avatar steadicat avatar timdonnelly avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

advance's Issues

Team ID in project

Disclaimer: Carthage newbie here, but I created the Cartfile and did:

carthage update --platform iOS
*** Fetching Advance
*** Checking out Advance at "0.9"
*** xcodebuild output can be found in /var/folders/_l/d2wy_rhd1kg7h_rz74px4hmh0000gn/T/carthage-xcodebuild.64oimv.log
*** Building scheme "Advance" in Advance.xcodeproj
** BUILD FAILED **


The following build commands failed:
    Check dependencies
(1 failure)
Code Sign error: No code signing identities found: No valid signing identities (i.e. certificate and private key pair) matching the team ID “HV4J834MC8” were found.
A shell task failed with exit code 65:
** BUILD FAILED **


The following build commands failed:
    Check dependencies
(1 failure)

is something that you can do or is it at Carthage level?

Installation with carthage failed

I don't know what to do next. Any suggestion?

*** Building scheme "Advance-tvOS" in Advance.xcodeproj
xcodebuild: error: The run destination Apple TV 1080p is not valid for Running the scheme 'Advance-tvOS'.
    Apple TV 1080p doesn’t match any of Advance.framework’s targeted device families. You can expand Advance.framework’s targeted device families to support Apple TV 1080p.
A shell task failed with exit code 70:
xcodebuild: error: The run destination Apple TV 1080p is not valid for Running the scheme 'Advance-tvOS'.
    Apple TV 1080p doesn’t match any of Advance.framework’s targeted device families. You can expand Advance.framework’s targeted device families to support Apple TV 1080p.

Example app crashes on Gestures screen 2 fingers tap

Steps to reproduce:

  1. Launch AdvanceSample app.
  2. Go to Gestures panel (last one).
  3. Tap with 2 fingers on Gesture panel, app crashes.

Update: As a matter of fact app crashes on 2-fingers tap on any panel, not only the Gestures one.
Tested in iPhone 6 Plus, iOS 9.2.1.

Update to modern Swift conventions

Method syntax is all over the place right now, including a bunch of methods with _ first parameters.

The whole project needs a cleanup pass.

Please add the option to animate buttons made with NGraphics

Great library! I'm using the popular NGraphics lib (excellent for creating UI on iOS because it can render SVG vector images, and you can draw UI controls in Inkscape in minutes instead of coding them manually for days). So I want to make an important feature request: can you add the option to animate vector buttons made with the NGraphics library? Here is the link if you don't know it already:

https://github.com/praeclarum/NGraphics

For example it would be cool to:

  • interpolate between a "pushed" state and a "popped" state of a custom button made with NGraphics
  • interpolate between an "off" state and an "on" state in a custom switch made with NGraphics
  • interpolate between an "expanded" state and a "minimized" state of a box with NGraphics borders
  • interpolate between the 1% and the 100% of a progress bar/slider controller made with NGraphics
  • and so on..

It would be a marriage made in heaven!

Thanks in advance!

Spring animation (or any other) won't start after setting target.

HI,
I've been trying for hours to make the animation start, but couldn't. The onChange method, never gets called.
This is the code:

let spring = Spring(initialValue: 0)
spring.onChange = { [weak view] val in
          print("change!") // never gets called.
          view?.frame.origin.y = val
}

spring.target = 500

I've tried debugging the whole thing and the simulation function never turns into .animating (state). I can't figure this out.
Tried calling both view.setNeedsLayout() and view.setNeedsDisplay().

What am I missing?
Thanks.

Tags should not be prepended with 'v', fails SPM

Hi,

Xcode 11 finally has SPM support built-in, so adding SPM packages to iOS / macOS is now possible without much hassle.

The current Package.swift works fine for this, there is only one issue, Xcode cannot find version 3.0.0 because it's tagged as v3.0.0 in the releases/tags.

The only way to add the framework now is by selecting the master branch, ideally not what you'd want.

Can version v3.0.0 be tagged again as 3.0.0 and further versions from here on out? So we can use the 'power' of semver.

Thanks!

CocoaPods support

Hey guys, do you have any reason for not adding support for CocoaPods? I'd be happy to submit a PR 😄

What is AnimatablePair in SimpleTransform.swift?

I download and build the SampleApp-iOS, show me some errors.

  1. Type 'SimpleTransform' does not conform to protocol 'VectorConvertible'
  2. Use of undeclared type 'AnimatablePair'

The environment is
macOS 10.15.5
XCode 11.5
iOS Simulator 13.5
SimpleTransform_bug_01

Please help me, what is AnimatablePair?

Carthage won't build for macOS

When trying to build for macOS with Carthage, I get the error Dependency "Advance" has no shared framework schemes for any of the platforms: Mac.

The main GitHub page indicates Advance is compatible with macOS. Is that not yet implemented or is there some way I can make it work?

I'm using Xcode 10.1, macOS 10.13.6.

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.