{"id":3079,"url":"https://github.com/teodorpatras/EasyTipView","last_synced_at":"2025-08-03T13:31:51.189Z","repository":{"id":29321868,"uuid":"32855386","full_name":"teodorpatras/EasyTipView","owner":"teodorpatras","description":"Fully customisable tooltip view in Swift for iOS.","archived":true,"fork":false,"pushed_at":"2023-06-24T11:27:54.000Z","size":16676,"stargazers_count":3087,"open_issues_count":30,"forks_count":535,"subscribers_count":48,"default_branch":"master","last_synced_at":"2025-07-26T08:46:00.339Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":"","language":"Swift","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":"t83714/rawText2JSON","license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/teodorpatras.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}},"created_at":"2015-03-25T09:39:06.000Z","updated_at":"2025-07-15T10:16:39.000Z","dependencies_parsed_at":"2022-07-12T13:34:49.426Z","dependency_job_id":"d2cd9320-df31-4d21-990b-c1eee3afc88f","html_url":"https://github.com/teodorpatras/EasyTipView","commit_stats":{"total_commits":80,"total_committers":22,"mean_commits":"3.6363636363636362","dds":"0.32499999999999996","last_synced_commit":"8a9133085074c41119516a22b4223f79b8698b40"},"previous_names":[],"tags_count":21,"template":false,"template_full_name":null,"purl":"pkg:github/teodorpatras/EasyTipView","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/teodorpatras%2FEasyTipView","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/teodorpatras%2FEasyTipView/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/teodorpatras%2FEasyTipView/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/teodorpatras%2FEasyTipView/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/teodorpatras","download_url":"https://codeload.github.com/teodorpatras/EasyTipView/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/teodorpatras%2FEasyTipView/sbom","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":268385711,"owners_count":24242100,"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","status":"online","status_checked_at":"2025-08-02T02:00:12.353Z","response_time":74,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"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":[],"created_at":"2024-01-05T20:16:30.781Z","updated_at":"2025-08-03T13:31:50.649Z","avatar_url":"https://github.com/teodorpatras.png","language":"Swift","readme":"\u003cimg src=\"https://raw.githubusercontent.com/teodorpatras/EasyTipView/master/assets/easytipview.png\" alt=\"EasyTipView: fully customisable tooltip view written in Swift\" style=\"width: 500px;\"/\u003e\n\n![Swift3](https://img.shields.io/badge/Swift-5.0-orange.svg?style=flat\")\n[![Platform](https://img.shields.io/cocoapods/p/EasyTipView.svg?style=flat)](http://cocoapods.org/pods/EasyTipView)\n[![Build Status](https://travis-ci.org/teodorpatras/EasyTipView.svg)](https://travis-ci.org/teodorpatras/EasyTipView)\n[![Version](https://img.shields.io/cocoapods/v/EasyTipView.svg?style=flat)](http://cocoapods.org/pods/EasyTipView)\n[![Carthage Compatible](https://img.shields.io/badge/Carthage-compatible-4BC51D.svg?style=flat)](https://github.com/Carthage/Carthage)\n[![License](https://img.shields.io/cocoapods/l/EasyTipView.svg?style=flat)](http://cocoapods.org/pods/EasyTipView)\n\nDescription\n--------------\n\n```EasyTipView``` is a fully customizable tooltip view written in Swift that can be used as a call to action or informative tip.\n\n|\u003cimg src=\"https://raw.githubusercontent.com/teodorpatras/EasyTipView/master/assets/easytipview.gif\" width=\"320\"\u003e|\u003cimg src=\"https://raw.githubusercontent.com/teodorpatras/EasyTipView/master/assets/static.png\" width=\"320\"\u003e|\n|----------|-------------|\n\n# Contents\n1. [Features](#features)\n3. [Installation](#installation)\n4. [Supported OS \u0026 SDK versions](#supported-versions)\n5. [Usage](#usage)\n6. [Customizing the appearance](#customising)\n7. [Customising the presentation and dismissal animations](#customising-animations)\n8. [License](#license)\n9. [Contact](#contact)\n\n\u003ca name=\"features\"\u003e Features \u003c/a\u003e\n--------------\n\n- [x] Can be shown pointing to any ``UIBarItem`` or ``UIView`` subclass.\n- [x] Support for any arrow direction `←, →, ↑, ↓`\n- [x] Automatic orientation change adjustments.\n- [x] Fully customizable appearance (custom content view or simply just text - including `NSAttributedString` - see the Example app).\n- [x] Fully customizable presentation and dismissal animations.\n\n\n\u003ca name=\"installation\"\u003e Installation \u003c/a\u003e\n--------------\n\n### CocoaPods\n\n[CocoaPods](http://cocoapods.org) is a dependency manager for Cocoa projects.\n\nCocoaPods 0.36 adds supports for Swift and embedded frameworks. You can install it with the following command:\n\n```bash\n$ gem install cocoapods\n```\n\nTo integrate EasyTipView into your Xcode project using CocoaPods, specify it in your `Podfile`:\n\n\n```ruby\npod 'EasyTipView', '~\u003e 2.1'\n```\n\nThen, run the following command:\n\n```bash\n$ pod install\n```\n\nIn case Xcode complains (\u003ci\u003e\"Cannot load underlying module for EasyTipView\"\u003c/i\u003e) go to Product and choose Clean (or simply press \u003ckbd\u003e⇧\u003c/kbd\u003e\u003ckbd\u003e⌘\u003c/kbd\u003e\u003ckbd\u003eK\u003c/kbd\u003e).\n\n\n### Carthage\n\n[Carthage](https://github.com/Carthage/Carthage) is a decentralized dependency manager that builds your dependencies and provides you with binary frameworks.\n\nYou can install Carthage with [Homebrew](http://brew.sh/) using the following command:\n\n```bash\n$ brew update\n$ brew install carthage\n```\n\nTo integrate EasyTipView into your Xcode project using Carthage, specify it in your `Cartfile`:\n\n```ogdl\ngithub \"teodorpatras/EasyTipView\"\n```\n\nRun `carthage update` to build the framework and drag the built `EasyTipView.framework` into your Xcode project.\n\n### Manually\n\nIf you prefer not to use either of the aforementioned dependency managers, you can integrate EasyTipView into your project manually.\n\n\u003ca name=\"supported-versions\"\u003e Supported OS \u0026 SDK Versions \u003c/a\u003e\n-----------------------------\n\n* Supported build target - iOS 8+ (Xcode 8)\n\n\u003ca name=\"usage\"\u003e Usage \u003c/a\u003e\n--------------\n\n1) First you should customize the preferences:\n```swift\n\nvar preferences = EasyTipView.Preferences()\npreferences.drawing.font = UIFont(name: \"Futura-Medium\", size: 13)!\npreferences.drawing.foregroundColor = UIColor.whiteColor()\npreferences.drawing.backgroundColor = UIColor(hue:0.46, saturation:0.99, brightness:0.6, alpha:1)\npreferences.drawing.arrowPosition = EasyTipView.ArrowPosition.top\n\n/*\n * Optionally you can make these preferences global for all future EasyTipViews\n */\nEasyTipView.globalPreferences = preferences\n\n```\n\n2) Secondly call the ``show(animated: forView: withinSuperview: text: preferences: delegate:)`` method:\n```swift\nEasyTipView.show(forView: self.buttonB,\nwithinSuperview: self.navigationController?.view,\ntext: \"Tip view inside the navigation controller's view. Tap to dismiss!\",\npreferences: preferences,\ndelegate: self)\n```\n\n**Note that if you set the** ```EasyTipView.globalPreferences```**, you can ommit the** ```preferences``` **parameter in all calls. Additionally, you can also ommit the** ``withinSuperview`` **parameter and the** ``EasyTipView`` **will be shown within the main application window**.\n\n*Alternatively, if you want to dismiss the ``EasyTipView`` programmatically later on, you can use one of the instance methods:*\n\n```swift\n\nlet tipView = EasyTipView(text: \"Some text\", preferences: preferences)\ntipView.show(forView: someView, withinSuperview: someSuperview)\n\n// later on you can dismiss it\ntipView.dismiss()\n```\n\u003ca name=\"customising\"\u003e Customizing the appearance \u003c/a\u003e\n--------------\nIn order to customize the `EasyTipView` appearance and behavior, you can play with the `Preferences` structure which encapsulates all the customizable properties of the ``EasyTipView``. These preferences have been split into three structures:\n* ```Drawing``` - encapsulates customizable properties specifying how ```EastTipView``` will be drawn on screen.\n* ```Positioning``` - encapsulates customizable properties specifying where ```EasyTipView``` will be drawn within its own bounds.\n* ```Animating``` - encapsulates customizable properties specifying how ```EasyTipView``` will animate on and off screen.\n\n| `Drawing ` attribute   |      Description      |\n|----------|-------------|\n|`cornerRadius`| The corner radius of the tip view bubble.|\n|`arrowHeight`| The height of the arrow positioned at the top or bottom of the bubble.|\n|`arrowWidth`| The width of the above mentioned arrow.|\n|`foregroundColor`| The text color.|\n|`backgroundColor`| The background color of the bubble.|\n|`arrowPosition`| The position of the arrow. This can be: \u003cbr /\u003e **+** `.top`: on top of the bubble \u003cbr /\u003e **+** `.bottom`: at the bottom of the bubble.\u003cbr /\u003e **+** `.left`: on the left of the bubble \u003cbr /\u003e **+** `.right`: on the right of the bubble \u003cbr /\u003e **+** `.any`: use this option to let the `EasyTipView` automatically find the best arrow position. \u003cbr /\u003e**If the passed in arrow cannot be applied due to layout restrictions, a different arrow position will be automatically assigned.**|\n|`textAlignment`| The alignment of the text.|\n|`borderWidth`| Width of the optional border to be applied on the bubble.|\n|`borderColor`| Color of the optional border to be applied on the bubble. **In order for the border to be applied, `borderColor` needs to be different that `UIColor.clear` and `borderWidth` \u003e 0**|\n|`font`| Font to be applied on the text. |\n|`shadowColor`| The color of the shadow (default `UIColor.clearcolor`).|\n|`shadowOpacity`| The opacity of the shadow (default `0`). **For the shadow to be drawn, both** `shadowColor` **and** `shadowOpacity` **must be set to a valid value.**|\n|`shadowRadius`| The radius of the shadow (default `0`).|\n|`shadowOffset` | The offset of the shadow. |\n\n| `Positioning ` attribute   |      Description      |\n|----------|-------------|\n|`bubbleHInset`| Horizontal bubble inset within its container.|\n|`bubbleVInset`| Vertical bubble inset within its container.|\n|`contentHInset`| Content horizontal inset within the bubble.|\n|`contentVInset`| Content vertical inset within the bubble.|\n|`maxWidth`| Max bubble width.|\n\n| `Animating ` attribute   |      Description      |\n|----------|-------------|\n|`dismissTransform`| `CGAffineTransform` specifying how the bubble will be dismissed. |\n|`showInitialTransform`| `CGAffineTransform` specifying the initial transform to be applied on the bubble before it is animated on screen. |\n|`showFinalTransform`| `CGAffineTransform` specifying how the bubble will be animated on screen. |\n|`springDamping`| Spring animation damping.|\n|`springVelocity`| Spring animation velocity.|\n|`showInitialAlpha`|Initial alpha to be applied on the tip view before it is animated on screen.|\n|`dismissFinalAlpha`|The alpha to be applied on the tip view when it is animating off screen.|\n|`showDuration`|Show animation duration.|\n|`dismissDuration`|Dismiss animation duration.|\n|`dismissOnTap`|Prevents view from dismissing on tap if it is set to false. (Default value is true.)|\n\n\u003ca name=\"customising-animations\"\u003e Customising the presentation or dismissal animations \u003c/a\u003e\n--------------\n\nThe default animations for showing or dismissing are scale up and down. If you want to change the default behavior, you need to change the attributes of the ``animating`` property within the preferences. An example could be:\n\n```swift\npreferences.animating.dismissTransform = CGAffineTransform(translationX: 0, y: -15)\npreferences.animating.showInitialTransform = CGAffineTransform(translationX: 0, y: -15)\npreferences.animating.showInitialAlpha = 0\npreferences.animating.showDuration = 1.5\npreferences.animating.dismissDuration = 1.5\n```\n\nThis produces the following animations:\n\u003cbr\u003e\u003cbr\u003e\u003cimg src=\"https://raw.githubusercontent.com/teodorpatras/EasyTipView/master/assets/animation.gif\" width=\"200\"\u003e\n\nFor more animations, checkout the example project.\n*Once you configured the animations, a good idea would be to __make these preferences global__, for all future instances of `EasyTipView` by assigning it to ```EasyTipView.globalPreferences```.*\n\n\n\u003ca name=\"license\"\u003e License \u003c/a\u003e\n--------------\n\n```EasyTipView``` is developed by [Teodor Patraş](https://www.teodorpatras.com) and is released under the MIT license. See the ```LICENSE``` file for details.\n\nLogo was created using Bud Icons Launch graphic by [Budi Tanrim](http://buditanrim.co) from [FlatIcon](http://www.flaticon.com/) which is licensed under [Creative Commons BY 3.0](http://creativecommons.org/licenses/by/3.0/). Made with [Logo Maker](http://logomakr.com).\n\n\u003ca name=\"contact\"\u003e Contact \u003c/a\u003e\n--------------\n\nYou can follow or drop me a line on [my Twitter account](https://twitter.com/teodorpatras). If you find any issues on the project, you can open a ticket. Pull requests are also welcome.\n","funding_links":[],"categories":["Walkthrough / Intro / Tutorial","Swift","etc"],"sub_categories":["Web View","Other free courses"],"project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fteodorpatras%2FEasyTipView","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fteodorpatras%2FEasyTipView","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fteodorpatras%2FEasyTipView/lists"}