Anima is chainable Layer-Based Animation library for Swift5.

Overview

Version License Platform language Version Build Status MIT License Platform Carthage compatible

Anima

Anima is chainable Layer-Based Animation library for Swift5.
It support to make sequensial and grouped animation more easily.

is written as follows.

let startAnimations: [AnimaType] = [.moveByY(-50), .rotateByZDegree(90)]
let moveAnimations: [AnimaType] = [.moveByX(50), .rotateByZDegree(90)]
let endAnimations: [AnimaType] = [.moveByY(-50), .rotateByZDegree(90)]

animaView.layer.anima
    .then(.opacity(1.0))
    .then(group: startAnimations)
    .then(group: moveAnimations, options: labelAnimaOption(index: 0))
    .then(group: moveAnimations, options: labelAnimaOption(index: 1))
    .then(group: moveAnimations, options: labelAnimaOption(index: 2))
    .then(group: moveAnimations, options: labelAnimaOption(index: 3))
    .then(group: endAnimations, options: labelAnimaOption(index: 4))
    .then(group: [.scaleBy(0.0), .opacity(0.0)])

func labelAnimaOption(index: Int) -> [AnimaOption] {
    let labelAnima = labels[index]?.layer.anima

    return [.completion({
        labelAnima?.then(.opacity(1)).fire()
    })]
}

Requirements

Anima require for Swift4 and greater than iOS9.0 📱

Features

  • Almost all timing modes from easings.set are implemented.
  • Spring Animation ( featured by CASpringAnimation )
  • Type-Safed Animation KeyPath ()

Usage

Move Position

If you want to translate CALayer.position relatively, use .moveByX(CGFloat), .moveByY(CGFloat), .moveByXY(x: CGFloat, y: CGFloat) AnimaTypes.

layer.anima.then(.moveByX(50)).fire()

or destination is determined, use .moveTo(x: CGFloat, y: CGFloat).

※ Anima doesn't update CALayer.position value for animations. Because when update Layer-backed view's layer position value, It will be resetted to default value frequently.

Sequential Animation

Anima supports.

Group Animation

To run animation concurrently, you use CAAnimationGroup with CoreAnimation. In Anima, you can use Anima.then(group: ) to run some AnimaType concurrently.

Below is an example of how to run moving, scaling and rotating animations concurrently.

layer.anima
    .then(group: [.moveByX(200),
                .scaleBy(1.5),
                .rotateByZDegree(180)])
    .fire()

Animation Options

There are some options for Anima.

  • duration(TimeInterval)
  • timingFunction(TimingFunction) _ Change timing function defining the pacing of the animation. _ Default timing function is at Anima.defaultTimingFunction. If you do not set the timing function option, defaultTimingFunction is used. * Please read Anima.TimingFunction.swift
  • repeat(count: Float) * To run animation infinitely, set .infinity.
  • autoreverse
  • completion(() -> Void)

you can use these values as belows.

layer
    .anima
    .then(.moveByX(100), options: [.autoreverse,
                                   .timingFunciton(.easeInQuad),
                                   .repeat(count: 3),
                                   .completion({
                                    print("completion")
                                   })])
    .fire()

Rotate Animation & AnchorPoint

AnimaType has 3 rotation animation type, .rotateByX, .rotateByY, .rotateByZ. and each animation type has 2 value types, degrees and radians. you use whichever you like.

and CALayer has AnchorPoint. Rotating, moving, or other Animations are affected by it. Default value is (0.5, 0.5). AnimaType.moveAnchor(AnimaAnchorPoint) can move layer's AnchorPoint.

layer.anima
    .then(.rotateByZDegree(360))
    .then(.moveAnchor(.topLeft))
    .then(.rotateByZDegree(360))
    .fire()

or If you want to change only AnchorPoint, use Anima.then(setAnchor: AnimaAnchorPoint).

layer.anima
    .then(.rotateByZDegree(360))
    .then(setAnchor: .topLeft)
    .then(.rotateByZDegree(360))
    .fire()

Move Path

If you want to make moving animation more complex, use .movePath(path: CGPath, keyTymes: [Double]). Anima example app has sample of creating animation by drag gesture. you see it!

but It has any problems when you use with AnimaOption.autoreverse. so If you use it, please be careful of options.

Original KeyPath

