Code Monkey home page Code Monkey logo

liquidtransition's Introduction

LiquidTransition   Tweet

Cocoapods iOS 8.0+ Version Swift 5 License Donate

LiquidTransition provide new API for transition creation.

Features:

  • Easy and convinient API (less boilerplate code)
  • Animate backward
  • Interrupt transition at any time to continue interactive
  • Helper class for restore views state
  • Animation of custom properties (or CALayer properties)
  • Complex transition without 'lag'

Web browser   Photo browser
Complex animation   Complex animation

Instalation

CocoaPods

Add the following entry to your Podfile:

pod 'LiquidTransition'

Then run pod install.

Don't forget to import LiquidTransition in every file you'd like to use LiquidTransition.

Usage

Like this you can create simple transition

import LiquidTransition

class FadeTransition: Animator<FromViewController, ToViewController> {

    init() {
        super.init()
        
        duration = 0.3
        timing = Timing.default
        // do not perform here complex operations, cause it calls on app initialization
    }
    
    override func animation(src: FromViewController, dst: ToViewController, container: UIView, duration: Double) {
        dst.view.alpha = 0
        
        // perform linear animation and manage timing function with `self.timing`
        UIView.animate(withDuration: duration, delay: 0, options: [.curveLinear], animations: {
            dst.view.alpha = 1
        }) { _ in
            dst.view.alpha = 1 // if anim somehow canceled
        }
    }
}

On app starts you can setup transitions

Liquid.shared.becomeDelegate() // Liquid automaticly becomes delegates for all animated transitions
Liquid.shared.addTransitions([FadeTransition()])

That's it! Easy enought?! :)

Customization

import LiquidTransition

class ExampleTransition: Animator<SampleController, CardsNavigationController> {

    var imgView: UIImageView!
    override init() {
        super.init()
        
        duration = 0.4
        timing = Timing.init(closure: { $0 * $0 })
        
        addCustomAnimation {[weak self] (progress) in
            self?.imgView?.layer.cornerRadius = 20 * (1-progress)
        }
    }
    
    override func animation(src: SampleController, dst: CardsNavigationController, container: UIView, duration: Double) {
        imgView = dst.imgView
        
        // this class restore all views state before transition
        // when you have lot of property changes, it can be might helpfull
        let restore = TransitionRestorer()
        restore.addRestore(imgView, src.fadeView)
        
        // cause on end transition we dont want restore superview of `src.view` and `dst.view`
        restore.addRestore(dst.view, ignoreFields: [.superview])
        
        dst.view.alpha = 0
        UIView.animate(withDuration: duration, delay: 0, options: [.curveLinear], animations: {
            dst.view.alpha = 1
            src.fadeView.alpha = 0
            self.imgView.frame = CGRect(/*new frame*/)
        }) { _ in
            restore.restore()
        }
    }
}

Sometimes we need that one transition work for multiple controllers. In this case you can define UIViewController as template classes and call init method with multiple classes defined:

class FadeTransition: Animator<UIViewController, UIViewController> {

init() {
    super.init(from: [VC1.self, VC2.self, VC3.self], to: [VC4.self, VC5.self], direction: .both)
    duration = 0.3
}

override func animation(src: UIViewController, dst: UIViewController, container: UIView, duration: Double) {
// animation
}

Or use protocol, to have access to common views. If it's not your case, you can ovverride canAnimate function

open func canAnimate(src: UIViewController, dst: UIViewController, direction animDirection: Direction) -> Bool

and define your conditions

TODO

  • Backward animation
  • Custom timing function
  • Allow custom animation
  • Restore view state helper class
  • Smooth interactive animation for complex prepare animation
  • Support Cocoapods
  • Support Swift Package Manager
  • Support Carthage
  • Add custom save keys for TransitionRestorer
  • Add some default animations

Notes

LiquidTransition controls animation percent completion. So if you define animation in one direction, it can run animation backward. In backward animation run from 1 to 0. So if you works with NSNavigationController with navigationBar, you can see that navigationBar animates backward (see example with photos). In this case better to define animation in both directions.

LiquidTransition 'inspired' by Hero. We have complex UI with custom animation. Several weaks we try to implement performance animation in Hero. When nothing works with Hero, we check manual implementation of transition. It works much faster. Cause Hero do a lot of snapshots, performs transition becomes laggy. In real project Hero showed not enough performance and require a lot of code to say what you really want. So in real app manual transition looks more suitable. Hero was removed from project and we move to transitions with manual control. Some pieces of new library start appear in our project. Now some ideas and code was moved and refactored for common usage in one library.

If you look for something similar, take a look on Transition and EasyTransitions. I found this projects after finish LiquidTransition and they have good ideas behind. They less convenient, but still good lib.

Credits

Alexandr Graschenkov: [email protected]
iOS and Computer Vision developer

liquidtransition's People

Contributors

alexandrgraschenkov 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

liquidtransition's Issues

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.