Latest 0.6.0
License MIT
Platforms ios 9.0

Create your own pull up controller with multiple sticky points like in iOS Maps

Swift 4
Cocoapods Compatible



  • Multiple sticky points
  • Landscape support
  • Scroll views friendly


  1. Add pod 'PullUpController' to your Podfile or copy PullUpController.swift into your project
  2. Make sure the view controller that will be your pull up controller inherits from PullUpController
  3. Add the controller as child of your main controller using addPullUpController(<#T##PullUpController#>, initialStickyPointOffset: <#T##CGFloat#>, animated: <#T##Bool#>)


You can customize the controller behavior by overriding the followings properties:

pullUpControllerPreferredSize: CGSize

The desired size of the pull up controller’s view, in screen units.
The default value is width: UIScreen.main.bounds.width, height: 400.

pullUpControllerPreferredLandscapeFrame: CGRect

The desired size of the pull up controller’s view, in screen units when the device is in landscape mode.
The default value is (x: 10, y: 10, width: 300, height: UIScreen.main.bounds.height - 20).

pullUpControllerMiddleStickyPoints: [CGFloat]

A list of y values, in screen units expressed in the pull up controller coordinate system.
At the end of the gestures the pull up controller will scroll to the nearest point in the list.

Please keep in mind that this array should contains only sticky points in the middle of the pull up controller’s view;
There is therefore no need to add the fist one (pullUpControllerPreviewOffset), and/or the last one (pullUpControllerPreferredSize.height).

For a complete list of all the sticky points you can use pullUpControllerAllStickyPoints

pullUpControllerIsBouncingEnabled: Bool

A Boolean value that determines whether bouncing occurs when scrolling reaches the end of the pull up controller’s view size.
The default value is false.

It’s possible to change the view controller’s view position programmatically by using the method
pullUpControllerMoveToVisiblePoint(_ visiblePoint: CGFloat, completion: (() -> Void)?)

This method will move the pull up controller’s view in order to show the provided visible point.

You may use on of pullUpControllerAllStickyPoints item to provide a valid visible point.

  • visiblePoint: the y value to make visible, in screen units expressed in the pull up controller coordinate system.
  • completion: The closure to execute after the animation is completed. This block has no return value and takes no parameters. You may specify nil for this parameter.

By overriding the following method it is possible to customize all the animations performed by the controller’s view.

pullUpControllerAnimate(withDuration duration: TimeInterval, animations: @escaping () -> Void, completion: ((Bool) -> Void)?)

To observe the PullUpController’s view state there’re some usefull callbacks such as:

  • willMoveToStickyPoint: ((_ point: CGFloat) -> Void)?
  • didMoveToStickyPoint: ((_ point: CGFloat) -> Void)?
  • onDrag: ((_ point: CGFloat) -> Void)?

PullUpController is easy draggable even if your PullUpController‘s view contains a UIScrollView, just attach it to the controller itself with the following method:
<#T##UIScrollView#>.attach(to: <#T##PullUpController#>)

Attach the scroll view to the provided pull up controller in order to move it with the scroll view content.

  • pullUpController: the pull up controller to move with the current scroll view content.


In this repository you can also find a demo.


If you like this git you can follow me here or on twitter :) @MarioIannotta

Cheers from Italy!

Latest podspec

    "name": "PullUpController",
    "version": "0.6.0",
    "summary": "Pull up controller with multiple sticky points like in iOS Maps.",
    "homepage": "",
    "license": {
        "type": "MIT",
        "file": "LICENSE"
    "authors": {
        "Mario Iannotta": "[email protected]"
    "source": {
        "git": "",
        "tag": "0.6.0"
    "platforms": {
        "ios": "9.0"
    "source_files": "PullUpController/**/*.swift",
    "pod_target_xcconfig": {
        "SWIFT_VERSION": "4.2"

Pin It on Pinterest

Share This