If you want to animate other animatable values, You can use AnimaType.original(keyPath: String, from: Any?, to: Any) for it. CAEmitterLayer's animation is like this.

let layer = CAEmitterLayer()
layer.emitterPosition = CGPoint(x: 100.0, y:100.0)

layer.anima
    .then(.original(keyPath: #keyPath(CAEmitterLayer.emitterPosition), from: layer.emitterPosition, to: CGPoint(x: 200.0, y:200.0)))
    .fire()

Example

To run the example project, clone the repo, open Anima.xcodeproj, and run target Anima iOS Example.

Installation

Cocoapods

Anima is available through CocoaPods. To install it, simply add the following line to your Podfile:

pod "Anima"

# If you want to use Swift 3 version, Please specify Anima version.

pod "Anima", "0.5.1"

Carthage

Add github satoshin21/Anima to your Cartfile. Execute carthage update to install it.

Author

Satoshi Nagasaka, [email protected]

License

Anima is available under the MIT license. See the LICENSE file for more info.

Comments
  • How to add a delay?

    How to add a delay?

    I would like to animate + delay + animate.

    Could you provide an example of how to introduce a short delay between animation steps?

    Many thanks! Love the library.

    opened by ianbradbury-bizzibody 2
  • Bump rubyzip from 1.2.2 to 1.3.0

    Bump rubyzip from 1.2.2 to 1.3.0

    Bumps rubyzip from 1.2.2 to 1.3.0.

    Release notes

    Sourced from rubyzip's releases.

    v1.3.0

    Security

    • Add validate_entry_sizes option so that callers can trust an entry's reported size when using extract #403
      • This option defaults to false for backward compatibility in this release, but you are strongly encouraged to set it to true. It will default to true in rubyzip 2.0.

    New Feature

    • Add add_stored method to simplify adding entries without compression #366

    Tooling / Documentation

    • Add more gem metadata links #402

    v1.2.4

    • Do not rewrite zip files opened with open_buffer that have not changed #360

    Tooling / Documentation

    • Update example_recursive.rb in README #397
    • Hold CI at trusty for now, automatically pick the latest ruby patch version, use rbx-4 and hold jruby at 9.1 #399

    v1.2.3

    • Allow tilde in zip entry names #391 (fixes regression in 1.2.2 from #376)
    • Support frozen string literals in more files #390
    • Require pathname explicitly #388 (fixes regression in 1.2.2 from #376)

    Tooling / Documentation:

    • CI updates #392, #394
      • Bump supported ruby versions and add 2.6
      • JRuby failures are no longer ignored (reverts #375 / part of #371)
    • Add changelog entry that was missing for last release #387
    • Comment cleanup #385

    Since the GitHub release information for 1.2.2 is missing, I will also include it here:

    1.2.2

    NB: This release drops support for extracting symlinks, because there was no clear way to support this securely. See https://github-redirect.dependabot.com/rubyzip/rubyzip/pull/376#issue-210954555 for details.

    • Fix CVE-2018-1000544 #376 / #371
    • Fix NoMethodError: undefined method `glob' #363
    • Fix handling of stored files (i.e. files not using compression) with general purpose bit 3 set #358
    • Fix close on StringIO-backed zip file #353
    • Add Zip.force_entry_names_encoding option #340
    • Update rubocop, apply auto-fixes, and fix regressions caused by said auto-fixes #332, #355
    • Save temporary files to temporary directory (rather than current directory) #325

    Tooling / Documentation:

    ... (truncated)
    Changelog

    Sourced from rubyzip's changelog.

    1.3.0 (2019-09-25)

    Security

    • Add validate_entry_sizes option so that callers can trust an entry's reported size when using extract #403
      • This option defaults to false for backward compatibility in this release, but you are strongly encouraged to set it to true. It will default to true in rubyzip 2.0.

    New Feature

    • Add add_stored method to simplify adding entries without compression #366

    Tooling / Documentation

    • Add more gem metadata links #402

    1.2.4 (2019-09-06)

    • Do not rewrite zip files opened with open_buffer that have not changed #360

    Tooling / Documentation

    • Update example_recursive.rb in README #397
    • Hold CI at trusty for now, automatically pick the latest ruby patch version, use rbx-4 and hold jruby at 9.1 #399

    1.2.3

    • Allow tilde in zip entry names #391 (fixes regression in 1.2.2 from #376)
    • Support frozen string literals in more files #390
    • Require pathname explicitly #388 (fixes regression in 1.2.2 from #376)

    Tooling / Documentation:

    • CI updates #392, #394
      • Bump supported ruby versions and add 2.6
      • JRuby failures are no longer ignored (reverts #375 / part of #371)
    • Add changelog entry that was missing for last release #387
    • Comment cleanup #385
    Commits
    • e79d9ea Merge pull request #407 from rubyzip/v1-3-0
    • 7c65e1e Bump version to 1.3.0
    • d65fe7b Merge pull request #403 from rubyzip/check-size
    • 97cb6ae Warn when an entry size is invalid
    • 7849f73 Default validate_entry_sizes to false for 1.3 release
    • 4167f0c Validate entry sizes when extracting
    • 94b7fa2 [ci skip] Update changelog
    • 93505ca Check expected entry size in add_stored test
    • 6619bf3 Merge pull request #366 from hainesr/add-stored
    • ecb2776 Zip::File.add_stored() to add uncompressed files.
    • Additional commits viewable in compare view

    Dependabot compatibility score

    Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting @dependabot rebase.


    Dependabot commands and options

    You can trigger Dependabot actions by commenting on this PR:

    • @dependabot rebase will rebase this PR
    • @dependabot recreate will recreate this PR, overwriting any edits that have been made to it
    • @dependabot merge will merge this PR after your CI passes on it
    • @dependabot squash and merge will squash and merge this PR after your CI passes on it
    • @dependabot cancel merge will cancel a previously requested merge and block automerging
    • @dependabot reopen will reopen this PR if it is closed
    • @dependabot ignore this [patch|minor|major] version will close this PR and stop Dependabot creating any more for this minor/major version (unless you reopen the PR or upgrade to it yourself)
    • @dependabot ignore this dependency will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)
    • @dependabot use these labels will set the current labels as the default for future PRs for this repo and language
    • @dependabot use these reviewers will set the current reviewers as the default for future PRs for this repo and language
    • @dependabot use these assignees will set the current assignees as the default for future PRs for this repo and language
    • @dependabot use this milestone will set the current milestone as the default for future PRs for this repo and language

    You can disable automated security fix PRs for this repo from the Security Alerts page.

    dependencies 
    opened by dependabot[bot] 1
  • Bump excon from 0.62.0 to 0.71.1

    Bump excon from 0.62.0 to 0.71.1

    Bumps excon from 0.62.0 to 0.71.1.

    Changelog

    Sourced from excon's changelog.

    0.71.1 2019-12-18

    fix frozen chunks through dup prior to binary_encode

    0.71.0 2019-12-12

    fix for leftover data with interrupted persistent connections

    0.70.0 2019-12-02

    Update bundled certificates

    0.69.1 2019-11-21

    Fix mistake in proxy connection error handling

    0.69.0 2019-11-21

    Raise better proxy connection errors

    0.68.0 2019-10-25

    Updated bundled certs

    0.67.0 2019-09-24

    Properly redact user/pass info from proxy credentials Update bundled certs

    0.66.0 2019-08-06

    Add remote_ip to datum, enabling usage in middleware redirect follower now raises after following too many redirects (default 10) fixed stub clearing in tests to avoid race conditions

    0.65.0 2019-07-22

    fix yardoc formatting fix creating Proc without a block reduce/refine gem file contents

    ... (truncated)
    Commits
    • beb02b4 v0.71.1
    • ac85f68 Merge pull request #711 from unasuke/frozen_string_literal
    • 6609703 Use String#dup in Excon::Utils#binary_encode for frozen string
    • d498014 Add ruby-head to travis build matrix as allow_failure
    • 1149d44 v0.71.0
    • ccb57d7 fix for leftover data with interrupted persistent connections
    • f8de8cf v0.70.0
    • 93f4a21 v0.69.1
    • e89bbb7 Merge pull request #709 from jasquat/fix_response_status_check
    • 5647437 fixed response status check when making a request with a valid proxy is set
    • Additional commits viewable in compare view

    Dependabot compatibility score

    Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting @dependabot rebase.


    Dependabot commands and options

    You can trigger Dependabot actions by commenting on this PR:

    • @dependabot rebase will rebase this PR
    • @dependabot recreate will recreate this PR, overwriting any edits that have been made to it
    • @dependabot merge will merge this PR after your CI passes on it
    • @dependabot squash and merge will squash and merge this PR after your CI passes on it
    • @dependabot cancel merge will cancel a previously requested merge and block automerging
    • @dependabot reopen will reopen this PR if it is closed
    • @dependabot ignore this [patch|minor|major] version will close this PR and stop Dependabot creating any more for this minor/major version (unless you reopen the PR or upgrade to it yourself)
    • @dependabot ignore this dependency will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)
    • @dependabot use these labels will set the current labels as the default for future PRs for this repo and language
    • @dependabot use these reviewers will set the current reviewers as the default for future PRs for this repo and language
    • @dependabot use these assignees will set the current assignees as the default for future PRs for this repo and language
    • @dependabot use this milestone will set the current milestone as the default for future PRs for this repo and language

    You can disable automated security fix PRs for this repo from the Security Alerts page.

    dependencies 
    opened by dependabot[bot] 1
  • How to move (or animate) a UIView which has autolayout constraints applied?

    How to move (or animate) a UIView which has autolayout constraints applied?

    In my app, I have a couple of views will be translated from one to another, I have applied constraints on each of them as per my UI needs.

    How to properly move each of them? I know the code. But when constraints applied, if I set

    view.translatesAutoresizingMaskIntoConstraints = true

    It's showing bad logs in console.

    Something like:

    Make a symbolic breakpoint at UIViewAlertForUnsatisfiableConstraints to catch this in the debugger.
    The methods in the UIConstraintBasedLayoutDebugging category on UIView listed in <UIKit/UIView.h> may also be helpful.
    2017-08-02 16:36:47.824743+0530 RAKPP[33697:8727360] [LayoutConstraints] Unable to simultaneously satisfy constraints.
    	Probably at least one of the constraints in the following list is one you don't want. 
    	Try this: 
    		(1) look at each constraint and try to figure out which you don't expect; 
    		(2) find the code that added the unwanted constraint or constraints and fix it. 
    	(Note: If you're seeing NSAutoresizingMaskLayoutConstraints that you don't understand, refer to the documentation for the UIView property translatesAutoresizingMaskIntoConstraints) 
    (
        "<NSAutoresizingMaskLayoutConstraint:0x608000085e60 h=--& v=--& UIButton:0x7fa651505cd0'6'.midY == 368.167   (active)>",
        "<NSAutoresizingMaskLayoutConstraint:0x608000085eb0 h=--& v=--& UIButton:0x7fa651505cd0'6'.height == 75   (active)>",
        "<NSLayoutConstraint:0x600000098600 V:[UIButton:0x7fa651505cd0'6']-(30)-[UIButton:0x7fa651503d80'1']   (active)>",
        "<NSLayoutConstraint:0x6000000986a0 UIButton:0x7fa651503d80'1'.centerY == UIView:0x7fa6515054d0.centerY   (active)>",
        "<NSLayoutConstraint:0x60c000086680 'UIView-Encapsulated-Layout-Height' UIView:0x7fa6515054d0.height == 736   (active)>",
        "<NSAutoresizingMaskLayoutConstraint:0x60c000086860 h=-&- v=-&- 'UIView-Encapsulated-Layout-Top' UIView:0x7fa6515054d0.minY == 0   (active, names: '|':UIWindow:0x7fa651408a60 )>"
    )
    
    Will attempt to recover by breaking constraint 
    <NSLayoutConstraint:0x600000098600 V:[UIButton:0x7fa651505cd0'6']-(30)-[UIButton:0x7fa651503d80'1']   (active)>
    

    What should I do now?

    opened by hemangshah 1
  • Bump addressable from 2.7.0 to 2.8.0

    Bump addressable from 2.7.0 to 2.8.0

    Bumps addressable from 2.7.0 to 2.8.0.

    Changelog

    Sourced from addressable's changelog.

    Addressable 2.8.0

    • fixes ReDoS vulnerability in Addressable::Template#match
    • no longer replaces + with spaces in queries for non-http(s) schemes
    • fixed encoding ipv6 literals
    • the :compacted flag for normalized_query now dedupes parameters
    • fix broken escape_component alias
    • dropping support for Ruby 2.0 and 2.1
    • adding Ruby 3.0 compatibility for development tasks
    • drop support for rack-mount and remove Addressable::Template#generate
    • performance improvements
    • switch CI/CD to GitHub Actions
    Commits
    • 6469a23 Updating gemspec again
    • 2433638 Merge branch 'main' of github.com:sporkmonger/addressable into main
    • e9c76b8 Merge pull request #378 from ashmaroli/flat-map
    • 56c5cf7 Update the gemspec
    • c1fed1c Require a non-vulnerable rake
    • 0d8a312 Adding note about ReDoS vulnerability
    • 89c7613 Merge branch 'template-regexp' into main
    • cf8884f Note about alias fix
    • bb03f71 Merge pull request #371 from charleystran/add_missing_encode_component_doc_entry
    • 6d1d809 Adding note about :compacted normalization
    • Additional commits viewable in compare view

    Dependabot compatibility score

    Dependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting @dependabot rebase.


    Dependabot commands and options

    You can trigger Dependabot actions by commenting on this PR:

    • @dependabot rebase will rebase this PR
    • @dependabot recreate will recreate this PR, overwriting any edits that have been made to it
    • @dependabot merge will merge this PR after your CI passes on it
    • @dependabot squash and merge will squash and merge this PR after your CI passes on it
    • @dependabot cancel merge will cancel a previously requested merge and block automerging
    • @dependabot reopen will reopen this PR if it is closed
    • @dependabot close will close this PR and stop Dependabot recreating it. You can achieve the same result by closing it manually
    • @dependabot ignore this major version will close this PR and stop Dependabot creating any more for this major version (unless you reopen the PR or upgrade to it yourself)
    • @dependabot ignore this minor version will close this PR and stop Dependabot creating any more for this minor version (unless you reopen the PR or upgrade to it yourself)
    • @dependabot ignore this dependency will close this PR and stop Dependabot creating any more for this dependency (unless you reopen the PR or upgrade to it yourself)
    • @dependabot use these labels will set the current labels as the default for future PRs for this repo and language
    • @dependabot use these reviewers will set the current reviewers as the default for future PRs for this repo and language
    • @dependabot use these assignees will set the current assignees as the default for future PRs for this repo and language
    • @dependabot use this milestone will set the current milestone as the default for future PRs for this repo and language

    You can disable automated security fix PRs for this repo from the Security Alerts page.

    dependencies 
    opened by dependabot[bot] 0
  • Getting error when installed it over CocoaPods.

    Getting error when installed it over CocoaPods.

    screen shot 2017-08-02 at 2 46 06 pm

    Environment: Xcode 9.0.4 | iOS 9.0 (default)

    IMPORTANT: The error will not be raised as if I download the code from Github.com (directly from your repo) but it would come into my new project created with Xcode 9.0.4 which by default sets Swift-Version:4.0. By changing it to 3.2. everything works fine now.

    Would you please fix it for the latest Swift version?

    opened by hemangshah 0
  • Configure Renovate

    Configure Renovate

    Mend Renovate

    Welcome to Renovate! This is an onboarding PR to help you understand and configure settings before regular Pull Requests begin.

    🚦 To activate Renovate, merge this Pull Request. To disable Renovate, simply close this Pull Request unmerged.


    Detected Package Files

    • Gemfile (bundler)
    • .github/workflows/deploy-pods.yml (github-actions)

    Configuration

    🔡 Renovate has detected a custom config for this PR. Feel free to ask for help if you have any doubts and would like it reviewed.

    Important: Now that this branch is edited, Renovate can't rebase it from the base branch any more. If you make changes to the base branch that could impact this onboarding PR, please merge them manually.

    What to Expect

    With your current configuration, Renovate will create 1 Pull Request:

    Update actions/checkout action to v3
    • Schedule: ["at any time"]
    • Branch name: renovate/actions-checkout-3.x
    • Merge into: master
    • Upgrade actions/checkout to v3

    ❓ Got questions? Check out Renovate's Docs, particularly the Getting Started section. If you need any further assistance then you can also request help here.


    This PR has been generated by Mend Renovate. View repository job log here.

    opened by renovate[bot] 0
  • Pause() and resume() does not work.

    Pause() and resume() does not work.

    After call pause() then Anima.status changes to willPaused, but the animation continues until finished.

    Also It would be great to have cancel() or stop() which are could stop the animation to initial state.

    Thanks

    opened by AlexTsyganov 0
Releases(0.9.3)
Owner
Satoshi Nagasaka
Satoshi Nagasaka
Easy to read and write chainable animations in Objective-C and Swift

Whats new in version 3.x? Swiftier syntax Swift 4 support Bug fixes and improvements Whats new in version 2.x? Re-architected from the ground up, no m

Jeff Hurray 3.2k Dec 30, 2022
SwiftUI-Text-Animation-Library - Text animation library for SwiftUI

⚠️ This repository is under construction. SwiftUI Text Animation Library Make yo

null 28 Jan 8, 2023
Simple Interface Core Animation. Run type-safe animation sequencially or parallelly

Simple Interface Core Animation Sica can execute various animations sequentially or parallelly. Features Animation with duration and delay parallel /

CATS Open Source Softwares 1k Nov 10, 2022
An experiment for using SwiftUI's custom timing Animation to create an orbital-like animation.

Orbital-SwiftUI-Animation An experiment for using SwiftUI's custom timing curve to create an orbital-like animation. How it looks: How it works: Apply

Mostafa Abdellateef 7 Jan 2, 2023
Swiftui-animation-observer - Track SwiftUI animation progress and completion via callbacks

SwiftUI Animation Observer Track SwiftUI animation progress and completion via c

Gordan Glavaš 9 Nov 5, 2022
An extensible iOS and OS X animation library, useful for physics-based interactions.

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

Meta Archive 19.8k Dec 28, 2022
A Swift library to take the power of UIView.animateWithDuration(_:, animations:...) to a whole new level - layers, springs, chain-able animations and mixing view and layer animations together!

ver 2.0 NB! Breaking changes in 2.0 - due to a lot of requests EasyAnimation does NOT automatically install itself when imported. You need to enable i

Marin Todorov 3k Dec 27, 2022
Gemini is rich scroll based animation framework for iOS, written in Swift.

Overview What is the Gemini? Gemini is rich scroll based animation framework for iOS, written in Swift. You can easily use GeminiCollectionView, which

Shohei Yokoyama 3k Dec 27, 2022
YapAnimator is your fast and friendly physics-based animation system

YapAnimator is your fast and friendly physics-based animation system. YapAnimator was built with ease-of-use in mind, keeping you sane and your design

Yap Studios 1.9k Dec 6, 2022
Wave is a spring-based animation engine for iOS that makes it easy to create fluid, interruptible animations that feel great.

Wave is a spring-based animation engine for iOS and iPadOS. It makes it easy to create fluid, interactive, and interruptible animations that feel great.

Janum Trivedi 1.2k Jan 8, 2023
MapTeam - A type-safe, Swift-language layer over SQLite3

SQLite.swift A type-safe, Swift-language layer over SQLite3. SQLite.swift provid

Théotime 0 Jan 18, 2022
null 1 Jan 26, 2022
A fantastic Physical animation library for swift

A fantastic Physical animation library for swift(Not Just Spring !!!), it is base on UIDynamic and extension to it, friendly APIs make you use it or c

August 2.9k Jan 4, 2023
Easy animation library on iOS with Swift2

Cheetah Cheetah is an animation utility on iOS with Swift. Cheetah can animate any properties since Cheetah uses simple CADisplayLink run loop to chan

Suguru Namura 592 Dec 6, 2022
A radical & elegant animation library for iOS.

Installation • Usage • Debugging • Animatable Properties • License Dance is a powerful and straightforward animation framework built upon the new UIVi

Saoud Rizwan 648 Dec 14, 2022
A powerful, elegant, and modular animation library for Swift.

MotionMachine provides a modular, powerful, and generic platform for manipulating values, whether that be animating UI elements or interpolating prope

Brett Walker 387 Dec 9, 2022
An Objective-C animation library used to create floating image views.

JRMFloatingAnimation [![CI Status](http://img.shields.io/travis/Caroline Harrison/JRMFloatingAnimation.svg?style=flat)](https://travis-ci.org/Caroline

Caroline Harrison 233 Dec 28, 2022
Swift animation library for iOS, tvOS and macOS.

anim is an animation library written in Swift with a simple, declarative API in mind. // moves box to 100,100 with default settings anim { self.bo

Onur Ersel 555 Dec 12, 2022