base on Codeless drop-in universal library allows to prevent issues of keyboard sliding up and cover UITextField/UITextView. Neither need to write any code nor any setup required and much more. <p align="center"> <img src="https://raw.githubusercontent.com/hackiftekhar/IQKeyboardManager/master/Screenshot/Social.png" alt="Icon"/> </p> [![LICENSE.md](https://img.shields.io/github/license/hackiftekhar/IQKeyboardManager.svg)](https://github.com/hackiftekhar/IQKeyboardManager/blob/master/LICENSE.md) [![Build Status](https://travis-ci.org/hackiftekhar/IQKeyboardManager.svg)](https://travis-ci.org/hackiftekhar/IQKeyboardManager) ![Platform iOS](https://img.shields.io/badge/Platform-iOS-blue.svg?style=fla) [![CocoaPods](https://img.shields.io/cocoapods/v/IQKeyboardManagerSwift.svg)](http://cocoadocs.org/docsets/IQKeyboardManagerSwift) [![Github tag](https://img.shields.io/github/tag/hackiftekhar/iqkeyboardmanager.svg)](https://github.com/hackiftekhar/IQKeyboardManager/tags) ## IQKeyboardManager Objective-C version source code is moved to https://github.com/hackiftekhar/IQKeyboardManagerObjC ## Introduction While developing iOS apps, we often run into issues where the iPhone keyboard slides up and covers the `UITextField/UITextView`. `IQKeyboardManager` allows you to prevent this issue of keyboard sliding up and covering `UITextField/UITextView` without needing you to write any code or make any additional setup. To use `IQKeyboardManager` you simply need to add source files to your project. ## Key Features 1. **One Line of Code** - Just enable and it works 2. **Works Automatically** - No manual setup required 3. **No More UIScrollView** - Automatically handles scroll views 4. **No More Subclasses** - Works with standard UIKit components 5. **No More Manual Work** - Handles all edge cases automatically 6. **Modular Architecture** - Include only what you need via subspecs ### What's Included - ✅ Automatic keyboard avoidance for UITextField/UITextView - ✅ Support for UIScrollView, UITableView, UICollectionView - ✅ All interface orientations - ✅ Configurable keyboard distance - ✅ Class-level enable/disable control ### Optional Features (via Subspecs) - 📦 Toolbar with Previous/Next/Done buttons - 📦 Return key handling customization - 📦 Tap-to-resign keyboard - 📦 Keyboard appearance configuration - 📦 UITextView with placeholder supportv ## Subspecs Now IQKeyboardManagerSwift uses a modular architecture with subspecs. By default, all subspecs are included, but you can include only what you need: ### Available Subspecs - **Core** (always included): Basic keyboard distance management - **Appearance**: Keyboard appearance configuration - **IQKeyboardReturnManager**: Return key handling - **IQKeyboardToolbarManager**: Toolbar functionality (Previous/Next/Done buttons) - **IQTextView**: UITextView with placeholder support - **Resign**: Tap-to-resign keyboard functionality ### Including Specific Subspecs ```ruby # Include toolbar example pod 'IQKeyboardManagerSwift/IQKeyboardToolbarManager' ``` ## Screenshot [![Screenshot 1](https://raw.githubusercontent.com/hackiftekhar/IQKeyboardManager/master/Screenshot/README_Screenshot1.png)](http://youtu.be/6nhLw6hju2A) [![Screenshot 2](https://raw.githubusercontent.com/hackiftekhar/IQKeyboardManager/master/Screenshot/README_Screenshot2.png)](http://youtu.be/6nhLw6hju2A) [![Screenshot 3](https://raw.githubusercontent.com/hackiftekhar/IQKeyboardManager/master/Screenshot/README_Screenshot3.png)](http://youtu.be/6nhLw6hju2A) [![Screenshot 4](https://raw.githubusercontent.com/hackiftekhar/IQKeyboardManager/master/Screenshot/README_Screenshot4.png)](http://youtu.be/6nhLw6hju2A) [![Screenshot 5](https://raw.githubusercontent.com/hackiftekhar/IQKeyboardManager/master/Screenshot/README_Screenshot5.png)](http://youtu.be/6nhLw6hju2A) ## GIF animation [![IQKeyboardManager](https://raw.githubusercontent.com/hackiftekhar/IQKeyboardManager/v3.3.0/Screenshot/IQKeyboardManager.gif)](http://youtu.be/6nhLw6hju2A) ## Video <a href="http://youtu.be/WAYc2Qj-OQg" target="_blank"><img src="http://img.youtube.com/vi/WAYc2Qj-OQg/0.jpg" alt="IQKeyboardManager Demo Video" width="480" height="360" border="10" /></a> ## Tutorial video by @rebeloper ([#1135](https://github.com/hackiftekhar/IQKeyboardManager/issues/1135)) @rebeloper demonstrated two videos on how to implement **IQKeyboardManager** at it's core: <a href="https://www.youtube.com/playlist?list=PL_csAAO9PQ8aTL87XnueOXi3RpWE2m_8v" target="_blank"><img src="https://raw.githubusercontent.com/hackiftekhar/IQKeyboardManager/master/Screenshot/ThirdPartyYoutubeTutorial.jpg" alt="Youtube Tutorial Playlist"/></a> https://www.youtube.com/playlist?list=PL_csAAO9PQ8aTL87XnueOXi3RpWE2m_8v ## Warning - **If you're planning to build SDK/library/framework and want to handle UITextField/UITextView with IQKeyboardManager then you're totally going the wrong way.** I would never suggest to add **IQKeyboardManager** as **dependency/adding/shipping** with any third-party library. Instead of adding **IQKeyboardManager** you should implement your own solution to achieve same kind of results. **IQKeyboardManager** is totally designed for projects to help developers for their convenience, it's not designed for **adding/dependency/shipping** with any **third-party library**, because **doing this could block adoption by other developers for their projects as well (who are not using IQKeyboardManager and have implemented their custom solution to handle UITextField/UITextView in the project).** - If **IQKeyboardManager** conflicts with other **third-party library**, then it's **developer responsibility** to **enable/disable IQKeyboardManager** when **presenting/dismissing** third-party library UI. Third-party libraries are not responsible to handle IQKeyboardManager. ## Requirements | | Minimum iOS Target | Minimum Xcode Version | |------------------------|--------------------|-----------------------| | IQKeyboardManagerSwift | iOS 13.0 | Xcode 13 | | Demo Project | | Xcode 15 | #### Swift versions support | Swift | Xcode | IQKeyboardManagerSwift | |-------------------|-------|------------------------| | 5.9, 5.8, 5.7 | 16 | >= 7.0.0 | | 5.9, 5.8, 5.7, 5.6| 15 | >= 7.0.0 | | 5.5, 5.4, 5.3, 5.2, 5.1, 5.0, 4.2| 11 | >= 6.5.7 | | 5.1, 5.0, 4.2, 4.0, 3.2, 3.0| 11 | >= 6.5.0 | | 5.0,4.2, 4.0, 3.2, 3.0| 10.2 | >= 6.2.1 | | 4.2, 4.0, 3.2, 3.0| 10.0 | >= 6.0.4 | | 4.0, 3.2, 3.0 | 9.0 | 5.0.0 | Installation ========================== #### CocoaPods To install it, simply add the following line to your Podfile: ([#236](https://github.com/hackiftekhar/IQKeyboardManager/issues/236)) ```ruby pod 'IQKeyboardManagerSwift' ``` *Or you can choose the version you need based on Swift support table from [Requirements](README.md#requirements)* ```ruby pod 'IQKeyboardManagerSwift', '8.0.0' ``` #### Carthage To integrate `IQKeyboardManger` or `IQKeyboardManagerSwift` into your Xcode project using Carthage, add the following line to your `Cartfile`: ```ogdl github "hackiftekhar/IQKeyboardManager" ``` Run `carthage update --use-xcframeworks` to build the frameworks and drag `IQKeyboardManagerSwift.xcframework` into your Xcode project based on your need. Make sure to add only one framework, not both. #### Swift Package Manager (SPM) To install `IQKeyboardManagerSwift` package via Xcode * Go to File -> Swift Packages -> Add Package Dependency... * Then search for https://github.com/hackiftekhar/IQKeyboardManager.git * And choose the version you want #### Source Code ***IQKeyboardManagerSwift:*** Source code installation is not supported (since 7.2.0) because now the library depends on some other independent libraries. Due to this you may face compilation issues. #### Basic Usage ### Minimal Setup (Core Only) In `AppDelegate.swift`, import and enable IQKeyboardManager: ```swift import IQKeyboardManagerSwift @UIApplicationMain class AppDelegate: UIResponder, UIApplicationDelegate { var window: UIWindow? func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool { // Enable keyboard management IQKeyboardManager.shared.isEnabled = true return true } } ``` That's it! The keyboard will now automatically adjust to avoid covering text fields. ### With Toolbar (Requires IQKeyboardToolbarManager Subspec) ```swift import IQKeyboardManagerSwift func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool { // Enable keyboard management IQKeyboardManager.shared.isEnabled = true // Enable toolbar (@Deprecated: Please use IQKeyboardToolbarManager pod independently) IQKeyboardManager.shared.enableAutoToolbar = true return true } ``` ### With All Features ```swift import IQKeyboardManagerSwift func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool { // Core functionality IQKeyboardManager.shared.isEnabled = true IQKeyboardManager.shared.keyboardDistance = 20.0 // Toolbar (if using IQKeyboardToolbarManager subspec) IQKeyboardManager.shared.enableAutoToolbar = true // Tap to resign (if using Resign subspec) IQKeyboardManager.shared.resignOnTouchOutside = true // Appearance (if using Appearance subspec) IQKeyboardManager.shared.keyboardConfiguration.overrideKeyboardAppearance = true IQKeyboardManager.shared.keyboardConfiguration.keyboardAppearance = .dark return true } ``` Migration Guide ========================== - [IQKeyboardManager 2.0.0 Migration Guide](https://github.com/hackiftekhar/IQKeyboardManager/blob/master/Documentation/MIGRATION%20GUIDE%201.0%20TO%202.0.md) - [IQKeyboardManager 3.0.0 Migration Guide](https://github.com/hackiftekhar/IQKeyboardManager/blob/master/Documentation/MIGRATION%20GUIDE%202.0%20TO%203.0.md) - [IQKeyboardManager 4.0.0 Migration Guide](https://github.com/hackiftekhar/IQKeyboardManager/blob/master/Documentation/MIGRATION%20GUIDE%203.0%20TO%204.0.md) - [IQKeyboardManager 5.0.0 Migration Guide](https://github.com/hackiftekhar/IQKeyboardManager/blob/master/Documentation/MIGRATION%20GUIDE%204.0%20TO%205.0.md) - [IQKeyboardManager 6.0.0 Migration Guide](https://github.com/hackiftekhar/IQKeyboardManager/blob/master/Documentation/MIGRATION%20GUIDE%205.0%20TO%206.0.md) - [IQKeyboardManager 7.0.0 Migration Guide](https://github.com/hackiftekhar/IQKeyboardManager/blob/master/Documentation/MIGRATION%20GUIDE%206.0%20TO%207.0.md) - [IQKeyboardManager 8.0.0 Migration Guide](https://github.com/hackiftekhar/IQKeyboardManager/blob/master/Documentation/MIGRATION%20GUIDE%207.0%20TO%208.0.md) Other Links ========================== - [Known Issues](https://github.com/hackiftekhar/IQKeyboardManager/wiki/Known-Issues) - [Manual Management Tweaks](https://github.com/hackiftekhar/IQKeyboardManager/wiki/Manual-Management) - [Properties and functions usage](https://github.com/hackiftekhar/IQKeyboardManager/wiki/Properties-&-Functions) ## Dependency Diagram [![IQKeyboardManager Dependency Diagram](https://raw.githubusercontent.com/hackiftekhar/IQKeyboardManager/master/Screenshot/IQKeyboardManagerDependency.jpg)](https://raw.githubusercontent.com/hackiftekhar/IQKeyboardManager/master/Screenshot/IQKeyboardManagerDependency.jpg) LICENSE --- Distributed under the MIT License. Contributions --- Any contribution is more than welcome! You can contribute through pull requests and issues on GitHub. Author --- If you wish to contact me, email at: [email protected] ", Assign "at most 3 tags" to the expected json: {"id":"10757","tags":[]} "only from the tags list I provide: [{"id":77,"name":"3d"},{"id":89,"name":"agent"},{"id":17,"name":"ai"},{"id":54,"name":"algorithm"},{"id":24,"name":"api"},{"id":44,"name":"authentication"},{"id":3,"name":"aws"},{"id":27,"name":"backend"},{"id":60,"name":"benchmark"},{"id":72,"name":"best-practices"},{"id":39,"name":"bitcoin"},{"id":37,"name":"blockchain"},{"id":1,"name":"blog"},{"id":45,"name":"bundler"},{"id":58,"name":"cache"},{"id":21,"name":"chat"},{"id":49,"name":"cicd"},{"id":4,"name":"cli"},{"id":64,"name":"cloud-native"},{"id":48,"name":"cms"},{"id":61,"name":"compiler"},{"id":68,"name":"containerization"},{"id":92,"name":"crm"},{"id":34,"name":"data"},{"id":47,"name":"database"},{"id":8,"name":"declarative-gui "},{"id":9,"name":"deploy-tool"},{"id":53,"name":"desktop-app"},{"id":6,"name":"dev-exp-lib"},{"id":59,"name":"dev-tool"},{"id":13,"name":"ecommerce"},{"id":26,"name":"editor"},{"id":66,"name":"emulator"},{"id":62,"name":"filesystem"},{"id":80,"name":"finance"},{"id":15,"name":"firmware"},{"id":73,"name":"for-fun"},{"id":2,"name":"framework"},{"id":11,"name":"frontend"},{"id":22,"name":"game"},{"id":81,"name":"game-engine "},{"id":23,"name":"graphql"},{"id":84,"name":"gui"},{"id":91,"name":"http"},{"id":5,"name":"http-client"},{"id":51,"name":"iac"},{"id":30,"name":"ide"},{"id":78,"name":"iot"},{"id":40,"name":"json"},{"id":83,"name":"julian"},{"id":38,"name":"k8s"},{"id":31,"name":"language"},{"id":10,"name":"learning-resource"},{"id":33,"name":"lib"},{"id":41,"name":"linter"},{"id":28,"name":"lms"},{"id":16,"name":"logging"},{"id":76,"name":"low-code"},{"id":90,"name":"message-queue"},{"id":42,"name":"mobile-app"},{"id":18,"name":"monitoring"},{"id":36,"name":"networking"},{"id":7,"name":"node-version"},{"id":55,"name":"nosql"},{"id":57,"name":"observability"},{"id":46,"name":"orm"},{"id":52,"name":"os"},{"id":14,"name":"parser"},{"id":74,"name":"react"},{"id":82,"name":"real-time"},{"id":56,"name":"robot"},{"id":65,"name":"runtime"},{"id":32,"name":"sdk"},{"id":71,"name":"search"},{"id":63,"name":"secrets"},{"id":25,"name":"security"},{"id":85,"name":"server"},{"id":86,"name":"serverless"},{"id":70,"name":"storage"},{"id":75,"name":"system-design"},{"id":79,"name":"terminal"},{"id":29,"name":"testing"},{"id":12,"name":"ui"},{"id":50,"name":"ux"},{"id":88,"name":"video"},{"id":20,"name":"web-app"},{"id":35,"name":"web-server"},{"id":43,"name":"webassembly"},{"id":69,"name":"workflow"},{"id":87,"name":"yaml"}]" returns me the "expected json"