{"id":2216,"url":"https://github.com/MarioIannotta/PullUpController","last_synced_at":"2025-08-02T23:32:21.870Z","repository":{"id":43465600,"uuid":"109520208","full_name":"MarioIannotta/PullUpController","owner":"MarioIannotta","description":"Pull up controller with multiple sticky points like in iOS Maps","archived":false,"fork":false,"pushed_at":"2024-10-08T17:36:18.000Z","size":5139,"stargazers_count":1240,"open_issues_count":15,"forks_count":142,"subscribers_count":31,"default_branch":"master","last_synced_at":"2024-10-29T17:55:41.082Z","etag":null,"topics":["modal-panel","sliding-menu","swipe","user-experience","user-interaction"],"latest_commit_sha":null,"homepage":"","language":"Swift","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/MarioIannotta.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2017-11-04T18:33:35.000Z","updated_at":"2024-10-18T17:02:21.000Z","dependencies_parsed_at":"2024-11-20T07:08:11.709Z","dependency_job_id":"18a3ce5f-f8f4-4319-9769-e02e3e45df19","html_url":"https://github.com/MarioIannotta/PullUpController","commit_stats":{"total_commits":86,"total_committers":12,"mean_commits":7.166666666666667,"dds":0.2325581395348837,"last_synced_commit":"b82611ae2c635a9625c0539c3db6042a9990e9b9"},"previous_names":[],"tags_count":11,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/MarioIannotta%2FPullUpController","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/MarioIannotta%2FPullUpController/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/MarioIannotta%2FPullUpController/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/MarioIannotta%2FPullUpController/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/MarioIannotta","download_url":"https://codeload.github.com/MarioIannotta/PullUpController/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":228503142,"owners_count":17930520,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["modal-panel","sliding-menu","swipe","user-experience","user-interaction"],"created_at":"2024-01-05T20:16:07.849Z","updated_at":"2024-12-06T17:30:51.269Z","avatar_url":"https://github.com/MarioIannotta.png","language":"Swift","funding_links":[],"categories":["UI","Swift"],"sub_categories":["Font","Other free courses","Other Testing"],"readme":"# PullUpController\nCreate your own pull up controller with multiple sticky points like in iOS Maps\n\n[![Platform](http://img.shields.io/badge/platform-ios-red.svg?style=flat\n)](https://developer.apple.com/iphone/index.action)\n[![Swift 5](https://img.shields.io/badge/Swift-5-orange.svg?style=flat)](https://developer.apple.com/swift/) \n[![Cocoapods Compatible](https://img.shields.io/cocoapods/v/PullUpController.svg)](https://img.shields.io/cocoapods/v/PullUpController.svg)\n[![Maintainability](https://api.codeclimate.com/v1/badges/ab0e3ab724774c9b5974/maintainability)](https://codeclimate.com/github/MarioIannotta/PullUpController/maintainability)\n\n\u003cimg src=\"https://raw.githubusercontent.com/MarioIannotta/PullUpController/master/demo.gif\" height=\"500\"/\u003e\n\n# Features\n- Multiple *sticky* points\n- Landscape support\n- Scroll views friendly\n\n# Setup\n1. Add `pod 'PullUpController'` to your Podfile or copy `PullUpController.swift` into your project\n2. Make sure the view controller that will be your pull up controller inherits from `PullUpController`\n3. Add the controller as child of your main controller using `addPullUpController(\u003c#T##PullUpController#\u003e, initialStickyPointOffset: \u003c#T##CGFloat#\u003e, animated: \u003c#T##Bool#\u003e)`\n \n# Customization\nYou can customize the controller behavior by overriding the followings properties:\n\n`pullUpControllerPreferredSize: CGSize`\n\u003eThe desired size of the pull up controller’s view, in screen units.\n\u003eThe default value is width: `UIScreen.main.bounds.width, height: 400`.\n\n`pullUpControllerPreferredLandscapeFrame: CGRect`\n\u003eThe desired size of the pull up controller’s view, in screen units when the device is in landscape mode.\n\u003eThe default value is `(x: 10, y: 10, width: 300, height: UIScreen.main.bounds.height - 20)`.\n\n`pullUpControllerMiddleStickyPoints: [CGFloat]`\n\u003eA list of y values, in screen units expressed in the pull up controller coordinate system.\n\u003eAt the end of the gestures the pull up controller will scroll to the nearest point in the list.\n\u003e     \n\u003eFor a complete list of all the sticky points you can use `pullUpControllerAllStickyPoints`\n\n`pullUpControllerBounceOffset: CGFloat`\n\u003eA CGFloat value that determines how much the pull up controller's view can bounce outside it's size.\n\u003eThe default value is 0 and that means the the view cannot expand beyond its size.\n\nIt's possible to change the view controller's view position programmatically by using the method\n`pullUpControllerMoveToVisiblePoint(_ visiblePoint: CGFloat, animated: Bool, completion: (() -\u003e Void)?)`\n\n\u003eThis method will move the pull up controller's view in order to show the provided visible point.\n\u003e    \n\u003eYou may use on of `pullUpControllerAllStickyPoints` item to provide a valid visible point.\n\u003e- `visiblePoint`: the y value to make visible, in screen units expressed in the pull up controller coordinate system.\n\u003e- `animated`: a true value will move the view with an animation.\n\u003e- `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.\n\nBy overriding the following method it is possible to customize all the animations performed by the controller's view.\n` pullUpControllerAnimate(action: Action,\n                                                    withDuration duration: TimeInterval,\n                                                    animations: @escaping () -\u003e Void,\n                                                    completion: ((Bool) -\u003e Void)?)`\n\n\u003eYou can consider override this method and customize the animation using the method\n\u003e`UIView.animate(withDuration:, delay:, usingSpringWithDamping:, initialSpringVelocity:, options:, animations:, completion:)`\n\u003e- `parameter`: The action that is about to be performed (.add, .remove or .move)\n\u003e- `duration`: The total duration of the animations, measured in seconds. If you specify a negative value or 0, the changes are made without animating them.\n\u003e-`animations`: A block object containing the changes to commit to the views.\n\u003e`completion`: A block object to be executed when the animation sequence ends.\n\nIt is possible to observe the PullUpController's view state by overriding those methods:\n`pullUpControllerWillMove(to point: CGFloat)`\n\u003eThis method is called before the pull up controller's view move to a sticky point.\n\n`pullUpControllerDidMove(to point: CGFloat)`\n\u003eThis method is called after the pull up controller's view move to a point.\n\n`pullUpControllerDidDrag(to point: CGFloat)`\n\u003eThis method is called after the pull up controller's view is dragged to a point.\n\nPullUpController is easy draggable even if your `PullUpController`'s view contains a `UIScrollView`, just attach it to the controller itself with the following method:\n`\u003c#T##UIScrollView#\u003e.attach(to: \u003c#T##PullUpController#\u003e)`\n\u003eAttach the scroll view to the provided pull up controller in order to move it with the scroll view content.\n\u003e- `pullUpController`: the pull up controller to move with the current scroll view content.\n\n# Demo\nIn this repository you can also find a demo.\n\n# Info\nIf you like this git you can follow me here or on twitter :) [@MarioIannotta](http://www.twitter.com/marioiannotta)\n\nCheers from Italy!\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2FMarioIannotta%2FPullUpController","html_url":"https://awesome.ecosyste.ms/projects/github.com%2FMarioIannotta%2FPullUpController","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2FMarioIannotta%2FPullUpController/lists"}