Skip to content
This repository has been archived by the owner. It is now read-only.
A UI framework that enables panels on iOS.
Branch: master
Clone or download
Latest commit 71d105a May 30, 2018
Type Name Latest commit message Commit time
Failed to load latest commit information.
Example Add third panel to example May 28, 2018
PanelKit Test Host Fixed unit test orientation to landscape Mar 10, 2017
PanelKit UI Test Host Fix tests for slow MKMapView in Xcode 9.0's simulator, disable bogus … Sep 15, 2017
PanelKit UI Tests quick fail on iPhone Jan 4, 2018
PanelKit.xcodeproj Update to Xcode 9.3 & Swift 4.1 Apr 10, 2018
PanelKit.xcworkspace Update to Xcode 9.3 & Swift 4.1 Apr 10, 2018
PanelKit Update isFloating check May 30, 2018
PanelKitTests Fix test May 29, 2018
docs Fix typos Dec 14, 2017
readme-resources Added example gif to readme Feb 20, 2017
showcase-resources Added showcase Mar 20, 2017
.codeclimate.yml Update Tailor config Dec 2, 2017
.codecov.yml [Codecov] Ignore PanelKit UI Test Host Mar 11, 2017
.editorconfig Add .editorconfig Jun 20, 2017
.gitignore Added gitignore Feb 11, 2017
.swift-version Update to Xcode 9.3 & Swift 4.1 Apr 10, 2018
.tailor.yml Update Tailor config Dec 2, 2017
.travis.yml Update to Xcode 9.3 & Swift 4.1 Apr 10, 2018 Update version to 2.0.1 Dec 14, 2017
LICENSE Updated license Feb 20, 2017
PanelKit.podspec Update version to 2.0.1 Dec 14, 2017 Update to Xcode 9.3 & Swift 4.1 Apr 10, 2018 Add Terminal to showcase Jan 7, 2018

PanelKit for iOS

Build Status Codecov
Swift PodVersion Carthage Compatible Platform: iOS
Twitter Donate via PayPal

PanelKit for iOS
Applications using PanelKit can be seen in the showcase.


PanelKit is a UI framework that enables panels on iOS. A panel can be presented in the following ways:

  • Modally
  • As a popover
  • Floating (drag the panel around)
  • Pinned (either left or right)

This framework does all the heavy lifting for dragging panels, pinning them and even moving/resizing them when a keyboard is shown/dismissed.


A lot of effort has gone into making the API simple for a basic implementation, yet very customizable if needed. Since PanelKit is protocol based, you don't need to subclass anything in order to use it. There a two basic principles PanelKit entails: panels and a PanelManager.


A panel is created using the PanelViewController initializer, which expects a UIViewController, PanelContentDelegate and PanelManager.


PanelContentDelegate is a protocol that defines the appearance of a panel. Typically the PanelContentDelegate protocol is implemented for each panel on its UIViewController.


class MyPanelContentViewController: UIViewController, PanelContentDelegate {
    override func viewDidLoad() {
        self.title = "Panel title"	
    var preferredPanelContentSize: CGSize {
        return CGSize(width: 320, height: 500)

A panel is explicitly (without your action) shown in a UINavigationController, but the top bar can be hidden or styled as with any UINavigationController.


PanelManager is a protocol that in its most basic form expects the following:

// The view in which the panels may be dragged around
var panelContentWrapperView: UIView {
    return contentWrapperView

// The content view, which will be moved/resized when panels pin
var panelContentView: UIView {
    return contentView

// An array of PanelViewController objects
var panels: [PanelViewController] {
    return []

Typically the PanelManager protocol is implemented on a UIViewController.

Advanced features

PanelKit has some advanced opt-in features:



To install, add the following line to your Podfile:

pod 'PanelKit', '~> 2.0'


To install, add the following line to your Cartfile:

github "louisdh/panelkit" ~> 2.0

Run carthage update to build the framework and drag the built PanelKit.framework into your Xcode project.


  • iOS 10.0+
  • Xcode 9.0+


Long term:

  • Top/down pinning


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

You can’t perform that action at this time.