Github url


by HeroTransitions

HeroTransitions /Hero

Elegant transition library for iOS & tvOS

18.8K Stars 1.5K Forks Last release: 10 months ago (1.5.0) MIT License 499 Commits 35 Releases

Available items

No Items, yet!

The developer of this repository has not created any items for sale yet. Need a bug fixed? Help with integration? A different license? Create a request here:

Hero is a library for building iOS view controller transitions. It provides a declarative layer on top of the UIKit's cumbersome transition APIs—making custom transitions an easy task for developers.

Carthage compatible Accio supported codecov Version License Xcode 9.0+ iOS 8.0+ Swift 4.0+ 中文 README Donate


Hero is similar to Keynote's Magic Move. It checks the

property on all source and destination views. Every matched view pair is then automatically transitioned from its old state to its new state.

Hero can also construct animations for unmatched views. It is easy to define these animations via the

property. Hero will run these animations alongside the Magic Move animations. All of these animations can be interactively controlled by user gestures.

At view controller level, Hero provides several template transitions that you can set through

, and
. These can be used as the foundation of your custom transitions. Combine with
to make your own unique transitions.


By default, Hero provides dynamic duration based on the Material Design Motion Guide. Duration is automatically determined by changes to distance and size—saving you the hassle, while providing consistent and delightful animations.

Hero doesn't make any assumptions about how the view is built or structured. It won't modify any of your views' states other than hiding them during the animation. This makes it work with Auto Layout, programmatic layout, UICollectionView (without modifying its layout object), UITableView, UINavigationController, UITabBarController, etc...

Example Gallery

Checkout the Example Gallery Blog Post for a general idea of what you can achieve with Hero

Usage Example 1

View Controller 1 = "ironMan" = "batMan"

View Controller 2

self.hero.isEnabled = true = "ironMan" = "batMan"
whiteView.hero.modifiers = [.translate(y:100)]

Usage Example 2

View Controller 1 = "skyWalker"

View Controller 2

self.hero.isEnabled = true = "skyWalker"

// collectionView is the parent view of all red cells collectionView.hero.modifiers = [.cascade] for cell in redCells { cell.hero.modifiers = [.fade, .scale(0.5)] }

You can do these in the storyboard too!



Add the following entry to your Podfile:

pod 'Hero'

Then run

pod install

Don't forget to

import Hero
in every file you'd like to use Hero.


Add the following entry to your

github "HeroTransitions/Hero"

Then run

carthage update

If this is your first time using Carthage in the project, you'll need to go through some additional steps as explained over at Carthage.


Add the following to your

.package(url: "", .upToNextMajor(from: "1.4.0")),

Next, add

to your App targets dependencies like so:
    name: "App",
    dependencies: [

Then run

accio update

Swift Package Manager

To integrate using Apple's Swift package manager, add the following as a dependency to your

.package(url: "", .upToNextMajor(from: "1.3.0"))

and then specify

as a dependency of the Target in which you wish to use Hero. Here's an example
// swift-tools-version:4.0
import PackageDescription

let package = Package( name: "MyPackage", products: [ .library( name: "MyPackage", targets: ["MyPackage"]), ], dependencies: [ .package(url: "", .upToNextMajor(from: "1.5.0")) ], targets: [ .target( name: "MyPackage", dependencies: ["Hero"]) ] )


  • Drag the Sources folder anywhere in your project.


Checkout the WIKI PAGES (Usage Guide) for documentations.

For more up-to-date ones, please see the header-doc. (use alt+click in Xcode)

Interactive Transition Tutorials

Interactive transitions with Hero (Part 1)


Not able to use Hero transition even when
is set to true

Make sure that you have also enabled

on the navigation controller if you are doing a push/pop inside the navigation controller.

Views being covered by another matched view during the transition

Matched views use global coordinate space while unmatched views use local coordinate space by default. Local coordinate spaced views might be covered by other global coordinate spaced views. To solve this, use the

modifier on the views being covered. Checkout Coordinate Space Wiki page for details.

Push animation is shown along side my custom animation

This is the default animation for navigation controller provided by Hero. To disable the push animation, set

on the navigation controller.

How do I use a different default animation when dismissing

You can use the animation type

to specify a different default animation for dismiss.

For example:

    self.hero.modalAnimationType = .selectBy(presenting:.zoom, dismissing:.zoomOut)


We welcome any contributions. Please read the Contribution Guide.

We use cookies. If you continue to browse the site, you agree to the use of cookies. For more information on our use of cookies please see our Privacy Policy.