Git Product home page Git Product logo

sebastianboldt / jelly Goto Github PK

View Code? Open in Web Editor NEW
2.4K 38.0 122.0 53.99 MB

๐ŸŒŠ - Jelly is a library for animated, non-interactive & interactive viewcontroller transitions and presentations with the focus on a simple and yet flexible API.

Home Page: http://www.sebastianboldt.com/

License: MIT License

Swift 98.29% Ruby 1.71%
uikit uiviewcontroller animations viewcontroller-transition uipresentationcontroller swift ios

jelly's People

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

jelly's Issues

Add Shiftin Animation

It would be great to have a shift in Animation that has full height or width depending of the directions it slides in. Some kind of parallex effect would be awesome too.

Edge drag available after dismiss called

I am using following way to present my view controller:

let navController = UINavigationController(rootViewController: vc)

let interactionConfiguration = InteractionConfiguration(presentingViewController: self, dragMode: .edge)
let presentation = SlidePresentation(direction: .right, interactionConfiguration: interactionConfiguration)

self.animator = Animator(presentation: presentation)
self.animator?.prepare(presentedViewController: navController)
self.present(navController, animated: true)

It is working fine, sliding from right to left and edge drag is working too.

However after I call self.dismiss(animated: true) in the pushed VC I can still drag the VC back from right edge.

Is there a way to prevent that?

User should be able to enable or disable background tap dismissal

Currently, it is not possible to enable or disable the background tap that dismisses the viewController.
A JellyPresentation Object should provide an option for that, so users of Jelly can decide by their own, if background typ dimissal should happen or not.

Interactive Transitions

I'm trying to use the interactive transition to dismiss a view controller when swiping downward. I'm still a little confused to how to get access to the gesture recognizer. Am I suppose to use the new Live Update API in conjunction with the gesture recognizer, or what am I doing wrong?

Why we need this variable

Hi,
file -> Jelly/Jelly/Classes/JellyAnimator.swift
line -> 16
private weak var viewController : UIViewController?

Why we need this variable?

Having a few issues upgarding

Couple issues while upgrading

When running the exact example in the wiki for customizable options shown below

let allCorners = [.layerMaxXMaxYCorner,.layerMaxXMinYCorner,.layerMinXMaxYCorner,.layerMinXMinYCorner]

let uiConfiguration = PresentationUIConfiguration(cornerRadius: 10, 
                                                  backgroundStyle: .blurred(effectStyle: .dark),           
                                                  isTapBackgroundToDismissEnabled: true, 
                                                  corners: allCorners )

let size = PresentationSize(width: .fullscreen, height: .fullscreen)

let alignment = PresentationAlignment(vertical: .center, horizontal: .center)

let marginGuards = UIEdgeInsets(top: 40, left: 16, bottom: 40, right: 16)

let timing = PresentationTiming(duration: .normal, presentationCurve: .linear, dismissCurve: .linear)

let interactionConfiguration = InteractionConfiguration(presentingViewController: self, 
                                                        completionThreshold: 0.5, 
                                                        dragMode: .canvas)

let presentation = CoverPresentation(directionShow: .left, 
                                     directionDismiss: .left, 
                                     uiConfiguration: uiConfiguration, 
                                     size: size, 
                                     alignment: alignment, 
                                     marginGuards: marginGuards, 
                                     timing: timing, 
                                     spring: .none, 
                                     interactionConfiguration: interactionConfiguration)

I had to hint to the compiler it was an options set with

let allCorners: CACornerMask = [.layerMaxXMaxYCorner,.layerMaxXMinYCorner,.layerMinXMaxYCorner,.layerMinXMinYCorner]

I'm also not sure how to migrate old usage to new usage, for example:

var presentation = JellySlideInPresentation()
presentation.widthForViewController = .custom(value: 295)
presentation.heightForViewController = .custom(value: 173)

The new signature of SlidePresentation takes a size of type Size where CoverPresentation takes a size of PresentationSize, so i'm not sure what to do here

