GithubHelp home page GithubHelp logo

nnduc / spstorkcontroller Goto Github PK

View Code? Open in Web Editor NEW

This project forked from ivanvorobei/spstorkcontroller

0.0 1.0 0.0 12.06 MB

Now playing controller from Apple Music, Mail & Podcasts Apple's apps.

Home Page: https://xcode-shop.com

License: MIT License

Swift 99.89% Ruby 0.06% Objective-C 0.05%

spstorkcontroller's Introduction

SPStorkController

About

Controller as in Apple Music, Podcasts and Mail apps. Simple adding close button and centering arrow indicator. Customizable height. Using custom TransitionDelegate.

You can download example Debts - Spending tracker app from AppStore. For buy source code of app in preview, please, go to xcode-shop.com.

Alert you can find in SPAlert project.

If you like the project, do not forget to put star ★ or help me by donate:

Patron

See project's backers in Sponsors section.

Navigate

Requirements

Swift 4.2 & 5.0. Ready for use on iOS 10+

Installation

CocoaPods:

CocoaPods is a dependency manager for Cocoa projects. For usage and installation instructions, visit their website. To integrate SPStorkController into your Xcode project using CocoaPods, specify it in your Podfile:

pod 'SPStorkController'

Carthage

Carthage is a decentralized dependency manager that builds your dependencies and provides you with binary frameworks. To integrate SPStorkController into your Xcode project using Carthage, specify it in your Cartfile:

github "ivanvorobei/SPStorkController"

Manually

If you prefer not to use any of the aforementioned dependency managers, you can integrate SPStorkController into your project manually. Put Source/SPStorkController folder in your Xcode project. Make sure to enable Copy items if needed and Create groups.

Quick Start

Create controller and call func presentAsStork:

import UIKit
import SPStorkController

class ViewController: UIViewController {
    
    override func viewDidAppear(_ animated: Bool) {
        super.viewDidAppear(animated)

        let controller = UIViewController()
        self.presentAsStork(controller)
    }
}

If you want customize controller (remove indicator, set custom height and other), create controller and set transitioningDelegate to SPStorkTransitioningDelegate object. Use present or dismiss functions:

let controller = UIViewController()
let transitionDelegate = SPStorkTransitioningDelegate()
controller.transitioningDelegate = transitionDelegate
controller.modalPresentationStyle = .custom
controller.modalPresentationCapturesStatusBarAppearance = true
self.present(controller, animated: true, completion: nil)

Please, do not init SPStorkTransitioningDelegate like this:

controller.transitioningDelegate = SPStorkTransitioningDelegate()

You will get an error about weak property.

Usage

Light StatusBar

To set light status bar for presented controller, use preferredStatusBarStyle property. Also set modalPresentationCapturesStatusBarAppearance. See example:

import UIKit

class ModalViewController: UIViewController {
    
    override var preferredStatusBarStyle: UIStatusBarStyle {
        return .lightContent
    }
}

Custom Height

Property customHeight sets custom height for controller. Default is nil:

transitionDelegate.customHeight = 350

Close Button

Property showCloseButton added circle button with dismiss action. Default is false:

transitionDelegate.showCloseButton = false

Indicator

On the top of controller you can add arrow indicator with animatable states. It simple configure. Property showIndicator shows or hides top arrow indicator. Default is true:

transitionDelegate.showIndicator = true

Property Parameter indicatorColor for customize color of arrow. Default is gray:

transitionDelegate.indicatorColor = UIColor.white

Property hideIndicatorWhenScroll shows or hides indicator when scrolling. Default is false:

transitionDelegate.hideIndicatorWhenScroll = true

Dismissing

You can also configure events that will dimiss the controller. Property swipeToDismissEnabled enables dismissal by swipe gesture. Default is true:

transitionDelegate.swipeToDismissEnabled = true

Property translateForDismiss sets how much need to swipe down to close the controller. Work only if swipeToDismissEnabled is true. Default is 240:

transitionDelegate.translateForDismiss = 100

Property tapAroundToDismissEnabled enables dismissal by tapping parent controller. Default is true:

transitionDelegate.tapAroundToDismissEnabled = true

Corner Radius

Property cornerRadius for customize corner radius of controller's view. Default is 10:

transitionDelegate.cornerRadius = 10

Haptic

Property hapticMoments allow add taptic feedback for some moments. Default is .willDismissIfRelease:

transitionDelegate.hapticMoments = [.willPresent, .willDismiss]

Snapshots

The project uses a snapshot of the screen in order to avoid compatibility and customisation issues. Before controller presentation, a snapshot of the parent view is made, and size and position are changed for the snapshot. Sometimes you will need to update the screenshot of the parent view, for that use static func:

SPStorkController.updatePresentingController(modal: controller)

and pass the controller, which is modal and uses SPStorkTransitioningDelegate.

Add Navigation Bar

You may want to add a navigation bar to your modal controller. Since it became impossible to change or customize the native controller in swift 4 (I couldn’t even find a way to change the height of the bar), I had to recreate navigation bar from the ground up. Visually it looks real, but it doesn’t execute the necessary functions:

import UIKit
import SPFakeBar

class ModalController: UIViewController {
    
    let navBar = SPFakeBarView(style: .stork)
        
    override func viewDidLoad() {
        super.viewDidLoad()

        self.view.backgroundColor = UIColor.white

        self.navBar.titleLabel.text = "Title"
        self.navBar.leftButton.setTitle("Cancel", for: .normal)
        self.navBar.leftButton.addTarget(self, action: #selector(self.dismissAction), for: .touchUpInside)

        self.view.addSubview(self.navBar)
    }
}

You only need to add a navigation bar to the main view, it will automatically layout. Use style .stork in init of SPFakeBarView. Here is visual preview with Navigation Bar and without it:

To use it, you need to install SPFakeBar pod:

pod 'SPFakeBar'

Working with UIScrollView

If you use UIScrollView (or UITableView & UICollectionView) on controller, I recommend making it more interactive. When scrolling reaches the top position, the controller will interactively drag down, simulating a closing animation. Also available close controller by drag down on UIScrollView. To do this, set the delegate and in the function scrollViewDidScroll call:

func scrollViewDidScroll(_ scrollView: UIScrollView) {
    SPStorkController.scrollViewDidScroll(scrollView)
}

Working with UITableView & UICollectionView

Working with a collections classes is not difficult. In the Example folder you can find an implementation. However, I will give a couple of tips for making the table look better.

Firstly, if you use SPFakeBarView, don't forget to set top insets for content & scroll indicator. Also, I recommend setting bottom insets (it optional):

tableView.contentInset.top = self.navBar.height
tableView.scrollIndicatorInsets.top = self.navBar.height

Please, also use SPStorkController.scrollViewDidScroll function in scroll delegate for more interactiveness with your collection or table view.

Delegate

You can check events by implement SPStorkControllerDelegate and set delegate for transitionDelegate:

transitionDelegate.storkDelegate = self

Delagate has this functions:

protocol SPStorkControllerDelegate: class {
    
    optional func didDismissStorkBySwipe()
    
    optional func didDismissStorkByTap()
}

Modal presentation of other controller

If you want to present modal controller on SPStorkController, please set:

controller.modalPresentationStyle = .custom

It’s needed for correct presentation and dismissal of all modal controllers.

Stop scroll

SPStorkController use snapshots. If the parent controller scrollings and you try to show SPStorkController, you will see how it froze, and in a second its final position is updated. I recommend to stop scrolling force:

scrollView.setContentOffset(self.contentOffset, animated: false)

Video Tutorial

You can see how to use SPStorkController and how to customize it in this video. For English speakers I’ve added subtitles, don’t forget to turn them on:

Tutorial on YouTube

Sponsors

Support me with a monthly donation and help me continue activities. After payment I add you to list of sponsor in my all projects with link to your profile. Become a sponsors

My projects

SPAlert

SPAlert is popup from Apple Music & Feedback in AppStore. Contains Done & Heart presets. Done present with draw path animation. I clone Apple's alerts as much as possible.
You can find this alerts in AppStore after feedback, after added song to library in Apple Music. I am also add alert without icon, as simple message.

You can download example Debts - Spending tracker app from AppStore. If you want to buy source code of app in preview, please, go to xcode-shop.com.


SPLarkController

SPLarkController transition between controllers. Translate to top. Make settings screen for application. You can add buttons and switches. The amount cells is not limited. You can start using project with just two lines of code and easy customisation. For implement settings as in preiew, see section Settings Controller.

You can download example app Code - Learn Swift & Design from AppStore. If you want to buy source code of app this app, please, go to xcode-shop.com.


SPPermission

SPPermission allow request permissions with native dialog UI and interactive animations. Also you can request permissions without dialog. Check state any permission. You can start using this project with just two lines of code and easy customisation.

If your app uses SPPermission, write me. I am adding you app as example of usage.

License

SPStorkController is released under the MIT license. Check LICENSE.md for details.

Contact

If you need any application or UI to be developed, message me at [email protected] or via telegram. I develop iOS apps and designs. I use swift for development. To request more functionality, you should create a new issue. You can see my apps in AppStore.

spstorkcontroller's People

Contributors

ilia3546 avatar jobinsjohn avatar

Watchers

James Cloos avatar

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.