/Elastic

Fancy elastic transition powered by Metal, UIKit Dynamics, & Hero

Primary LanguageSwiftMIT LicenseMIT

Elastic

Carthage compatible Version License Xcode 8.2+ iOS 8.0+ Swift 3.0+

Fancy elastic transition powered by Metal, UIKit Dynamics, & Hero:

Just a proof of concept inspired by Álvaro Carreras's Slide Concept. Not really optimized and does not support older devices. You should not use this in production. If you want something similar, checkout ElasticTransition

Supports UINavigationController, UITabBarController, & Modal Present. Since it is powered by Hero, the other views can still benefit from animations constructed by Hero.

Requirements

  • Xcode 8.2
  • Swift 3.0.2
  • Metal compatible devices (iPhone 5s or newer)

Won't work on simulator.

Installation

pod "Elastic"

Usage

  override func viewDidLoad() {
    super.viewDidLoad()
    // 1. Enable the plugin
    ElasticHeroPlugin.isEnabled = true
    
    // 2. setup a gesture recognizer
    let leftGR = UIScreenEdgePanGestureRecognizer(target: self, action: #selector(pan(gr:)))
    leftGR.edges = UIRectEdge.left
    view.addGestureRecognizer(leftGR)
    
    // 3. set the heroModifier of the elastic view to be
    view.heroModifiers = [.elastic(edge: .left, gestureRecognizer: leftGR)]
  }
    
  func pan(gr:UIScreenEdgePanGestureRecognizer){
    if gr.state == .began {
      // 4. perform your transition when the gesture recognizer begans. the rest will be handled automatically
      performSegue(withIdentifier: "next", sender: nil)
    }
  }

The elastic view doesn't have to be the gesture recognizer's view. For example, the following code makes the next view controller's view elastic.

  // This replaces step 3
  override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
    let vc = segue.destination
    vc.view.heroModifiers = [.elastic(edge: .right, gestureRecognizer: rightGR)]
  }

License

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