RetainCycle issue!

I used this library in a project, and I realized that viewControllers that presented by Jelly, will NOT deinitialized!

I just added this, to Example project of the library:

// DismissMeController.swift
class DismissMeController: UIViewController {

    deinit {
        print("DismissMeController.Deinit?!")
    }
    ...
}

the message is NOT printing after dismissing viewController.

viewWillDisappear never called

Hi,

Thanks for your repo. Before I used Jelly viewWillDisappear was called. Now with Jelly viewWillDisappear never called! Any help?

override func viewWillDisappear(_ animated: Bool) {
        super.viewWillDisappear(animated)
        print("Hey")
}

Write Tests.

There are no tests yet which is really really sad.

iOS 13 glitch issue

I am presenting my ViewControllers this way by using different PresentationSize and PresentationUIConfiguration.
Presenting this way and its creating glitches every where.

let vc = UIStoryboard(name: "RideSelectionStory", bundle: nil).instantiateInitialViewController() as! RideSelectionVC
let interactionConfiguration = InteractionConfiguration(presentingViewController: self, completionThreshold: 0.5, dragMode: .edge)
let uiConfiguration = PresentationUIConfiguration(cornerRadius: 0, backgroundStyle: .dimmed(alpha: 0.92), isTapBackgroundToDismissEnabled: false)
let size = PresentationSize(width: .fullscreen, height: .custom(value: (self.view.frame.height*0.7)))
let marginGuards = UIEdgeInsets(top: 0, left: 0, bottom: 0, right: 0)
let alignment = PresentationAlignment(vertical: .bottom, horizontal: .left)
let presentation = CoverPresentation(directionShow: .bottom, directionDismiss: .bottom, uiConfiguration: uiConfiguration, size: size, alignment: alignment, marginGuards: marginGuards, interactionConfiguration: interactionConfiguration)
let animator = Animator(presentation: presentation)
self.animator = animator
animator.prepare(presentedViewController: vc)
self.present(vc,animated: true)

and it is giving a glitch on iOS 13. What can be the solution for this issue?

Request to put back Minimum deployment target to iOS 10

@SebastianBoldt Thank you for this great library!

Can you please explain for which reasons other than for using the maskedCorners property of the CALayer is the minimum deployment target set to iOS 11?

Although iOS 10 is not recent anymore, users are still using it and if you bring back support you will be covering close to 99% of all users.

All this requires a simple change. One similar provided by this gist

Hide status bar for presented ViewControllers?

@SebastianBoldt, Is there a way to hide the status bar for a presented ViewController, like a slide-in, for example? I've overriden prefersStatusBarHidden in the VC being presented by Jelly, but that's not doing the trick. Any help is appreciated. Thanks for the great tool!

John

Help for my requirement using this beautiful library.

I want to show a custom designed timer control with blurredslidein or fadin effect.

The design is roughly like, Three label for Hour, Minute & Second. Two button like, Start & Cancel.

Cancel button should disappear the viewController. Start button starts the timer.

So, I just want to ask whether it is possible or not?

Possibility to have custom position in the screen

Is it possible to have a custom position similar to the custom in size

Currently, the only way is to have .top, .bottom, .center as listed below I'm wondering if you could add custom like the following:

    public enum VerticalAlignment {
        case top
        case bottom
        case center
        case custom(y: CGFloat) 
    }

    public enum HorizontalAlignment {
        case left
        case right
        case center
        case custom(x: CGFloat) 
    }

I need to display the new viewController at a certain x,y

iOS 13 support

When using the current beta of Xcode a lot of things are broken for some unknown reason so far.
It would be nice to evaluate these issues and fix them.

Push 2.2.0 to the trunk

This is just a simple reminder because trunk pushing is currently not enabled because they are moving to a CDN.

Flashing blur effect when swiping up on top of controller

Love the library! Literally makes life so much easier. Currently seeing a flash whenever a user swipes up from the top of the controller inside the animator when using the blur effect. Let me know what info would help, I can attach pics or a video.

