Giter VIP home page Giter VIP logo

pipwkit's Introduction

Swift CocoaPods

PIPWKit

Picture in Picture Window for iOS

pip_default pip_transition

Ready for

  • Device orientation
  • iOS11+ with iOS13 modal style support
  • Swift 5.x+
  • XCode 11.5+
  • Over modal context

If your project is IOS13+, you must set the mainWindow parameter in the show function

Installation

CocoaPods

PIPWKit is available through CocoaPods. To install it, simply add the following line to your Podfile:

pod 'PIPWKit'

Swift Package Manager

PIPWKit is available through SPM

https://github.com/nexor-it/PIPWKit/

Usage

PIPUsable

protocol PIPWUsable {
    var initialState: PIPWState { get }
    var initialPosition: PIPWPosition { get }
    var pipEdgeInsets: UIEdgeInsets { get }
    var pipSize: CGSize { get }
    var pipShadow: PIPWShadow? { get }
    var pipCorner: PIPWCorner? { get }
    func didChangedState(_ state: PIPWState)
    func didChangePosition(_ position: PIPWPosition)
}

PIPWKit

open class PIPWKit {
    
    static var isActive: Bool { return floatingWindow != nil }
    static var isPIP: Bool { return state == .pip }

    static var floatingWindow: PIPWViewWindow?
    static var mainWindow: UIWindow?

    class func show(with viewController: UIViewController, mainWindow: UIWindow? = nil, completion: (() -> Void)? = nil) { ... }
    class func dismiss(animated: Bool, completion: (() -> Void)? = nil) { ... }
}

PIPWViewWindow: UIViewController, PIPWUsable

func setNeedUpdatePIPSize()
func startPIPMode()
func stopPIPMode()

At a Glance

Show & Dismiss

class PIPViewController: UIViewController, PIPWUsable {
    
    var initialState: PIPWState { return .pip }
    var pipSize: CGSize { return CGSize(width: 200.0, height: 200.0) }
    
    override func viewDidLoad() {
        super.viewDidLoad()
        view.backgroundColor = .blue
        view.layer.borderColor = UIColor.red.cgColor
        view.layer.borderWidth = 1.0
    }
    
    override func touchesEnded(_ touches: Set<UITouch>, with event: UIEvent?) {
        super.touchesEnded(touches, with: event)
        
        if PIPWKit.isPIP {
            PIPWKit.floatingWindow?.stopPIPMode()
        } else {
            PIPWKit.floatingWindow?.startPIPMode()
        }
    }
    
    func didChangedState(_ state: PIPWState) {
        switch state {
        case .pip:
            print("PIPViewController.pip")
        case .full:
            print("PIPViewController.full")
        }
    }
}

let vc = PIPViewController()
PIPWKit.show(with: vc)
PIPWKit.dismiss(animated: true)

Update PIPSize

pip_resize

class PIPViewController: UIViewController, PIPWUsable {

    func onUpdatePIPSize(_ sender: UIButton) {
        pipSize = CGSize(width: 100 + Int(arc4random_uniform(100)),
                         height: 100 + Int(arc4random_uniform(100)))
        PIPWKit.floatingWindow?.setNeedUpdatePIPSize()
    }
}

FullScreen <-> PIP Mode

class PIPViewController: UIViewController, PIPWUsable {

    func fullScreenAndPIPMode() {
        if PIPWKit.isPIP {
            PIPWKit.floatingWindow?.stopPIPMode()
        } else {
            PIPWKit.floatingWindow?.startPIPMode()
        }
    }

    func didChangedState(_ state: PIPWState) {}
    func didChangePosition(_ position: PIPWPosition) {}
}

Authors

PIPWKit is made with love by Daniele Galiotto (gali8), CIO at Nexor Technology

PIPWKit is inspired to PIPKit. PIPKit is by Taeun Kim (kofktu), https://github.com/Kofktu/PIPKit

License

PIPWKit (like PIPKit) is available under the MIT license. See the LICENSE file for more info.

pipwkit's People

Contributors

gali8 avatar anthonygp avatar

Stargazers

 avatar Wonder Park  avatar FolderV avatar SoloX avatar jinhu avatar frankfanslc avatar Omar Al tawashi avatar Corey Lin avatar Sharulnizar ^_^ avatar Samuel Wang avatar  avatar Denis avatar Milad Heidari avatar Derrick avatar Kim Seungjin avatar fernando.ios(페르난도) avatar  avatar  avatar Alex Sherbakov avatar MaakCode avatar Satveer Chopra avatar Rayan Saeed avatar Wilmar van Heerden avatar João Mourato avatar Omid Golparvar avatar Les avatar Fabien avatar Andrea Stevanato avatar Shanti Rodríguez avatar Naman Vaishnav avatar kkm avatar Aleksei Kakoulin avatar Shawon Ashraf avatar MohsinAli avatar Warif Akhand Rishi avatar ChangJo avatar 愚非愚余 avatar  avatar  avatar Stanley Miller avatar  avatar  avatar Popeye Lau avatar George J avatar Ortwin Gentz, FutureTap avatar Dario Pellegrini avatar Dmytro Momotov avatar Alessandro Vendruscolo avatar Alexander Alemayhu avatar Ashshaosh avatar Kos avatar  avatar Tomas Kartasovas avatar Mohamed Taher Mosbah avatar Fumiya Yamanaka avatar Florin Florică avatar Joakim Stien avatar mono — Masayuki Ono avatar Wayne Dahlberg avatar TOYAMA Yosaku avatar Agapov Alexey avatar Jozef Lipovsky avatar Edon avatar André Silva avatar J.Boboye avatar Jayson Rhynas avatar Moosa Baloch avatar Faustino Koepp avatar  avatar Vincenzo Stira avatar Jose Figueiredo avatar tosaka avatar Heyward Fann avatar Daniele Margutti avatar Omar El Malak avatar  avatar Lucas Bento avatar Edoardo Benissimo avatar Federico avatar Marino Faggiana avatar  avatar

Watchers

James Cloos avatar  avatar MohsinAli avatar André Silva avatar Dan avatar Stefano Soro avatar  avatar

pipwkit's Issues

Initial State Full

Hello, thanks for this great library!

I'm having an issue where I want my view controller to start in full mode. however, even if initial state is set to .full, the view controller is presented in PIP mode.

var initialState: PIPWState { return .full }

I'm not sure if I'm doing this wrong?

Thanks!

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.