[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"project-7021":3},{"id":4,"name":5,"fullName":6,"owner":7,"repo":5,"description":8,"homepage":9,"htmlUrl":10,"language":11,"languages":10,"totalLinesOfCode":10,"stars":12,"forks":13,"watchers":14,"openIssues":15,"contributorsCount":16,"subscribersCount":16,"size":16,"stars1d":16,"stars7d":16,"stars30d":17,"stars90d":16,"forks30d":16,"starsTrendScore":16,"compositeScore":18,"rankGlobal":10,"rankLanguage":10,"license":19,"archived":20,"fork":20,"defaultBranch":21,"hasWiki":20,"hasPages":20,"topics":22,"createdAt":10,"pushedAt":10,"updatedAt":30,"readmeContent":31,"aiSummary":32,"trendingCount":16,"starSnapshotCount":16,"syncStatus":33,"lastSyncTime":34,"discoverSource":35},7021,"Presentation","hyperoslo\u002FPresentation","hyperoslo",":bookmark_tabs: Presentation helps you to make tutorials, release notes and animated pages.","hyper.no",null,"Swift",3066,185,68,3,0,8,59.61,"Other",false,"master",[23,24,25,26,27,28,29],"ios","pages","presentation","slides","swift","tutorials","ui","2026-06-12 04:00:31","⚠️ DEPRECATED, NO LONGER MAINTAINED\n\n![Presentation logo](https:\u002F\u002Fraw.githubusercontent.com\u002Fhyperoslo\u002FPresentation\u002Fmaster\u002FImages\u002Flogo.png)\n\n[![Version](https:\u002F\u002Fimg.shields.io\u002Fcocoapods\u002Fv\u002FPresentation.svg?style=flat)](http:\u002F\u002Fcocoadocs.org\u002Fdocsets\u002FPresentation)\n[![CI Status](http:\u002F\u002Fimg.shields.io\u002Ftravis\u002Fhyperoslo\u002FPresentation.svg?style=flat)](https:\u002F\u002Ftravis-ci.org\u002Fhyperoslo\u002FPresentation)\n[![Carthage Compatible](https:\u002F\u002Fimg.shields.io\u002Fbadge\u002FCarthage-compatible-4BC51D.svg?style=flat)](https:\u002F\u002Fgithub.com\u002FCarthage\u002FCarthage)\n![Swift](https:\u002F\u002Fimg.shields.io\u002Fbadge\u002F%20in-swift%204.0-orange.svg)\n[![License](https:\u002F\u002Fimg.shields.io\u002Fcocoapods\u002Fl\u002FPresentation.svg?style=flat)](http:\u002F\u002Fcocoadocs.org\u002Fdocsets\u002FPresentation)\n[![Platform](https:\u002F\u002Fimg.shields.io\u002Fcocoapods\u002Fp\u002FPresentation.svg?style=flat)](http:\u002F\u002Fcocoadocs.org\u002Fdocsets\u002FPresentation)\n\nLooking for the easiest way of presenting something in your iOS app? Then you are in the right place. **Presentation** will help you make your tutorials, release notes and any kind of animated pages with the minimum amount of effort.\n\n*Presentation* includes the following features:\n\n- Custom positioning: You can use [Position](https:\u002F\u002Fgithub.com\u002Fhyperoslo\u002FPresentation\u002Fblob\u002Fmaster\u002FSource\u002FPosition.swift) for percentage-based position declaration.\n- [Content](https:\u002F\u002Fgithub.com\u002Fhyperoslo\u002FPresentation\u002Fblob\u002Fmaster\u002FSource\u002FContent.swift): View model used for custom positioning and animations. It translates your percents to AutoLayout constraints behind the scenes.\n- Slides: You can use any kind of `UIViewController` as a slide. [SlideController](https:\u002F\u002Fgithub.com\u002Fhyperoslo\u002FPresentation\u002Fblob\u002Fmaster\u002FSource\u002FSlideController.swift) is your good friend if you want to use custom positioning and animation features on your pages.\n- Background: You can add views that are visible across all the pages. Also it's possible to animate those views during the transition to the specific page.  \n- [Animations](https:\u002F\u002Fgithub.com\u002Fhyperoslo\u002FPresentation\u002Ftree\u002Fmaster\u002FSource\u002FAnimations): You can easily animate the appearance of a view on the specific page.\n\nPresentation works both on the iPhone and the iPad. You can use it with both `Swift` and `Objective-C`.\n\nTry one of our [demos](https:\u002F\u002Fgithub.com\u002Fhyperoslo\u002FPresentation\u002Ftree\u002Fmaster\u002FExample) to see how it works:\n\n```shell\npod try Presentation\n```\n\n\n\u003Cp align=\"center\">\n  \u003Cimg src=\"https:\u002F\u002Fraw.githubusercontent.com\u002Fhyperoslo\u002FPresentation\u002Fmaster\u002FExample\u002FParallax\u002FImages\u002FParallax-v2.gif\"\u002F>\n\u003C\u002Fp>\n\n## Table of Contents\n\n* [Usage](#usage)\n  * [Presentation controller](#presentation-controller)\n  * [Position](#position)\n  * [Content view model](#content-view-model)\n  * [Slides](#slides)\n  * [Page animations](#page-animations)\n  * [Background views](#background-views)\n* [Installation](#installation)\n* [Components](#components)\n* [Contributing](#contributing)\n* [Credits](#credits)\n* [License](#license)\n\n## Usage\n\n### Presentation controller\n\n```swift\nimport Presentation\n\nlet viewController1 = UIViewController()\nviewController1.title = \"Controller A\"\n\nlet viewController2 = UIViewController()\nviewController2.title = \"Controller B\"\n\nlet presentationController = PresentationController(pages: [viewController1, viewController2])\n```\n\nIf that's the only thing you need, look into [Pages](https:\u002F\u002Fgithub.com\u002Fhyperoslo\u002FPages).\n\n### Position\n\n`Position` is percentage-based; you can use `left`, `right`, `top`, `bottom` to set a position.\n\n```swift\nlet position = Position(left: 0.3, top: 0.4)\n```\n\n### Content view model\n\n`Content` view model is a layer between `UIView` and `Position`. The current position is the center of a view by default, but can also be changed to the origin of a view.\n\n```swift\nlet view = UIView(frame: CGRect(x: 0, y: 0, width: 200, height: 100))\nlet position = Position(left: 0.3, top: 0.4)\n\nlet centeredContent = Content(view: label, position: position)\nlet originContent = Content(view: label, position: position, centered: false)\n```\n\n### Slides\n\n```swift\nlet label = UILabel(frame: CGRect(x: 0, y: 0, width: 200, height: 100))\nlabel.text = \"Slide 1\"\n\nlet position = Position(left: 0.3, top: 0.4)\nlet content = Content(view: label, position: position)\n\nlet controller = SlideController(contents: [content])\n\npresentationController.add([controller])\n```\n\n### Page animations\n\n```swift\nlet contents = [\"Slide 1\", \"Slide 2\", \"Slide 3\"].map { title -> Content in\n  let label = UILabel(frame: CGRect(x: 0, y: 0, width: 200, height: 100))\n  label.text = title\n\n  let position = Position(left: 0.3, top: 0.4)\n\n  return Content(view: label, position: position)\n}\n\nvar slides = [SlideController]()\n\nfor index in 0...2 {\n  let content = contents[index]\n  let controller = SlideController(contents: [content])\n  let animation = TransitionAnimation(\n    content: content,\n    destination: Position(left: 0.5, top: content.initialPosition.top),\n    duration: 2.0,\n    dumping: 0.8,\n    reflective: true)\n  controller.add(animations: [animation])\n\n  slides.append(controller)\n}\n\npresentationController.add(slides)\n```\n\n### Background views\n\n```swift\nlet imageView = UIImageView(image: UIImage(named: \"image\"))\nlet content = Content(view: imageView, position: Position(left: -0.3, top: 0.2))\n\npresentationController.addToBackground([content])\n\n\u002F\u002F Add pages animations\npresentationController.add(animations: [\n  TransitionAnimation(content: content, destination: Position(left: 0.2, top: 0.2))],\n  forPage: 0)\n\npresentationController.add(animations: [\n  TransitionAnimation(content: content, destination: Position(left: 0.3, top: 0.2))],\n  forPage: 1)\n```\n\n## Installation\n\n**Presentation** is available through [CocoaPods](http:\u002F\u002Fcocoapods.org). To install\nit, simply add the following line to your Podfile:\n\n```ruby\npod 'Presentation'\n```\n\n**Presentation** is also available through [Carthage](https:\u002F\u002Fgithub.com\u002FCarthage\u002FCarthage).\nTo install just write into your Cartfile:\n\n```ruby\ngithub \"hyperoslo\u002FPresentation\"\n```\n\n## Components\n\n**Presentation** wouldn’t be possible without the help of these components:\n\n* [**Pages**](https:\u002F\u002Fgithub.com\u002Fhyperoslo\u002FPages): The easiest way of setting up a `UIPageViewController`\n\n* [**Cartography**](https:\u002F\u002Fgithub.com\u002Frobb\u002FCartography): Helps you set up your Auto Layout constraints declaratively and without any stringly typing!\n\n## Contributing\n\nPlease see our [playbook](https:\u002F\u002Fgithub.com\u002Fhyperoslo\u002Fplaybook\u002Fblob\u002Fmaster\u002FGIT_AND_GITHUB.md) for guidelines on contributing.\n\n## Credits\n\n[Hyper](http:\u002F\u002Fhyper.no) made this. We’re a digital communications agency with a passion for good code and delightful user experiences. If you’re using this library we probably want to [hire you](https:\u002F\u002Fgithub.com\u002Fhyperoslo\u002FiOS-playbook\u002Fblob\u002Fmaster\u002FHYPER_RECIPES.md) (we consider remote employees, too; the only requirement is that you’re awesome).\n\n## License\n\nPresentation is available under the MIT license. See the [LICENSE](https:\u002F\u002Fgithub.com\u002Fhyperoslo\u002FPresentation\u002Fblob\u002Fmaster\u002FLICENSE.md).\n","Presentation 是一个用于在 iOS 应用中创建教程、发布说明和动画页面的 Swift 库。其核心功能包括自定义定位、内容视图模型、幻灯片支持以及背景视图管理，能够轻松实现基于百分比的布局声明和自动布局约束转换，并支持各种类型的动画效果。尽管此项目已不再维护，它仍然适用于需要快速集成引导页或展示动态内容的应用场景，尤其适合那些希望以最少代码量实现高质量用户交互体验的开发者。",2,"2026-06-11 03:10:10","top_language"]