"isTapBackgroundToDismissEnabled" is no avaliable

I set the property isTapBackgroundToDismissEnabled false, but seems to no effect
Here is my code:
var presentation = JellySlideInPresentation(cornerRadius: 5.0,widthForViewController: .custom(value: 300),heightForViewController:.custom(value: 260))

presentation.directionShow = .left presentation.directionDismiss = .right

presentation.isTapBackgroundToDismissEnabled = false

let animator = JellyAnimator(presentation: presentation) self.jellyAnimator = animator

let serviceTypeViewController = ServiceTypeViewController() self.jellyAnimator?.prepare(viewController: serviceTypeViewController) self.present(serviceTypeViewController, animated: true, completion: nil)

UIModalPresentationCustom Always present On UIWindow.rootViewController

hi there, I come with a question that, I found with option UIModalPresentationCustom, the presented view controller is always presented on UIWindow.rooViewController. I have no idea to present it on any other specific view contoller.
I have tested proprety definesPresentationContext, It seems only work with option UIModalPresentationCurrentContext or UIModalPresentationOverCurrentContext to provide the presenting view controller.

Adjust height automatically with in-call status bar

Is there any way we can automatically adjust the height/top of the presented view controller when in-call status bar is displayed/hidden? You can check the screenshots for reference.

jelly-in-call-status-bar-issue

Here I've set the size of the presented view controller to be offset 20 from all sides from main screen bounds. I'm using JellySlideInPresentation with following settings:

let presentation = JellySlideInPresentation(
            dismissCurve: .easeInEaseOut,
            presentationCurve: .easeInEaseOut,
            cornerRadius: 4,
            backgroundStyle: .dimmed(alpha: 0.8),
            jellyness: .jelly,
            duration: .normal,
            directionShow: .bottom,
            directionDismiss: .bottom,
            widthForViewController: .custom(value: targetSize.width),
            heightForViewController: .custom(value: targetSize.height),
            horizontalAlignment: .center,
            verticalAlignment: .center,
            marginGuards: .zero,
            corners: .allCorners)

Please let me know if this is achievable.

invalid custom dimmed

In the JellyPresentationController, line 33.

the custom value of dimmed not set to the method setupDimmingView()

Perspective on background controller

Thank you for your nice library!
It would be good to have another effect on transition

The following example create a presentation from bottom to up leaving a small portion of screen free on top.

var presentation = JellySlideInPresentation()
presentation.presentationCurve = .easeInEaseOut
presentation.heightForViewController = JellyConstants.Size.custom(value: UIScreen.main.bounds.size.height - 60.0)
presentation.directionShow = .bottom
presentation.verticalAlignemt = .bottom
presentation.directionDismiss = .bottom
presentation.jellyness = .jelly
presentation.isTapBackgroundToDismissEnabled = true
let animator = JellyAnimator(presentation: presentation)
animator.prepare(viewController: modal_navigation)

I would to see the background controller showed in perspective (a little smaller)

vn2cq

Support preferredStatusBarStyle

I can see my status bar being white instead of dark after presenting new ViewController. If I remove the Jelly related code and present it via native code it will respect the default dark style.

Is there some workaround for this?

How to resize the view of the presented controller ?

let controllerA = ControllerA()
let navigationController = UINavigationController(rootViewController: controllerA)

let presentation = JellyFadeInPresentation()
let animator = JellyAnimator(presentation: presentation)
animator.prepare(viewController: navigationController)

self.present(navigationController, animated: true, completion: nil)

In controllerA, controllerB will be created and pushed to navigationController. My question is How to resize controllerB's view ? Thanks!

Add a better way for the user to provide sizes for the Animator

Currently a user needs to specify a custom Size to the JellyPresentation Object. It would be better Idea to create some Kind of size enum that provides the following cases: full, half and custom. We also need to change the init function to expect separate width and height values. As a result the user can more easily create rich transitions.

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.