Repository: hackiftekhar/IQKeyboardManager
Branch: master
Commit: a55dbfc936ce
Files: 158
Total size: 1.1 MB
Directory structure:
gitextract_498hdp8z/
├── .codeclimate.yml
├── .gitattributes
├── .github/
│ ├── FUNDING.yml
│ ├── ISSUE_TEMPLATE/
│ │ ├── bug_report.md
│ │ └── feature_request.md
│ ├── copilot-instructions.md
│ └── pull_request_template.md
├── .gitignore
├── .travis.yml
├── CODE_OF_CONDUCT.md
├── CONTRIBUTING.md
├── Cartfile
├── Cartfile.resolved
├── Documentation/
│ ├── MIGRATION GUIDE 1.0 TO 2.0.md
│ ├── MIGRATION GUIDE 2.0 TO 3.0.md
│ ├── MIGRATION GUIDE 3.0 TO 4.0.md
│ ├── MIGRATION GUIDE 4.0 TO 5.0.md
│ ├── MIGRATION GUIDE 5.0 TO 6.0.md
│ ├── MIGRATION GUIDE 6.0 TO 7.0.md
│ └── MIGRATION GUIDE 7.0 TO 8.0.md
├── Example/
│ ├── .swiftlint.yml
│ ├── IQKeyboardManagerSwiftExample/
│ │ ├── AppDelegate.swift
│ │ ├── Cell/
│ │ │ ├── ColorTableViewCell.swift
│ │ │ ├── ImageSwitchTableViewCell.swift
│ │ │ ├── NavigationTableViewCell.swift
│ │ │ ├── OptionTableViewCell.swift
│ │ │ ├── StepperTableViewCell.swift
│ │ │ ├── SwitchTableViewCell.swift
│ │ │ └── TextFieldTableViewCell.swift
│ │ ├── Extension/
│ │ │ └── UITableView+Extension.swift
│ │ ├── Resources/
│ │ │ ├── Base.lproj/
│ │ │ │ └── InfoPlist.strings
│ │ │ ├── IQKeyboardManagerSwiftExample.entitlements
│ │ │ ├── IQKeyboardManger-Swift-Bridging-Header.h
│ │ │ ├── Images.xcassets/
│ │ │ │ ├── AppIcon.appiconset/
│ │ │ │ │ └── Contents.json
│ │ │ │ ├── Color/
│ │ │ │ │ ├── 171717.colorset/
│ │ │ │ │ │ └── Contents.json
│ │ │ │ │ ├── 3C3C43.colorset/
│ │ │ │ │ │ └── Contents.json
│ │ │ │ │ ├── 404040.colorset/
│ │ │ │ │ │ └── Contents.json
│ │ │ │ │ ├── 535353.colorset/
│ │ │ │ │ │ └── Contents.json
│ │ │ │ │ ├── 757677.colorset/
│ │ │ │ │ │ └── Contents.json
│ │ │ │ │ ├── A1A1A1.colorset/
│ │ │ │ │ │ └── Contents.json
│ │ │ │ │ ├── ABB0BA.colorset/
│ │ │ │ │ │ └── Contents.json
│ │ │ │ │ ├── Contents.json
│ │ │ │ │ ├── D1D2D9.colorset/
│ │ │ │ │ │ └── Contents.json
│ │ │ │ │ ├── DEDEDE.colorset/
│ │ │ │ │ │ └── Contents.json
│ │ │ │ │ ├── EBEDF0.colorset/
│ │ │ │ │ │ └── Contents.json
│ │ │ │ │ └── EBF0F7.colorset/
│ │ │ │ │ └── Contents.json
│ │ │ │ ├── Contents.json
│ │ │ │ ├── IQButtonBarArrowDown.imageset/
│ │ │ │ │ └── Contents.json
│ │ │ │ ├── logo_blue.imageset/
│ │ │ │ │ └── Contents.json
│ │ │ │ ├── logo_brown.imageset/
│ │ │ │ │ └── Contents.json
│ │ │ │ ├── logo_gray.imageset/
│ │ │ │ │ └── Contents.json
│ │ │ │ ├── original1.imageset/
│ │ │ │ │ └── Contents.json
│ │ │ │ └── settings.imageset/
│ │ │ │ └── Contents.json
│ │ │ ├── Info.plist
│ │ │ └── ar.lproj/
│ │ │ └── InfoPlist.strings
│ │ ├── Storyboard/
│ │ │ ├── Base.lproj/
│ │ │ │ ├── FullScreenControllers.storyboard
│ │ │ │ ├── General.storyboard
│ │ │ │ ├── Launch.storyboard
│ │ │ │ ├── Main.storyboard
│ │ │ │ ├── ScrollView.storyboard
│ │ │ │ ├── Settings.storyboard
│ │ │ │ ├── SpecialCase.storyboard
│ │ │ │ └── TestCases.storyboard
│ │ │ └── ar.lproj/
│ │ │ ├── FullScreenControllers.strings
│ │ │ ├── General.strings
│ │ │ ├── Launch.strings
│ │ │ ├── Main.strings
│ │ │ ├── ScrollView.strings
│ │ │ ├── Settings.strings
│ │ │ └── SpecialCase.strings
│ │ └── ViewController/
│ │ ├── AutofillPasswordViewController.swift
│ │ ├── BaseTableViewController.swift
│ │ ├── BaseViewController.swift
│ │ ├── CollectionViewDemoController.swift
│ │ ├── CustomViewController.swift
│ │ ├── EdgesForExtendedLayoutViewController.swift
│ │ ├── EnableMode2000ViewController.swift
│ │ ├── ExampleTableViewController.swift
│ │ ├── ManualToolbarViewController.swift
│ │ ├── NavigationBarViewController.swift
│ │ ├── NavigationController.swift
│ │ ├── NonScrollTextView1979ViewController.swift
│ │ ├── OptionsViewController.swift
│ │ ├── PageViewController.swift
│ │ ├── PopoverViewController.swift
│ │ ├── RefreshLayoutViewController.swift
│ │ ├── ReloadLayout1892ViewController.swift
│ │ ├── SafeAreaViewController.swift
│ │ ├── ScrollViewController.swift
│ │ ├── SearchViewController.swift
│ │ ├── SettingsViewController+TableView.swift
│ │ ├── SettingsViewController.swift
│ │ ├── SpecialCaseViewController.swift
│ │ ├── StackViewController.swift
│ │ ├── TableViewContainerViewController.swift
│ │ ├── TableViewController.swift
│ │ ├── TableViewInContainerViewController.swift
│ │ ├── TestViewController.swift
│ │ ├── TextFieldHostingViewController.swift
│ │ ├── TextFieldView.swift
│ │ ├── TextFieldViewController.swift
│ │ ├── TextSelectionViewController.swift
│ │ ├── TextViewController.swift
│ │ ├── TextViewSpecialCaseViewController.swift
│ │ ├── ViewController.swift
│ │ └── WebViewController.swift
│ ├── IQKeyboardManagerSwiftExample.xcodeproj/
│ │ ├── project.pbxproj
│ │ ├── project.xcworkspace/
│ │ │ ├── contents.xcworkspacedata
│ │ │ └── xcshareddata/
│ │ │ └── IDEWorkspaceChecks.plist
│ │ └── xcshareddata/
│ │ └── xcschemes/
│ │ ├── IQKeyboardManagerSwift.xcscheme
│ │ ├── IQKeyboardManagerSwiftExample.xcscheme
│ │ └── IQKeyboardManagerSwiftExampleExtension.xcscheme
│ ├── IQKeyboardManagerSwiftExample.xcworkspace/
│ │ └── contents.xcworkspacedata
│ ├── IQKeyboardManagerSwiftExampleExtension/
│ │ ├── ActionViewController.swift
│ │ ├── Base.lproj/
│ │ │ └── MainInterface.storyboard
│ │ ├── IQKeyboardManagerSwiftExampleExtension.entitlements
│ │ ├── Info.plist
│ │ └── Media.xcassets/
│ │ ├── Contents.json
│ │ └── TouchBarBezel.colorset/
│ │ └── Contents.json
│ └── Podfile
├── IQKeyboardManagerSwift/
│ ├── Appearance/
│ │ ├── IQKeyboardAppearanceConfiguration.swift
│ │ ├── IQKeyboardAppearanceManager+Internal.swift
│ │ ├── IQKeyboardAppearanceManager.swift
│ │ ├── IQKeyboardManager+Appearance.swift
│ │ └── IQKeyboardManager+Appearance_Deprecated.swift
│ ├── IQKeyboardManager/
│ │ ├── Configuration/
│ │ │ ├── IQActiveConfiguration.swift
│ │ │ ├── IQRootControllerConfiguration.swift
│ │ │ └── IQScrollViewConfiguration.swift
│ │ ├── Debug/
│ │ │ └── IQKeyboardManager+Debug.swift
│ │ ├── Deprecated/
│ │ │ └── IQKeyboardManager+Deprecated.swift
│ │ ├── IQKeyboardManager+ActiveConfiguration.swift
│ │ ├── IQKeyboardManager+Internal.swift
│ │ ├── IQKeyboardManager+Position.swift
│ │ ├── IQKeyboardManager.swift
│ │ ├── IQKeyboardManagerExtension/
│ │ │ ├── UIScrollView+IQKeyboardManagerExtension.swift
│ │ │ ├── UIScrollView+IQKeyboardManagerExtensionObjc.swift
│ │ │ ├── UIView+IQKeyboardManagerExtension.swift
│ │ │ └── UIView+IQKeyboardManagerExtensionObjc.swift
│ │ └── UIKitExtensions/
│ │ ├── UICollectionView+IndexPaths.swift
│ │ ├── UITableView+IndexPaths.swift
│ │ ├── UIView+Parent.swift
│ │ ├── UIView+ParentObjc.swift
│ │ └── UIViewController+ParentContainer.swift
│ ├── IQKeyboardManagerSwift.h
│ ├── IQKeyboardToolbarManager/
│ │ ├── IQKeyboardManager+ToolbarManager.swift
│ │ └── IQKeyboardManager+ToolbarManagerDeprecated.swift
│ ├── PrivacyInfo.xcprivacy
│ └── Resign/
│ ├── IQKeyboardManager+Resign.swift
│ ├── IQKeyboardManager+Resign_Deprecated.swift
│ ├── IQKeyboardResignHandler+Internal.swift
│ ├── IQKeyboardResignHandler.swift
│ └── UIKItExtensions/
│ ├── UIView+Resign.swift
│ └── UIView+ResignObjc.swift
├── IQKeyboardManagerSwift.podspec.json
├── LICENSE.md
├── Package.swift
├── README.md
└── SECURITY.md
================================================
FILE CONTENTS
================================================
================================================
FILE: .codeclimate.yml
================================================
languages:
Objective C: true
Swift: true
exclude_paths:
- "Screenshot/*"
================================================
FILE: .gitattributes
================================================
*.m linguist-detectable=false
================================================
FILE: .github/FUNDING.yml
================================================
github: hackiftekhar
buy_me_a_coffee: hackiftekhar
custom: ["https://www.paypal.me/hackiftekhar"]
================================================
FILE: .github/ISSUE_TEMPLATE/bug_report.md
================================================
---
name: Bug report
about: Create a report to help us improve
title: ''
labels: ''
assignees: ''
---
**Describe the bug**
A clear and concise description of what the bug is.
**To Reproduce**
Steps to reproduce the behavior:
1. Go to '...'
2. Click on '....'
3. Scroll down to '....'
4. See error
**Expected behavior**
A clear and concise description of what you expected to happen.
**Screenshots**
If applicable, add screenshots to help explain your problem.
**Demo Project**
If applicable, add demo project.
### Versions
**Xcode:** x.x
**Mac OS:** xx.xx.x
**Simulator/Device:** xx.x
**Simulator/Device Name:** iPhone xx
**Library Version:** x.x.x
**Additional context**
Add any other context about the problem here.
================================================
FILE: .github/ISSUE_TEMPLATE/feature_request.md
================================================
---
name: Feature request
about: Suggest an idea for this project
title: ''
labels: ''
assignees: ''
---
**Is your feature request related to a problem? Please describe.**
A clear and concise description of what the problem is. Ex. I'm always frustrated when [...]
**Describe the solution you'd like**
A clear and concise description of what you want to happen.
**Describe alternatives you've considered**
A clear and concise description of any alternative solutions or features you've considered.
**Additional context**
Add any other context or screenshots about the feature request here.
================================================
FILE: .github/copilot-instructions.md
================================================
# IQKeyboardManager
IQKeyboardManager is an iOS library available in both Objective-C and Swift versions that provides automatic keyboard management functionality. The library includes comprehensive demo applications and supports CocoaPods, Carthage, and Swift Package Manager.
Always reference these instructions first and fallback to search or bash commands only when you encounter unexpected information that does not match the info here.
## Working Effectively
### Environment Requirements
- **CRITICAL**: This is an iOS-specific library that requires macOS with Xcode for full development
- Minimum Xcode 15 for Demo projects
- Minimum Xcode 13 for library development
- iOS 13.0+ target for both Objective-C and Swift versions
- Swift 5.7+ supported
### Dependency Management and Setup
**ALWAYS** perform these steps in order for fresh repository setup:
1. **Install CocoaPods** (on macOS only):
```bash
gem install cocoapods --user-install
export PATH=$HOME/.local/share/gem/ruby/3.2.0/bin:$PATH
```
2. **Install dependencies** (macOS only - NEVER CANCEL - takes 5-10 minutes):
```bash
cd /path/to/IQKeyboardManager
pod install --repo-update
```
Set timeout to 15+ minutes. This downloads all dependencies including SwiftLint.
**NOTE**: `pod install` fails in sandboxed environments due to network restrictions.
3. **Verify Swift Package Manager dependencies** (works on both macOS and Linux - takes ~2 seconds):
```bash
swift package resolve
```
This resolves all SPM dependencies successfully even on Linux.
4. **Show dependency tree**:
```bash
swift package show-dependencies
```
### Build and Test
**IMPORTANT**: Full builds require macOS with Xcode installed. Linux environments can only validate Swift Package Manager dependency resolution.
#### On macOS with Xcode:
1. **Build Demo Applications** (NEVER CANCEL - takes 10-15 minutes):
```bash
cd /path/to/IQKeyboardManager
xcodebuild -workspace Demo.xcworkspace -scheme DemoSwift -sdk iphonesimulator clean build
xcodebuild -workspace Demo.xcworkspace -scheme DemoObjC -sdk iphonesimulator clean build
```
Set timeout to 30+ minutes for each command.
2. **Run UI Tests** (NEVER CANCEL - takes 15-20 minutes):
```bash
xcodebuild -workspace Demo.xcworkspace -scheme DemoObjC -sdk iphonesimulator -destination 'platform=iOS Simulator,name=iPhone 15,OS=17.0' test
```
Set timeout to 45+ minutes.
#### On Linux (Limited Validation):
- **Dependency resolution works**: `swift package resolve` (takes ~2 seconds)
- **Dependency analysis works**: `swift package show-dependencies`
- **Building FAILS**: `swift build` fails with "no such module 'UIKit'" error (expected)
- **Cannot run simulators or UI tests**
- **CocoaPods may fail** due to network restrictions in sandboxed environments
### Linting and Code Quality
1. **SwiftLint** (macOS only - installed via CocoaPods):
```bash
Pods/SwiftLint/swiftlint
```
**NOTE**: Not available on Linux or when CocoaPods installation fails.
2. **Check formatting** before commits (macOS only):
```bash
Pods/SwiftLint/swiftlint --fix
```
3. **Manual code review** (any platform):
- Review Swift files in `IQKeyboardManagerSwift/`
- Check Objective-C files in `IQKeyboardManager/`
- Verify integration examples in demo apps
## Validation
### Required Manual Testing Scenarios
**ALWAYS** test these scenarios after making changes to keyboard management:
1. **Basic Keyboard Management**:
- Run DemoSwift app in iOS Simulator
- Navigate to "UITextField/UITextView example"
- Tap text fields - verify keyboard shows/hides smoothly
- Verify toolbar appears above keyboard with Previous/Next/Done buttons
- Test scrolling behavior when keyboard appears
- **Validate**: No text fields are obscured by keyboard
2. **Multi-Field Navigation**:
- Use Previous/Next buttons in toolbar to navigate between text fields
- Verify focus moves correctly between fields
- Test with different keyboard types (number pad, email, etc.)
- **Validate**: All fields are accessible via keyboard navigation
3. **Configuration Testing**:
- Open Settings in demo app
- Toggle "Enable IQKeyboardManager" - verify keyboard behavior changes
- Test different toolbar management options
- Verify appearance customization works
- **Validate**: Settings changes take effect immediately
4. **Both Platform Testing**:
- Test identical scenarios in both DemoSwift and DemoObjC apps
- Ensure Objective-C and Swift versions behave identically
- **Validate**: Feature parity between both implementations
5. **Edge Cases**:
- Test with collection views and table views containing text fields
- Test with modal presentations and popovers
- Test device rotation during text input
- **Validate**: Keyboard management works in complex UI scenarios
### CI Validation
The project uses Travis CI (`.travis.yml`) with these validation steps:
```bash
xcodebuild -workspace Demo.xcworkspace -scheme DemoObjC -sdk iphonesimulator
xcodebuild -workspace Demo.xcworkspace -scheme DemoSwift -sdk iphonesimulator
```
**Always** run these commands locally before committing changes.
## Key Project Structure
### Library Files
- `IQKeyboardManager/` - Objective-C version (legacy)
- `IQKeyboardManagerSwift/` - Swift version (current)
- `IQKeyboardManager/` - Core keyboard management
- `Appearance/` - UI appearance customization
- `Resign/` - Keyboard dismissal handling
- `IQKeyboardToolbarManager/` - Toolbar management
### Demo Applications
- `Demo/Swift_Demo/` - Swift demonstration app (45 Swift files)
- `Demo/Objective_C_Demo/` - Objective-C demonstration app (28 Objective-C files)
- `DemoObjCUITests/` - UI test suite
### Dependencies (Swift Package Manager)
The Swift version depends on separate modular libraries:
- IQKeyboardNotification (1.0.5+)
- IQTextInputViewNotification (1.0.8+)
- IQKeyboardToolbarManager (1.1.3+)
- IQKeyboardReturnManager (1.0.5+)
- IQTextView (1.0.5+)
## Platform-Specific Instructions
### macOS Development
- Use Xcode 15+ for demo projects
- Open `Demo.xcworkspace` (NOT `Demo.xcodeproj`)
- Build times: 10-15 minutes for clean builds
- UI test runs: 15-20 minutes
### Linux Development (Limited)
- Can validate Swift Package Manager dependencies only
- Cannot build iOS targets or run simulators
- Use for dependency analysis and non-iOS-specific code review only
## Validated Commands and Timing
### Commands That Work on Any Platform
```bash
# Fast dependency resolution (~2 seconds)
swift package resolve
# Show dependency tree (~1 second)
swift package show-dependencies
# Basic file exploration and structure analysis
find . -name "*.swift" | wc -l # Count Swift files
find . -name "*.m" | wc -l # Count Objective-C files
```
### Commands That Work Only on macOS
```bash
# CocoaPods installation (5-10 minutes)
pod install --repo-update
# Xcode builds (10-15 minutes each)
xcodebuild -workspace Demo.xcworkspace -scheme DemoSwift -sdk iphonesimulator clean build
xcodebuild -workspace Demo.xcworkspace -scheme DemoObjC -sdk iphonesimulator clean build
# UI Tests (15-20 minutes)
xcodebuild -workspace Demo.xcworkspace -scheme DemoObjC -sdk iphonesimulator test
```
### Commands That Fail on Linux (Expected)
```bash
# Fails with "no such module 'UIKit'" error
swift build
# May fail due to network restrictions
pod install --repo-update
```
## Common Tasks
### Repository Structure Overview
```
IQKeyboardManager/
├── README.md (236 lines) - Main documentation
├── CONTRIBUTING.md (52 lines) - Contribution guidelines
├── Package.swift - Swift Package Manager configuration
├── Podfile - CocoaPods configuration for demo apps
├── Demo.xcworkspace - Xcode workspace (use this, not .xcodeproj)
├── IQKeyboardManager/ - Objective-C version (legacy)
├── IQKeyboardManagerSwift/ - Swift version (current)
│ ├── IQKeyboardManager/ - Core keyboard management (~40KB main file)
│ │ ├── Configuration/ - Runtime configuration classes
│ │ ├── Debug/ - Debug utilities
│ │ ├── Deprecated/ - Backward compatibility
│ │ ├── IQKeyboardManagerExtension/ - UIKit extensions
│ │ └── UIKitExtensions/ - Additional UIKit helpers
│ ├── Appearance/ - UI appearance customization
│ ├── Resign/ - Keyboard dismissal handling
│ └── IQKeyboardToolbarManager/ - Toolbar management
├── Demo/
│ ├── Swift_Demo/ - Swift demonstration app (45 Swift files)
│ │ ├── AppDelegate.swift - Shows basic integration
│ │ └── ViewController/ - Various usage examples
│ └── Objective_C_Demo/ - Objective-C demonstration app (28 .m files)
├── DemoObjCUITests/ - UI test suite
└── Documentation/ - Migration guides for major versions
```
### Key Files to Check After Changes
- `IQKeyboardManagerSwift/IQKeyboardManager/IQKeyboardManager.swift` - Main library class
- `Demo/Swift_Demo/AppDelegate.swift` - Basic integration example
- `Demo/Objective_C_Demo/AppDelegate.m` - Objective-C integration example
- Any files in `IQKeyboardManagerSwift/IQKeyboardManagerExtension/` when modifying UIKit behavior
### Basic Usage Integration
**Swift**:
```swift
import IQKeyboardManagerSwift
// In AppDelegate.swift
IQKeyboardManager.shared.isEnabled = true
IQKeyboardManager.shared.enableAutoToolbar = true
```
**Objective-C**:
```objc
#import
// In AppDelegate.m
[[IQKeyboardManager sharedManager] setEnable:YES];
```
### Installation Methods
1. **CocoaPods**: `pod 'IQKeyboardManagerSwift'` or `pod 'IQKeyboardManager'`
2. **Swift Package Manager**: `https://github.com/hackiftekhar/IQKeyboardManager.git`
3. **Carthage**: `github "hackiftekhar/IQKeyboardManager"`
### Documentation Locations
- `Documentation/` - Migration guides for major versions
- `README.md` - Installation and basic usage
- `CONTRIBUTING.md` - Development guidelines
- Demo apps serve as comprehensive usage examples
## Troubleshooting
### Common Issues and Solutions
**"No such module 'UIKit'" error:**
- Expected on Linux - this is an iOS-only library
- Build and test only on macOS with Xcode
**CocoaPods installation fails:**
- Check internet connectivity and firewall restrictions
- Try `pod install --verbose` for detailed error messages
- In sandboxed environments, network access may be limited
**Xcode build fails:**
- Ensure you're opening `Demo.xcworkspace`, not `Demo.xcodeproj`
- Clean build folder: `cmd+shift+k` in Xcode
- Reset simulators if needed
**UI tests fail:**
- Ensure iOS Simulator is available and running
- Check that test devices match requirements (iOS 13.0+)
- Verify simulator has sufficient disk space
## CRITICAL: Timeout and Cancellation Guidelines
### NEVER CANCEL These Commands
Set appropriate timeouts and wait for completion:
**Swift Package Manager (works on any platform):**
- `swift package resolve` - Takes ~2 seconds, set 60 second timeout
- `swift package show-dependencies` - Takes ~1 second, set 30 second timeout
**CocoaPods (macOS only):**
- `pod install --repo-update` - Takes 5-10 minutes, set 15+ minute timeout
- NEVER CANCEL during "Installing" or "Generating Pods project" phases
**Xcode Builds (macOS only):**
- Clean builds: 10-15 minutes, set 30+ minute timeout
- Incremental builds: 2-5 minutes, set 15+ minute timeout
- UI test runs: 15-20 minutes, set 45+ minute timeout
**Expected Command Failures:**
- `swift build` on Linux - WILL FAIL with UIKit error (this is correct)
- `pod install` in restricted networks - MAY FAIL due to network access
### Build Command Examples with Timeouts
```bash
# Swift Package Manager (any platform)
timeout 60 swift package resolve
# CocoaPods (macOS only)
timeout 900 pod install --repo-update # 15 minutes
# Xcode builds (macOS only)
timeout 1800 xcodebuild -workspace Demo.xcworkspace -scheme DemoSwift -sdk iphonesimulator clean build # 30 minutes
timeout 2700 xcodebuild -workspace Demo.xcworkspace -scheme DemoObjC -sdk iphonesimulator test # 45 minutes
```
================================================
FILE: .github/pull_request_template.md
================================================
# Description
Please include a summary of the change and which issue is fixed. Please also include relevant motivation and context. List any dependencies that are required for this change.
Fixes # (issue)
## Type of change
Please delete options that are not relevant.
- [ ] Bug fix (non-breaking change which fixes an issue)
- [ ] New feature (non-breaking change which adds functionality)
- [ ] Breaking change (fix or feature that would cause existing functionality to not work as expected)
- [ ] This change requires a documentation update
================================================
FILE: .gitignore
================================================
# Xcode
build/
*.pbxuser
!default.pbxuser
*.mode1v3
!default.mode1v3
*.mode2v3
!default.mode2v3
*.perspectivev3
!default.perspectivev3
xcuserdata
*.xccheckout
*.moved-aside
DerivedData
*.hmap
*.ipa
*.xcuserstate
#CocoaPods
Pods/
# Carthage
Carthage/Checkouts
Carthage/Build/
# MacOS X
.DS_Store
*.DS_Store
**/.DS_Store
#Swift Package Manager
.build
/.previous-build
*~
\#*
.\#*
*.xcscmblueprint
/default.profraw
Utilities/Docker/*.tar.gz
.swiftpm
Packages/
Package.pins
Package.resolved
================================================
FILE: .travis.yml
================================================
matrix:
include:
- language: objective-c
branches:
only:
- master
os: osx
osx_image: xcode15
xcode_workspace: Demo.xcworkspace
xcode_project: Demo.xcodeproj
xcode_scheme: DemoObjC
before_install:
- sudo gem install activesupport -v 4.2.6
- rvm install 2.3.1
- rvm use 2.3.1
- sudo gem install cocoapods
script:
- xcodebuild -workspace Demo.xcworkspace -scheme DemoObjC -sdk iphonesimulator
- language: swift
branches:
only:
- master
os: osx
osx_image: xcode15
xcode_workspace: Demo.xcworkspace
xcode_project: Demo.xcodeproj
xcode_scheme: DemoSwift
before_install:
- sudo gem install activesupport -v 4.2.6
- rvm install 2.3.1
- rvm use 2.3.1
- sudo gem install cocoapods
script:
- xcodebuild -workspace Demo.xcworkspace -scheme DemoSwift -sdk iphonesimulator
================================================
FILE: CODE_OF_CONDUCT.md
================================================
# Code of Conduct
## 1. Purpose
A primary goal of IQKeyboardManager is to be inclusive to the largest number of contributors, with the most varied and diverse backgrounds possible. As such, we are committed to providing a friendly, safe and welcoming environment for all, regardless of gender, sexual orientation, ability, ethnicity, socioeconomic status, and religion (or lack thereof).
This code of conduct outlines our expectations for all those who participate in our community, as well as the consequences for unacceptable behavior.
We invite all those who participate in IQKeyboardManager to help us create safe and positive experiences for everyone.
## 2. Open Source Citizenship
A supplemental goal of this Code of Conduct is to increase open source citizenship by encouraging participants to recognize and strengthen the relationships between our actions and their effects on our community.
Communities mirror the societies in which they exist and positive action is essential to counteract the many forms of inequality and abuses of power that exist in society.
If you see someone who is making an extra effort to ensure our community is welcoming, friendly, and encourages all participants to contribute to the fullest extent, we want to know.
## 3. Expected Behavior
The following behaviors are expected and requested of all community members:
* Participate in an authentic and active way. In doing so, you contribute to the health and longevity of this community.
* Exercise consideration and respect in your speech and actions.
* Attempt collaboration before conflict.
* Refrain from demeaning, discriminatory, or harassing behavior and speech.
* Be mindful of your surroundings and of your fellow participants. Alert community leaders if you notice a dangerous situation, someone in distress, or violations of this Code of Conduct, even if they seem inconsequential.
* Remember that community event venues may be shared with members of the public; please be respectful to all patrons of these locations.
## 4. Unacceptable Behavior
The following behaviors are considered harassment and are unacceptable within our community:
* Violence, threats of violence or violent language directed against another person.
* Sexist, racist, homophobic, transphobic, ableist or otherwise discriminatory jokes and language.
* Posting or displaying sexually explicit or violent material.
* Posting or threatening to post other people’s personally identifying information ("doxing").
* Personal insults, particularly those related to gender, sexual orientation, race, religion, or disability.
* Inappropriate photography or recording.
* Inappropriate physical contact. You should have someone’s consent before touching them.
* Unwelcome sexual attention. This includes, sexualized comments or jokes; inappropriate touching, groping, and unwelcomed sexual advances.
* Deliberate intimidation, stalking or following (online or in person).
* Advocating for, or encouraging, any of the above behavior.
* Sustained disruption of community events, including talks and presentations.
## 5. Consequences of Unacceptable Behavior
Unacceptable behavior from any community member, including sponsors and those with decision-making authority, will not be tolerated.
Anyone asked to stop unacceptable behavior is expected to comply immediately.
If a community member engages in unacceptable behavior, the community organizers may take any action they deem appropriate, up to and including a temporary ban or permanent expulsion from the community without warning (and without refund in the case of a paid event).
## 6. Reporting Guidelines
If you are subject to or witness unacceptable behavior, or have any other concerns, please notify a community organizer as soon as possible.
hack.iftekhar@gmail.com
Additionally, community organizers are available to help community members engage with local law enforcement or to otherwise help those experiencing unacceptable behavior feel safe. In the context of in-person events, organizers will also provide escorts as desired by the person experiencing distress.
## 7. Addressing Grievances
If you feel you have been falsely or unfairly accused of violating this Code of Conduct, you should notify Hackiftekhar with a concise description of your grievance. Your grievance will be handled in accordance with our existing governing policies.
## 8. Scope
We expect all community participants (contributors, paid or otherwise; sponsors; and other guests) to abide by this Code of Conduct in all community venues–online and in-person–as well as in all one-on-one communications pertaining to community business.
This code of conduct and its related procedures also applies to unacceptable behavior occurring outside the scope of community activities when such behavior has the potential to adversely affect the safety and well-being of community members.
## 9. Contact info
hack.iftekhar@gmail.com
## 10. License and attribution
This Code of Conduct is distributed under a [Creative Commons Attribution-ShareAlike license](http://creativecommons.org/licenses/by-sa/3.0/).
Portions of text derived from the [Django Code of Conduct](https://www.djangoproject.com/conduct/) and the [Geek Feminism Anti-Harassment Policy](http://geekfeminism.wikia.com/wiki/Conference_anti-harassment/Policy).
Retrieved on November 22, 2016 from [http://citizencodeofconduct.org/](http://citizencodeofconduct.org/)
================================================
FILE: CONTRIBUTING.md
================================================
# Contributing to IQKeyboardManager
We love your input! We want to make contributing to this project as easy and transparent as possible, whether it's:
- Reporting a bug
- Discussing the current state of the code
- Submitting a fix
- Proposing new features
## We Develop with Github
We use github to host code, to track issues and feature requests, as well as accept pull requests.
## We Use [Github Flow](https://guides.github.com/introduction/flow/index.html), So All Code Changes Happen Through Pull Requests
Pull requests are the best way to propose changes to the codebase (we use [Github Flow](https://guides.github.com/introduction/flow/index.html)). We actively welcome your pull requests:
1. Fork the repo and create your branch from `master`.
2. If you've changed APIs, update the documentation.
3. Make sure your code lints.
4. Make same changes for Objective-C and Swift version of library.
4. Issue that pull request!
## Any contributions you make will be under the MIT Software License
In short, when you submit code changes, your submissions are understood to be under the same [MIT License](http://choosealicense.com/licenses/mit/) that covers the project. Feel free to contact the maintainers if that's a concern.
## Report bugs using Github's [issues](https://github.com/briandk/transcriptase-atom/issues)
We use GitHub issues to track public bugs. Report a bug by [opening a new issue](); it's that easy!
## Write bug reports with detail, background, and sample code
[This is an example](http://stackoverflow.com/q/12488905/180626) of a bug report. Here's [another example from Craig Hockenberry](http://www.openradar.me/11905408).
**Great Bug Reports** tend to have:
- A quick summary and/or background
- Steps to reproduce
- Be specific!
- Give sample code if you can. [Example stackoverflow question](http://stackoverflow.com/q/12488905/180626) includes sample code that *anyone* with a base R setup can run to reproduce.
- What you expected would happen
- What actually happens
- Notes (possibly including why you think this might be happening, or stuff you tried that didn't work)
People *love* thorough bug reports. I'm not even kidding.
## Use a Consistent Coding Style
I'm again borrowing these from [Facebook's Guidelines](https://github.com/facebook/draft-js/blob/a9316a723f9e918afde44dea68b5f9f39b7d9b00/CONTRIBUTING.md)
* 2 spaces for indentation rather than tabs
* You can try running `npm run lint` for style unification
## License
By contributing, you agree that your contributions will be licensed under its MIT License.
## References
This document was adapted from the open-source contribution guidelines for [Facebook's Draft](https://github.com/facebook/draft-js/blob/a9316a723f9e918afde44dea68b5f9f39b7d9b00/CONTRIBUTING.md)
================================================
FILE: Cartfile
================================================
github "hackiftekhar/IQKeyboardNotification"
github "hackiftekhar/IQTextInputViewNotification"
github "hackiftekhar/IQKeyboardToolbarManager"
github "hackiftekhar/IQKeyboardReturnManager"
github "hackiftekhar/IQTextView"
================================================
FILE: Cartfile.resolved
================================================
github "hackiftekhar/IQKeyboardCore" "1.0.7"
github "hackiftekhar/IQKeyboardNotification" "1.0.5"
github "hackiftekhar/IQKeyboardReturnManager" "1.0.5"
github "hackiftekhar/IQKeyboardToolbar" "1.1.1"
github "hackiftekhar/IQKeyboardToolbarManager" "1.1.1"
github "hackiftekhar/IQTextInputViewNotification" "1.0.8"
github "hackiftekhar/IQTextView" "1.0.5"
================================================
FILE: Documentation/MIGRATION GUIDE 1.0 TO 2.0.md
================================================
IQKeyboardManager MIGRATION GUIDE 1.0 TO 2.0
==========================
### 1. Class Name changed
Old class name
```objc
@interface IQKeyBoardManager : NSObject {
//...
}
```
New Class Name
```objc
@interface IQKeyboardManager : NSObject {
//...
}
```
### 2. Function name changes
Old function and property names
```objc
+(void)installKeyboardManager;
+(void)setTextFieldDistanceFromKeyboard:(CGFloat)distance;
+(void)enableKeyboardManger;
+(void)disableKeyboardManager;
```
New function and property names
```objc
+ (IQKeyboardManager*)sharedManager;
@property(nonatomic, assign) CGFloat keyboardDistanceFromTextField;
@property(nonatomic, assign, getter = isEnabled) BOOL enable;
```
### 3. New features
#### IQKeyboardManager
```objc
@property(nonatomic, assign, getter = isEnableAutoToolbar) BOOL enableAutoToolbar;
@property(nonatomic, assign) IQAutoToolbarManageBehaviour toolbarManageBehaviour;
- (void)resignFirstResponder;
```
- Cocoapods support added
#### UIVIew Category
```objc
- (void)addCancelDoneOnKeyboardWithTarget:(id)target cancelAction:(SEL)cancelAction doneAction:(SEL)doneAction;
```
================================================
FILE: Documentation/MIGRATION GUIDE 2.0 TO 3.0.md
================================================
IQKeyboardManager MIGRATION GUIDE 2.0 TO 3.0
==========================
### 1. New features
#### IQKeyboardManager
```objc
@property(nonatomic, assign) BOOL shouldResignOnTouchOutside;
@property(nonatomic, assign) BOOL shouldShowTextFieldPlaceholder;
@property(nonatomic, assign) BOOL canAdjustTextView;
```
- Cocoapods support added
#### UIVIew Category
```objc
- (void)addDoneOnKeyboardWithTarget:(id)target action:(SEL)action shouldShowPlaceholder:(BOOL)showPlaceholder;
- (void)addCancelDoneOnKeyboardWithTarget:(id)target cancelAction:(SEL)cancelAction doneAction:(SEL)doneAction shouldShowPlaceholder:(BOOL)showPlaceholder;
- (void)addPreviousNextDoneOnKeyboardWithTarget:(id)target previousAction:(SEL)previousAction nextAction:(SEL)nextAction doneAction:(SEL)doneAction shouldShowPlaceholder:(BOOL)showPlaceholder;
```
================================================
FILE: Documentation/MIGRATION GUIDE 3.0 TO 4.0.md
================================================
IQKeyboardManager MIGRATION GUIDE 3.0 TO 4.0
==========================
### 1. New features
New Class
```objc
@interface IQKeyboardReturnKeyHandler : NSObject {
//...
}
-(nonnull instancetype)initWithViewController:(nullable UIViewController*)controller
@property(nullable, nonatomic, weak) id delegate;
@property(nonatomic, assign) UIReturnKeyType lastTextFieldReturnKeyType;
-(void)addTextFieldView:(nonnull UIView*)textFieldView;
-(void)removeTextFieldView:(nonnull UIView*)textFieldView;
-(void)addResponderFromView:(nonnull UIView*)view;
-(void)removeResponderFromView:(nonnull UIView*)view;
@end
```
New Class
```objc
@interface IQTextView : UITextView
@property(nullable, nonatomic,copy) NSString *placeholder;
@end
```
#### IQKeyboardManager
```objc
@property(nonatomic, assign) BOOL preventShowingBottomBlankSpace;
@property(nonatomic, assign) BOOL shouldToolbarUsesTextFieldTintColor;
@property(nullable, nonatomic, strong) UIColor *toolbarTintColor;
@property(nullable, nonatomic, strong) UIImage *toolbarDoneBarButtonItemImage;
@property(nullable, nonatomic, strong) NSString *toolbarDoneBarButtonItemText;
@property(nonatomic, assign) BOOL shouldShowTextFieldPlaceholder;
@property(nullable, nonatomic, strong) UIFont *placeholderFont;
@property(nonatomic, assign) BOOL shouldFixTextViewClip;
@property(nonatomic, assign) BOOL overrideKeyboardAppearance;
@property(nonatomic, assign) UIKeyboardAppearance keyboardAppearance;
@property (nonatomic, readonly) BOOL canGoPrevious;
@property (nonatomic, readonly) BOOL canGoNext;
@property(nonatomic, assign) BOOL shouldPlayInputClicks;
@property(nonatomic, assign) BOOL shouldAdoptDefaultKeyboardAnimation;
@property(nonatomic, assign) BOOL layoutIfNeededOnUpdate;
- (BOOL)goPrevious;
- (BOOL)goNext;
-(void)disableDistanceHandlingInViewControllerClass:(nonnull Class)disabledClass;
-(void)removeDisableDistanceHandlingInViewControllerClass:(nonnull Class)disabledClass;
-( NSSet* _Nonnull )disabledInViewControllerClasses;
-(void)disableToolbarInViewControllerClass:(nonnull Class)toolbarDisabledClass;
-(void)removeDisableToolbarInViewControllerClass:(nonnull Class)toolbarDisabledClass;
-( NSSet* _Nonnull )disabledToolbarInViewControllerClasses;
-(void)considerToolbarPreviousNextInViewClass:(nonnull Class)toolbarPreviousNextConsideredClass;
-(void)removeConsiderToolbarPreviousNextInViewClass:(nonnull Class)toolbarPreviousNextConsideredClass;
-(NSSet* _Nonnull)consideredToolbarPreviousNextViewClasses;
```
#### UIVIew Category
```objc
@property (assign, nonatomic) BOOL shouldHideTitle;
-(void)setCustomPreviousTarget:(nullable id)target action:(nullable SEL)action;
-(void)setCustomNextTarget:(nullable id)target action:(nullable SEL)action;
-(void)setCustomDoneTarget:(nullable id)target action:(nullable SEL)action;
- (void)addRightButtonOnKeyboardWithImage:(nullable UIImage*)image target:(nullable id)target action:(nullable SEL)action titleText:(nullable NSString*)titleText;
- (void)addCancelDoneOnKeyboardWithTarget:(nullable id)target cancelAction:(nullable SEL)cancelAction doneAction:(nullable SEL)doneAction titleText:(nullable NSString*)titleText;
- (void)addLeftRightOnKeyboardWithTarget:(nullable id)target leftButtonTitle:(nullable NSString*)leftButtonTitle rightButtonTitle:(nullable NSString*)rightButtonTitle leftButtonAction:(nullable SEL)leftButtonAction rightButtonAction:(nullable SEL)rightButtonAction titleText:(nullable NSString*)titleText;
- (void)addPreviousNextDoneOnKeyboardWithTarget:(nullable id)target previousAction:(nullable SEL)previousAction nextAction:(nullable SEL)nextAction doneAction:(nullable SEL)doneAction titleText:(nullable NSString*)titleText;
- (void)addPreviousNextRightOnKeyboardWithTarget:(nullable id)target rightButtonTitle:(nullable NSString*)rightButtonTitle previousAction:(nullable SEL)previousAction nextAction:(nullable SEL)nextAction rightButtonAction:(nullable SEL)rightButtonAction titleText:(nullable NSString*)titleText;
```
#### UIVIew Category
```objc
@property (nonatomic, readonly) BOOL isAskingCanBecomeFirstResponder;
@property (nullable, nonatomic, readonly, strong) UIViewController *viewController;
@property (nullable, nonatomic, readonly, strong) UIViewController *topMostController;
-(nullable UIView*)superviewOfClassType:(nonnull Class)classType;
@property (nonatomic, getter=isSearchBarTextField, readonly) BOOL searchBarTextField;
@property (nonatomic, getter=isAlertViewTextField, readonly) BOOL alertViewTextField;
-(CGAffineTransform)convertTransformToView:(nullable UIView*)toView;
```
#### UIScrollView Category
```objc
@property(nonatomic, assign) BOOL shouldRestoreScrollViewContentOffset;
```
#### UIView Category (For UITextField and UITextView)
```objc
@property(nonatomic, assign) CGFloat keyboardDistanceFromTextField;
```
#### UIViewController Category
```objc
@property(nullable, nonatomic, strong) IBOutlet NSLayoutConstraint *IQLayoutGuideConstraint;
```
#### Swift version added
================================================
FILE: Documentation/MIGRATION GUIDE 4.0 TO 5.0.md
================================================
IQKeyboardManager MIGRATION GUIDE 4.0 TO 5.0
==========================
### 1. Removed UIView Category features
```swift
public var isAskingCanBecomeFirstResponder: Bool // This is not necessary now
```
### 1. Removed IQKeyboardManager features
```swift
public var shouldFixTextViewClip = true // These are internally handled, so no more needed
public var canAdjustTextView = false // These are internally handled, so no more needed
public var shouldAdoptDefaultKeyboardAnimation = true // This no longer needed
```
### 2. IQKeyboardManager functions
#### Old IQKeyboardManager functions
```swift
public func disableDistanceHandlingInViewControllerClass(disabledClass : AnyClass)
public func removeDisableDistanceHandlingInViewControllerClass(disabledClass : AnyClass)
public func disabledInViewControllerClassesString() -> Set
public func disableToolbarInViewControllerClass(toolbarDisabledClass : AnyClass)
public func removeDisableToolbarInViewControllerClass(toolbarDisabledClass : AnyClass)
public func disabledToolbarInViewControllerClassesString() -> Set
public func considerToolbarPreviousNextInViewClass(toolbarPreviousNextConsideredClass : AnyClass)
public func removeConsiderToolbarPreviousNextInViewClass(toolbarPreviousNextConsideredClass : AnyClass)
public func consideredToolbarPreviousNextViewClassesString() -> Set
```
#### New IQKeyboardManager functions
```swift
open var disabledDistanceHandlingClasses = [UIViewController.Type]()
open var enabledDistanceHandlingClasses = [UIViewController.Type]()
open var disabledToolbarClasses = [UIViewController.Type]()
open var enabledToolbarClasses = [UIViewController.Type]()
open var toolbarPreviousNextAllowedClasses = [UIView.Type]()
open var disabledTouchResignedClasses = [UIViewController.Type]()
open var enabledTouchResignedClasses = [UIViewController.Type]()
open var touchResignedGestureIgnoreClasses = [UIView.Type]()
```
### 3. UIView Category functions
#### Old UIView Category functions
```swift
public var shouldHideTitle: Bool?
public var drawingPlaceholderText: String?
public func setCustomPreviousTarget(target: AnyObject?, selector: Selector?)
public func setCustomNextTarget(target: AnyObject?, selector: Selector?)
```
#### New UIView Category functions
```swift
public var shouldHidePlaceholderText: Bool
public var keyboardToolbar: IQToolbar
public var shouldHideToolbarPlaceholder: Bool
public var drawingToolbarPlaceholder: String?
open func setTarget(_ target: AnyObject?, action: Selector?) // in IQBarButtonItem
```
### 4. New features
#### IQKeyboardManager
```swift
open var toolbarBarTintColor : UIColor?
open var keyboardShowing: Bool
open var movedDistance: CGFloat
open var enableDebugging = false
open var shouldFixInteractivePopGestureRecognizer = true
open var previousNextDisplayMode = IQPreviousNextDisplayMode.Default
open func reloadInputViews()
open func reloadLayoutIfNeeded()
open func registerAllNotifications()
open func registerTextFieldViewClass(_ aClass: UIView.Type, didBeginEditingNotificationName : String, didEndEditingNotificationName : String)
open func unregisterTextFieldViewClass(_ aClass: UIView.Type, didBeginEditingNotificationName : String, didEndEditingNotificationName : String)
```
#### UIScrollView Category
```swift
public var shouldIgnoreScrollingAdjustment: Bool
```
================================================
FILE: Documentation/MIGRATION GUIDE 5.0 TO 6.0.md
================================================
IQKeyboardManager MIGRATION GUIDE 5.0 TO 6.0
==========================
### 1. IQKeyboardManager functions
#### Old IQKeyboardManager functions
```swift
open class func sharedManager() -> IQKeyboardManager
@objc public class var shared: IQKeyboardManager
```
#### New IQKeyboardManager functions
```swift
```
### 2. UIView Category functions
#### Old UIView Category functions
```swift
public func viewController()->UIViewController?
```
#### New UIView Category functions
```swift
@objc public func viewContainingController()->UIViewController?
```
### 3. New features
#### IQKeyboardManager
```swift
@objc public var placeholderColor: UIColor?
@objc public var placeholderButtonColor: UIColor?
@objc public var canAdjustAdditionalSafeAreaInsets = false
```
#### UIView Category functions
```swift
@objc public var ignoreSwitchingByNextPrevious: Bool
@objc public var shouldResignOnTouchOutsideMode: IQEnableMode
@objc public func parentContainerViewController()->UIViewController?
```
================================================
FILE: Documentation/MIGRATION GUIDE 6.0 TO 7.0.md
================================================
IQKeyboardManager MIGRATION GUIDE 6.0 TO 7.0
==========================
### 1. Removed IQKeyboardManager functions
```swift
@objc public var preventShowingBottomBlankSpace = true
@objc public var shouldFixInteractivePopGestureRecognizer = true
@objc public var canAdjustAdditionalSafeAreaInsets = false
@objc func registerTextFieldViewClass(_ aClass: UIView.Type,
didBeginEditingNotificationName: String,
didEndEditingNotificationName: String)
@objc func unregisterTextFieldViewClass(_ aClass: UIView.Type,
didBeginEditingNotificationName: String,
didEndEditingNotificationName: String)
```
### 2. Removed UIViewController functions
```swift
@IBOutlet @objc public var IQLayoutGuideConstraint: NSLayoutConstraint?
```
### 3. IQKeyboardManager functions
#### Old IQKeyboardManager functions
```swift
@objc var shouldResignOnTouchOutside: Bool
@objc var shouldPlayInputClicks: Bool
@objc var toolbarManageBehaviour: IQAutoToolbarManageBehavior
@objc var shouldToolbarUsesTextFieldTintColor: Bool
@objc var toolbarTintColor: UIColor?
@objc var toolbarBarTintColor: UIColor?
@objc var previousNextDisplayMode: IQPreviousNextDisplayMode
@objc var toolbarPreviousBarButtonItemImage: UIImage?
@objc var toolbarPreviousBarButtonItemText: String?
@objc var toolbarPreviousBarButtonItemAccessibilityLabel: String?
@objc var toolbarNextBarButtonItemImage: UIImage?
@objc var toolbarNextBarButtonItemText: String?
@objc var toolbarNextBarButtonItemAccessibilityLabel: String?
@objc var toolbarDoneBarButtonItemImage: UIImage?
@objc var toolbarDoneBarButtonItemText: String?
@objc var toolbarDoneBarButtonItemAccessibilityLabel: String?
@objc var toolbarTitlBarButtonItemAccessibilityLabel: String?
@objc var shouldShowToolbarPlaceholder: Bool
@objc var placeholderFont: UIFont?
@objc var placeholderColor: UIColor?
@objc var placeholderButtonColor: UIColor?
@objc var overrideKeyboardAppearance: Bool
@objc var keyboardAppearance: UIKeyboardAppearance
@objc func registerKeyboardSizeChange(identifier: AnyHashable, sizeHandler: @escaping SizeBlock)
@objc func unregisterKeyboardSizeChange(identifier: AnyHashable) {}
@objc var keyboardShowing: Bool
@objc var keyboardFrame: CGRect
```
#### New IQKeyboardManager functions
```swift
@objc public var resignOnTouchOutside: Bool
@objc public var playInputClicks: Bool
@objc public let toolbarConfiguration: IQToolbarConfiguration = .init()
/*
toolbarConfiguration.manageBehavior
toolbarConfiguration.useTextFieldTintColor
toolbarConfiguration.tintColor
toolbarConfiguration.barTintColor
toolbarConfiguration.previousNextDisplayMode
*/
@objc public var previousBarButtonConfiguration: IQBarButtonItemConfiguration?
/*
toolbarConfiguration.previousBarButtonConfiguration.image
toolbarConfiguration.previousBarButtonConfiguration.title
toolbarConfiguration.previousBarButtonConfiguration.accessibilityLabel
*/
@objc public var nextBarButtonConfiguration: IQBarButtonItemConfiguration?
/*
toolbarConfiguration.nextBarButtonConfiguration.image
toolbarConfiguration.nextBarButtonConfiguration.title
toolbarConfiguration.nextBarButtonConfiguration.accessibilityLabel
*/
@objc public var doneBarButtonConfiguration: IQBarButtonItemConfiguration?
/*
toolbarConfiguration.doneBarButtonConfiguration.image
toolbarConfiguration.doneBarButtonConfiguration.title
toolbarConfiguration.doneBarButtonConfiguration.accessibilityLabel
*/
@objc public let placeholderConfiguration: IQToolbarPlaceholderConfiguration
/*
toolbarConfiguration.placeholderConfiguration.accessibilityLabel
toolbarConfiguration.placeholderConfiguration.showPlaceholder
toolbarConfiguration.placeholderConfiguration.font
toolbarConfiguration.placeholderConfiguration.color
toolbarConfiguration.placeholderConfiguration.buttonColor
*/
@objc public let keyboardConfiguration: IQKeyboardConfiguration
/*
keyboardConfiguration.overrideAppearance
keyboardConfiguration.appearance
*/
class IQKeyboardListener {
public var keyboardShowing: Bool
public var frame: CGRect
public init()
public func registerSizeChange(identifier: AnyHashable, changeHandler: @escaping SizeCompletion)
public func unregisterSizeChange(identifier: AnyHashable)
}
}
```
### 1. UIScrollView extension functions
#### Old functions
```swift
var shouldIgnoreScrollingAdjustment: Bool
var shouldIgnoreContentInsetAdjustment: Bool
var shouldRestoreScrollViewContentOffset: Bool
```
#### New functions
```swift
var iq: IQKeyboardManagerWrapper
/*
iq.ignoreScrollingAdjustment
iq.ignoreContentInsetAdjustment
iq.restoreContentOffset
*/
```
### 1. UIView extension functions
#### Old functions
```swift
var keyboardDistanceFromTextField: CGFloat
var ignoreSwitchingByNextPrevious: Bool
var enableMode: IQEnableMode
var shouldResignOnTouchOutsideMode: IQEnableMode
```
#### New functions
```swift
var iq: IQKeyboardManagerWrapper
/*
iq.distanceFromKeyboard
iq.ignoreSwitchingByNextPrevious
iq.enableMode
iq.resignOnTouchOutsideMode
*/
```
### 2. UIView extension functions
#### Old UIView extension functions
```swift
func viewContainingController() -> UIViewController?
func topMostController() -> UIViewController?
func parentContainerViewController() -> UIViewController?
func superviewOfClassType(_ classType: UIView.Type, belowView: UIView? = nil) -> UIView?
```
#### New UIView extension functions
```swift
var iq: IQKeyboardManagerWrapper
/*
iq.viewContainingController()
iq.topMostController()
iq.parentContainerViewController()
iq.superviewOf(type:belowView:)
*/
```
### 2. UIView extension functions
#### Old UIView extension functions
```swift
var keyboardToolbar: IQToolbar
var shouldHideToolbarPlaceholder: Bool
var toolbarPlaceholder: String?
var drawingToolbarPlaceholder: String?
func addKeyboardToolbarWithTarget(target: AnyObject?,
titleText: String?,
titleAccessibilityLabel: String? = nil,
rightBarButtonConfiguration: IQBarButtonItemConfiguration?,
previousBarButtonConfiguration: IQBarButtonItemConfiguration? = nil,
nextBarButtonConfiguration: IQBarButtonItemConfiguration? = nil)
```
#### New UIView extension functions
```swift
var iq: IQKeyboardManagerWrapper
/*
iq.toolbar
iq.hidePlaceholder
iq.placeholder
iq.drawingPlaceholder
iq.addToolbar(target:previousConfiguration:nextConfiguration:rightConfiguration:title:titleAccessibilityLabel:)
*/
```
### 2. UIViewController extension functions
#### Old UIViewController extension functions
```swift
open func parentIQContainerViewController() -> UIViewController?
```
#### New UIViewController extension functions
```swift
open func iq_parentContainerViewController() -> UIViewController?
```
### 3. New features
#### IQKeyboardManager
```swift
```
#### UIView Category functions
```swift
@property(nonatomic, assign) BOOL shouldIgnoreContentInsetAdjustment;
@property(nonatomic, assign) IQEnableMode enableMode;
```
#### UIViewController functions
```swift
-(nullable UIViewController*)parentIQContainerViewController;
```
================================================
FILE: Documentation/MIGRATION GUIDE 7.0 TO 8.0.md
================================================
IQKeyboardManager MIGRATION GUIDE 7.0 TO 8.0
==========================
### Keyboard Toolbar
`IQKeyboardManager.shared.enableAutoToolbar` is now default to `false`. Actually it's now part of the `IQKeyboardToolbarManager` library. Due to this change, you may not see the toolbar over keyboard.
- **Solution 1:** Either Add `IQKeyboardManager.shared.enableAutoToolbar = true` in your app delegate
- **Solution 2:** Or Use `IQKeyboardToolbarManager` directly to enable keyboard toolbar using `IQKeyboardToolbarManager.shared.isEnabled = true`
### 1. Features removed (Moved to their own independent libraries)
- All features related to toolbar handling has been moved to `IQKeyboardToolbarManager` [Link](https://github.com/hackiftekhar/IQKeyboardToolbarManager)
- `IQKeyboardListener` [Link](https://github.com/hackiftekhar/IQKeyboardNotification) (Renamed to `IQKeyboardNotification`)
- `IQTextFieldViewListener` [Link](https://github.com/hackiftekhar/IQTextInputViewNotification) (Renamed to `IQTextInputViewNotification`)
- `IQReturnKeyHandler` [Link](https://github.com/hackiftekhar/IQKeyboardReturnManager) (Renamed to `IQKeyboardReturnManager`)
- `IQKeyboardToolbar` [Link](https://github.com/hackiftekhar/IQKeyboardToolbar)
- `IQTextView` [Link](https://github.com/hackiftekhar/IQTextView)
### 2. Features moved to IQKeyboardToolbarManager
- `IQPreviousNextView` class (Renamed to `IQDeepResponderContainerView`)
If you are using `IQPreviousNextView` in your storyboard then you have to change the class to `IQDeepResponderContainerView` and also have to change the module to `IQKeyboardToolbarManager`.
- `IQToolbarConfiguration` class (Renamed to `IQKeyboardToolbarConfiguration`)
- `IQToolbarPlaceholderConfiguration` class (Renamed to `IQKeyboardToolbarPlaceholderConfiguration`)
- `public enum IQAutoToolbarManageBehavior: Int`
- `public enum IQPreviousNextDisplayMode: Int`
- `IQBarButtonItemConfiguration` class
```swift
// These were part of IQKeyboardManager
var enableAutoToolbar: Bool (Renamed to `isEnabled`)
var toolbarConfiguration: IQToolbarConfiguration
var playInputClicks: Bool
var disabledToolbarClasses: [UIViewController.Type]
var enabledToolbarClasses: [UIViewController.Type]
var deepResponderAllowedContainerClasses: [UIView.Type]
var canGoPrevious: Bool
var canGoNext: Bool
func goPrevious() -> Bool
func goNext() -> Bool
func reloadInputViews()
```
```swift
// UITextField/UITextView extensions, This can be used like textField.iq.ignoreSwitchingByNextPrevious = true
var ignoreSwitchingByNextPrevious: Bool
```
### 3. Features moved to IQKeyboardToolbar
- `IQToolbar` class (Renamed to `IQKeyboardToolbar`)
- `IQToolbarConfiguration` class (Renamed to `IQKeyboardToolbarConfiguration`)
- `IQToolbarPlaceholderConfiguration` class (Renamed to `IQKeyboardToolbarPlaceholderConfiguration`)
- `IQBarButtonItemConfiguration` class
- `IQTitleBarButtonItem` class
- `IQBarButtonItem` class
- `IQInvocation` class
- `IQPlaceholderable` protocol
```swift
// UITextField/UITextView extensions, This can be used like textField.iq.hidePlaceholder = true
var toolbar: IQToolbar
var hidePlaceholder: Bool
var placeholder: String?
var drawingPlaceholder: String?
func addToolbar(target: AnyObject?,
previousConfiguration: IQBarButtonItemConfiguration? = nil,
nextConfiguration: IQBarButtonItemConfiguration? = nil,
rightConfiguration: IQBarButtonItemConfiguration? = nil,
title: String?,
titleAccessibilityLabel: String? = nil)
func addDone(...)
func addRightButton(...)
func addRightLeft(...)
func addPreviousNextRight(...)
func addPreviousNextDone(...)
```
### 1. Features moved to subspecs (Cocoapods)
- `IQKeyboardManagerSwift/Appearance`
```swift
// IQKeyboardManager
public var overrideAppearance: Bool
public var appearance: UIKeyboardAppearance
```
- `IQKeyboardManagerSwift/IQKeyboardReturnManager`
```swift
// https://github.com/hackiftekhar/IQKeyboardReturnManager
- This subspec add `IQKeyboardReturnManager` as dependency for easier migration.
```
- `IQKeyboardManagerSwift/IQKeyboardToolbarManager`
```swift
// https://github.com/hackiftekhar/IQKeyboardToolbarManager
- This subspec add `IQKeyboardToolbarManager` as dependency for easier migration.
```
- `IQKeyboardManagerSwift/IQTextView`
```swift
// https://github.com/hackiftekhar/IQTextView
- This subspec add `IQTextView` as dependency for easier migration.
```
- `IQKeyboardManagerSwift/Resign`
```swift
// IQKeyboardManager
var resignOnTouchOutside: Bool
var resignGesture: UITapGestureRecognizer
var disabledTouchResignedClasses: [UIViewController.Type]
var enabledTouchResignedClasses: [UIViewController.Type]
var touchResignedGestureIgnoreClasses: [UIView.Type]
func resignFirstResponder() -> Bool
```
```swift
// UITextField/UITextView extensions, This can be used like textField.iq.resignOnTouchOutsideMode = .default
var resignOnTouchOutsideMode: IQEnableMode
```
================================================
FILE: Example/.swiftlint.yml
================================================
excluded:
- Pods
================================================
FILE: Example/IQKeyboardManagerSwiftExample/AppDelegate.swift
================================================
//
// AppDelegate.swift
// https://github.com/hackiftekhar/IQKeyboardManager
// Copyright (c) 2013-24 Iftekhar Qurashi.
//
// Permission is hereby granted, free of charge, to any person obtaining a copy
// of this software and associated documentation files (the "Software"), to deal
// in the Software without restriction, including without limitation the rights
// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
// copies of the Software, and to permit persons to whom the Software is
// furnished to do so, subject to the following conditions:
//
// The above copyright notice and this permission notice shall be included in
// all copies or substantial portions of the Software.
//
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
// THE SOFTWARE.
import UIKit
import IQKeyboardManagerSwift
import IQKeyboardToolbarManager
@main
class AppDelegate: UIResponder, UIApplicationDelegate {
var window: UIWindow?
func application(_ application: UIApplication,
didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
// Override point for customization after application launch.
window?.backgroundColor = UIColor.white
IQKeyboardManager.shared.isEnabled = true
IQKeyboardManager.shared.isDebuggingEnabled = true
IQKeyboardToolbarManager.shared.isEnabled = true
IQKeyboardToolbarManager.shared.isDebuggingEnabled = true
return true
}
func applicationWillResignActive(_ application: UIApplication) {
}
func applicationDidEnterBackground(_ application: UIApplication) {
}
func applicationWillEnterForeground(_ application: UIApplication) {
}
func applicationDidBecomeActive(_ application: UIApplication) {
}
func applicationWillTerminate(_ application: UIApplication) {
}
}
================================================
FILE: Example/IQKeyboardManagerSwiftExample/Cell/ColorTableViewCell.swift
================================================
//
// ColorTableViewCell.swift
// https://github.com/hackiftekhar/IQKeyboardManager
// Copyright (c) 2013-24 Iftekhar Qurashi.
//
// Permission is hereby granted, free of charge, to any person obtaining a copy
// of this software and associated documentation files (the "Software"), to deal
// in the Software without restriction, including without limitation the rights
// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
// copies of the Software, and to permit persons to whom the Software is
// furnished to do so, subject to the following conditions:
//
// The above copyright notice and this permission notice shall be included in
// all copies or substantial portions of the Software.
//
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
// THE SOFTWARE.
import UIKit
class ColorTableViewCell: UITableViewCell {
@IBOutlet var labelTitle: UILabel!
@IBOutlet var labelSubtitle: UILabel!
@IBOutlet var selectedColorView: UIView!
}
================================================
FILE: Example/IQKeyboardManagerSwiftExample/Cell/ImageSwitchTableViewCell.swift
================================================
//
// ImageSwitchTableViewCell.swift
// https://github.com/hackiftekhar/IQKeyboardManager
// Copyright (c) 2013-24 Iftekhar Qurashi.
//
// Permission is hereby granted, free of charge, to any person obtaining a copy
// of this software and associated documentation files (the "Software"), to deal
// in the Software without restriction, including without limitation the rights
// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
// copies of the Software, and to permit persons to whom the Software is
// furnished to do so, subject to the following conditions:
//
// The above copyright notice and this permission notice shall be included in
// all copies or substantial portions of the Software.
//
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
// THE SOFTWARE.
import UIKit
class ImageSwitchTableViewCell: SwitchTableViewCell {
@IBOutlet var arrowImageView: UIImageView!
}
================================================
FILE: Example/IQKeyboardManagerSwiftExample/Cell/NavigationTableViewCell.swift
================================================
//
// NavigationTableViewCell.swift
// https://github.com/hackiftekhar/IQKeyboardManager
// Copyright (c) 2013-24 Iftekhar Qurashi.
//
// Permission is hereby granted, free of charge, to any person obtaining a copy
// of this software and associated documentation files (the "Software"), to deal
// in the Software without restriction, including without limitation the rights
// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
// copies of the Software, and to permit persons to whom the Software is
// furnished to do so, subject to the following conditions:
//
// The above copyright notice and this permission notice shall be included in
// all copies or substantial portions of the Software.
//
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
// THE SOFTWARE.
import UIKit
class NavigationTableViewCell: UITableViewCell {
@IBOutlet var labelTitle: UILabel!
@IBOutlet var labelSubtitle: UILabel!
}
================================================
FILE: Example/IQKeyboardManagerSwiftExample/Cell/OptionTableViewCell.swift
================================================
//
// OptionTableViewCell.swift
// https://github.com/hackiftekhar/IQKeyboardManager
// Copyright (c) 2013-24 Iftekhar Qurashi.
//
// Permission is hereby granted, free of charge, to any person obtaining a copy
// of this software and associated documentation files (the "Software"), to deal
// in the Software without restriction, including without limitation the rights
// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
// copies of the Software, and to permit persons to whom the Software is
// furnished to do so, subject to the following conditions:
//
// The above copyright notice and this permission notice shall be included in
// all copies or substantial portions of the Software.
//
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
// THE SOFTWARE.
import UIKit
class OptionTableViewCell: UITableViewCell {
@IBOutlet var labelOption: UILabel!
}
================================================
FILE: Example/IQKeyboardManagerSwiftExample/Cell/StepperTableViewCell.swift
================================================
//
// StepperTableViewCell.swift
// https://github.com/hackiftekhar/IQKeyboardManager
// Copyright (c) 2013-24 Iftekhar Qurashi.
//
// Permission is hereby granted, free of charge, to any person obtaining a copy
// of this software and associated documentation files (the "Software"), to deal
// in the Software without restriction, including without limitation the rights
// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
// copies of the Software, and to permit persons to whom the Software is
// furnished to do so, subject to the following conditions:
//
// The above copyright notice and this permission notice shall be included in
// all copies or substantial portions of the Software.
//
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
// THE SOFTWARE.
import UIKit
class StepperTableViewCell: UITableViewCell {
@IBOutlet var labelTitle: UILabel!
@IBOutlet var labelSubtitle: UILabel!
@IBOutlet var stepper: UIStepper!
@IBOutlet var labelStepperValue: UILabel!
}
================================================
FILE: Example/IQKeyboardManagerSwiftExample/Cell/SwitchTableViewCell.swift
================================================
//
// SwitchTableViewCell.swift
// https://github.com/hackiftekhar/IQKeyboardManager
// Copyright (c) 2013-24 Iftekhar Qurashi.
//
// Permission is hereby granted, free of charge, to any person obtaining a copy
// of this software and associated documentation files (the "Software"), to deal
// in the Software without restriction, including without limitation the rights
// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
// copies of the Software, and to permit persons to whom the Software is
// furnished to do so, subject to the following conditions:
//
// The above copyright notice and this permission notice shall be included in
// all copies or substantial portions of the Software.
//
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
// THE SOFTWARE.
import UIKit
class SwitchTableViewCell: UITableViewCell {
@IBOutlet var labelTitle: UILabel!
@IBOutlet var labelSubtitle: UILabel!
@IBOutlet var switchEnable: UISwitch!
}
================================================
FILE: Example/IQKeyboardManagerSwiftExample/Cell/TextFieldTableViewCell.swift
================================================
//
// TextFieldTableViewCell.swift
// https://github.com/hackiftekhar/IQKeyboardManager
// Copyright (c) 2013-24 Iftekhar Qurashi.
//
// Permission is hereby granted, free of charge, to any person obtaining a copy
// of this software and associated documentation files (the "Software"), to deal
// in the Software without restriction, including without limitation the rights
// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
// copies of the Software, and to permit persons to whom the Software is
// furnished to do so, subject to the following conditions:
//
// The above copyright notice and this permission notice shall be included in
// all copies or substantial portions of the Software.
//
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
// THE SOFTWARE.
import UIKit
class TextFieldTableViewCell: UITableViewCell {
@IBOutlet var labelTitle: UILabel!
@IBOutlet var labelSubtitle: UILabel!
@IBOutlet var textField: UITextField!
}
================================================
FILE: Example/IQKeyboardManagerSwiftExample/Extension/UITableView+Extension.swift
================================================
//
// UITableView+Extension.swift
// https://github.com/hackiftekhar/IQKeyboardManager
// Copyright (c) 2013-24 Iftekhar Qurashi.
//
// Permission is hereby granted, free of charge, to any person obtaining a copy
// of this software and associated documentation files (the "Software"), to deal
// in the Software without restriction, including without limitation the rights
// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
// copies of the Software, and to permit persons to whom the Software is
// furnished to do so, subject to the following conditions:
//
// The above copyright notice and this permission notice shall be included in
// all copies or substantial portions of the Software.
//
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
// THE SOFTWARE.
import UIKit
extension UITableView {
func dequeueCell(_: T.Type, for indexPath: IndexPath) -> T {
let identifier: String = String(describing: T.self)
guard let cell = dequeueReusableCell(withIdentifier: identifier, for: indexPath) as? T else {
fatalError("Could not dequeue \(T.self)")
}
return cell
}
func dequeueHeaderFooter(_: T.Type) -> T {
let identifier: String = String(describing: T.self)
if let view = dequeueReusableHeaderFooterView(withIdentifier: identifier) as? T {
return view
} else {
return T(reuseIdentifier: identifier)
}
}
}
================================================
FILE: Example/IQKeyboardManagerSwiftExample/Resources/Base.lproj/InfoPlist.strings
================================================
/* Localized versions of Info.plist keys */
================================================
FILE: Example/IQKeyboardManagerSwiftExample/Resources/IQKeyboardManagerSwiftExample.entitlements
================================================
com.apple.security.app-sandbox
com.apple.security.network.client
================================================
FILE: Example/IQKeyboardManagerSwiftExample/Resources/IQKeyboardManger-Swift-Bridging-Header.h
================================================
//
// IQKeyboardManger-Swift-Bridging-Header.h
// https://github.com/hackiftekhar/IQKeyboardManager
// Copyright (c) 2013-24 Iftekhar Qurashi.
//
// Permission is hereby granted, free of charge, to any person obtaining a copy
// of this software and associated documentation files (the "Software"), to deal
// in the Software without restriction, including without limitation the rights
// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
// copies of the Software, and to permit persons to whom the Software is
// furnished to do so, subject to the following conditions:
//
// The above copyright notice and this permission notice shall be included in
// all copies or substantial portions of the Software.
//
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
// THE SOFTWARE.
#ifndef IQKeyboardManager_IQKeyboardManger_Swift_Bridging_Header_h_h
#define IQKeyboardManager_IQKeyboardManger_Swift_Bridging_Header_h_h
#endif
================================================
FILE: Example/IQKeyboardManagerSwiftExample/Resources/Images.xcassets/AppIcon.appiconset/Contents.json
================================================
{
"images" : [
{
"filename" : "logo_blue.jpeg",
"idiom" : "universal",
"platform" : "ios",
"size" : "1024x1024"
}
],
"info" : {
"author" : "xcode",
"version" : 1
}
}
================================================
FILE: Example/IQKeyboardManagerSwiftExample/Resources/Images.xcassets/Color/171717.colorset/Contents.json
================================================
{
"colors" : [
{
"color" : {
"color-space" : "srgb",
"components" : {
"alpha" : "1.000",
"blue" : "0x17",
"green" : "0x17",
"red" : "0x17"
}
},
"idiom" : "universal"
}
],
"info" : {
"author" : "xcode",
"version" : 1
}
}
================================================
FILE: Example/IQKeyboardManagerSwiftExample/Resources/Images.xcassets/Color/3C3C43.colorset/Contents.json
================================================
{
"colors" : [
{
"color" : {
"color-space" : "srgb",
"components" : {
"alpha" : "1.000",
"blue" : "0x43",
"green" : "0x3C",
"red" : "0x3C"
}
},
"idiom" : "universal"
}
],
"info" : {
"author" : "xcode",
"version" : 1
}
}
================================================
FILE: Example/IQKeyboardManagerSwiftExample/Resources/Images.xcassets/Color/404040.colorset/Contents.json
================================================
{
"colors" : [
{
"color" : {
"color-space" : "srgb",
"components" : {
"alpha" : "1.000",
"blue" : "0x40",
"green" : "0x40",
"red" : "0x40"
}
},
"idiom" : "universal"
}
],
"info" : {
"author" : "xcode",
"version" : 1
}
}
================================================
FILE: Example/IQKeyboardManagerSwiftExample/Resources/Images.xcassets/Color/535353.colorset/Contents.json
================================================
{
"colors" : [
{
"color" : {
"color-space" : "srgb",
"components" : {
"alpha" : "1.000",
"blue" : "0x53",
"green" : "0x53",
"red" : "0x53"
}
},
"idiom" : "universal"
}
],
"info" : {
"author" : "xcode",
"version" : 1
}
}
================================================
FILE: Example/IQKeyboardManagerSwiftExample/Resources/Images.xcassets/Color/757677.colorset/Contents.json
================================================
{
"colors" : [
{
"color" : {
"color-space" : "srgb",
"components" : {
"alpha" : "1.000",
"blue" : "0x77",
"green" : "0x76",
"red" : "0x75"
}
},
"idiom" : "universal"
}
],
"info" : {
"author" : "xcode",
"version" : 1
}
}
================================================
FILE: Example/IQKeyboardManagerSwiftExample/Resources/Images.xcassets/Color/A1A1A1.colorset/Contents.json
================================================
{
"colors" : [
{
"color" : {
"color-space" : "srgb",
"components" : {
"alpha" : "1.000",
"blue" : "0xA1",
"green" : "0xA1",
"red" : "0xA1"
}
},
"idiom" : "universal"
}
],
"info" : {
"author" : "xcode",
"version" : 1
}
}
================================================
FILE: Example/IQKeyboardManagerSwiftExample/Resources/Images.xcassets/Color/ABB0BA.colorset/Contents.json
================================================
{
"colors" : [
{
"color" : {
"color-space" : "srgb",
"components" : {
"alpha" : "1.000",
"blue" : "0xBA",
"green" : "0xB0",
"red" : "0xAB"
}
},
"idiom" : "universal"
}
],
"info" : {
"author" : "xcode",
"version" : 1
}
}
================================================
FILE: Example/IQKeyboardManagerSwiftExample/Resources/Images.xcassets/Color/Contents.json
================================================
{
"info" : {
"author" : "xcode",
"version" : 1
}
}
================================================
FILE: Example/IQKeyboardManagerSwiftExample/Resources/Images.xcassets/Color/D1D2D9.colorset/Contents.json
================================================
{
"colors" : [
{
"color" : {
"color-space" : "srgb",
"components" : {
"alpha" : "1.000",
"blue" : "0xD9",
"green" : "0xD2",
"red" : "0xD1"
}
},
"idiom" : "universal"
}
],
"info" : {
"author" : "xcode",
"version" : 1
}
}
================================================
FILE: Example/IQKeyboardManagerSwiftExample/Resources/Images.xcassets/Color/DEDEDE.colorset/Contents.json
================================================
{
"colors" : [
{
"color" : {
"color-space" : "srgb",
"components" : {
"alpha" : "1.000",
"blue" : "0xDE",
"green" : "0xDE",
"red" : "0xDE"
}
},
"idiom" : "universal"
}
],
"info" : {
"author" : "xcode",
"version" : 1
}
}
================================================
FILE: Example/IQKeyboardManagerSwiftExample/Resources/Images.xcassets/Color/EBEDF0.colorset/Contents.json
================================================
{
"colors" : [
{
"color" : {
"color-space" : "srgb",
"components" : {
"alpha" : "1.000",
"blue" : "0xF0",
"green" : "0xED",
"red" : "0xEB"
}
},
"idiom" : "universal"
}
],
"info" : {
"author" : "xcode",
"version" : 1
}
}
================================================
FILE: Example/IQKeyboardManagerSwiftExample/Resources/Images.xcassets/Color/EBF0F7.colorset/Contents.json
================================================
{
"colors" : [
{
"color" : {
"color-space" : "srgb",
"components" : {
"alpha" : "1.000",
"blue" : "0xF7",
"green" : "0xF0",
"red" : "0xEB"
}
},
"idiom" : "universal"
}
],
"info" : {
"author" : "xcode",
"version" : 1
}
}
================================================
FILE: Example/IQKeyboardManagerSwiftExample/Resources/Images.xcassets/Contents.json
================================================
{
"info" : {
"author" : "xcode",
"version" : 1
}
}
================================================
FILE: Example/IQKeyboardManagerSwiftExample/Resources/Images.xcassets/IQButtonBarArrowDown.imageset/Contents.json
================================================
{
"images" : [
{
"idiom" : "universal",
"scale" : "1x"
},
{
"idiom" : "universal",
"filename" : "IQButtonBarArrowDown@2x.png",
"scale" : "2x"
},
{
"idiom" : "universal",
"filename" : "IQButtonBarArrowDown@3x.png",
"scale" : "3x"
}
],
"info" : {
"version" : 1,
"author" : "xcode"
}
}
================================================
FILE: Example/IQKeyboardManagerSwiftExample/Resources/Images.xcassets/logo_blue.imageset/Contents.json
================================================
{
"images" : [
{
"filename" : "logo_blue.jpeg",
"idiom" : "universal"
}
],
"info" : {
"author" : "xcode",
"version" : 1
}
}
================================================
FILE: Example/IQKeyboardManagerSwiftExample/Resources/Images.xcassets/logo_brown.imageset/Contents.json
================================================
{
"images" : [
{
"filename" : "logo_brown.jpeg",
"idiom" : "universal"
}
],
"info" : {
"author" : "xcode",
"version" : 1
}
}
================================================
FILE: Example/IQKeyboardManagerSwiftExample/Resources/Images.xcassets/logo_gray.imageset/Contents.json
================================================
{
"images" : [
{
"filename" : "logo_gray.png",
"idiom" : "universal"
}
],
"info" : {
"author" : "xcode",
"version" : 1
}
}
================================================
FILE: Example/IQKeyboardManagerSwiftExample/Resources/Images.xcassets/original1.imageset/Contents.json
================================================
{
"images" : [
{
"filename" : "original1.png",
"idiom" : "universal",
"scale" : "1x"
},
{
"idiom" : "universal",
"scale" : "2x"
},
{
"idiom" : "universal",
"scale" : "3x"
}
],
"info" : {
"author" : "xcode",
"version" : 1
}
}
================================================
FILE: Example/IQKeyboardManagerSwiftExample/Resources/Images.xcassets/settings.imageset/Contents.json
================================================
{
"images" : [
{
"idiom" : "universal",
"scale" : "1x"
},
{
"idiom" : "universal",
"filename" : "settings@2x.png",
"scale" : "2x"
},
{
"idiom" : "universal",
"scale" : "3x"
}
],
"info" : {
"version" : 1,
"author" : "xcode"
}
}
================================================
FILE: Example/IQKeyboardManagerSwiftExample/Resources/Info.plist
================================================
CFBundleDevelopmentRegion
en
CFBundleDisplayName
IQKB Swift
CFBundleExecutable
$(EXECUTABLE_NAME)
CFBundleIdentifier
$(PRODUCT_BUNDLE_IDENTIFIER)
CFBundleInfoDictionaryVersion
6.0
CFBundleName
$(PRODUCT_NAME)
CFBundlePackageType
FMWK
CFBundleShortVersionString
$(MARKETING_VERSION)
CFBundleSignature
????
CFBundleVersion
$(CURRENT_PROJECT_VERSION)
LSRequiresIPhoneOS
UILaunchStoryboardName
Launch
UIMainStoryboardFile
Main
UIStatusBarHidden
UIStatusBarStyle
UISupportedInterfaceOrientations
UIInterfaceOrientationPortrait
UIInterfaceOrientationLandscapeLeft
UIInterfaceOrientationLandscapeRight
UIInterfaceOrientationPortraitUpsideDown
UIUserInterfaceStyle
Light
UIViewControllerBasedStatusBarAppearance
================================================
FILE: Example/IQKeyboardManagerSwiftExample/Resources/ar.lproj/InfoPlist.strings
================================================
/* Localized versions of Info.plist keys */
================================================
FILE: Example/IQKeyboardManagerSwiftExample/Storyboard/Base.lproj/FullScreenControllers.storyboard
================================================
Lorem ipsum dolor sit er elit lamet, consectetaur cillium adipisicing pecu, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Nam liber te conscient to factor tum poen legum odioque civiuda. Lorem ipsum dolor sit er elit lamet, consectetaur cillium adipisicing pecu, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Nam liber te conscient to factor tum poen legum odioque civiuda. Lorem ipsum dolor sit er elit lamet, consectetaur cillium adipisicing pecu, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Nam liber te conscient to factor tum poen legum odioque civiuda.
================================================
FILE: Example/IQKeyboardManagerSwiftExample/Storyboard/Base.lproj/General.storyboard
================================================
2 There are also nice optional features allowing you to customize the distance from the text field, add the next/previous done button as a keyboard UIToolbar, play sounds when the user navigations through the form and more. Lorem ipsum dolor sit er elit lamet, consectetaur cillium adipisicing pecu, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Nam liber te conscient to factor tum poen legum odioque civiuda. Lorem ipsum dolor sit er elit lamet, consectetaur cillium adipisicing pecu, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Nam liber te conscient to factor tum poen legum odioque civiuda. Lorem ipsum dolor sit er elit lamet, consectetaur cillium adipisicing pecu, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Nam liber te conscient to factor tum poen legum odioque civiuda.
If you do not want to add any UIToolbar on a textField, just set ablank UIView as it's inputAccessoryView
textField.inputAcessoryView = [[UIView alloc] init];
`IQKeyboardManager` allows you to prevent issues of the keyboard sliding up and covering a text field without needing you to enter any code.
Lorem ipsum dolor sit er elit lamet, consectetaur cillium adipisicing pecu, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Nam liber te conscient to factor tum poen legum odioque civiuda. Lorem ipsum dolor sit er elit lamet, consectetaur cillium adipisicing pecu, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Nam liber te conscient to factor tum poen legum odioque civiuda. Lorem ipsum dolor sit er elit lamet, consectetaur cillium adipisicing pecu, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Nam liber te conscient to factor tum poen legum odioque civiuda.
One of the Speciality of this Library is `It Works Automatically`.
Lorem ipsum dolor sit er elit lamet, consectetaur cillium adipisicing pecu, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Nam liber te conscient to factor tum poen legum odioque civiuda. Lorem ipsum dolor sit er elit lamet, consectetaur cillium adipisicing pecu, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Nam liber te conscient to factor tum poen legum odioque civiuda. Lorem ipsum dolor sit er elit lamet, consectetaur cillium adipisicing pecu, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Nam liber te conscient to factor tum poen legum odioque civiuda.
`IQKeyboardManager` works on all orientations, and with the toolbar.
Lorem ipsum dolor sit er elit lamet, consectetaur cillium adipisicing pecu, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Nam liber te conscient to factor tum poen legum odioque civiuda. Lorem ipsum dolor sit er elit lamet, consectetaur cillium adipisicing pecu, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Nam liber te conscient to factor tum poen legum odioque civiuda. Lorem ipsum dolor sit er elit lamet, consectetaur cillium adipisicing pecu, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Nam liber te conscient to factor tum poen legum odioque civiuda.
`ZERO LINE OF CODE`, `No More imports`, `No More Subclasses`, `No More Manual Work`.
Lorem ipsum dolor sit er elit lamet, consectetaur cillium adipisicing pecu, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Nam liber te conscient to factor tum poen legum odioque civiuda. Lorem ipsum dolor sit er elit lamet, consectetaur cillium adipisicing pecu, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Nam liber te conscient to factor tum poen legum odioque civiuda. Lorem ipsum dolor sit er elit lamet, consectetaur cillium adipisicing pecu, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Nam liber te conscient to factor tum poen legum odioque civiuda.
To use `IQKeyboardManager` you simply need to add the framework to your project or add the source files to your project.
Lorem ipsum dolor sit er elit lamet, consectetaur cillium adipisicing pecu, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Nam liber te conscient to factor tum poen legum odioque civiuda. Lorem ipsum dolor sit er elit lamet, consectetaur cillium adipisicing pecu, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Nam liber te conscient to factor tum poen legum odioque civiuda. Lorem ipsum dolor sit er elit lamet, consectetaur cillium adipisicing pecu, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Nam liber te conscient to factor tum poen legum odioque civiuda.
================================================
FILE: Example/IQKeyboardManagerSwiftExample/Storyboard/Base.lproj/Launch.storyboard
================================================
================================================
FILE: Example/IQKeyboardManagerSwiftExample/Storyboard/Base.lproj/Main.storyboard
================================================
- enable
- shouldToolbarUsesTextFieldTintColor
- keyboardDistanceFromTextField
- shouldShowToolbarPlaceholder
- placeholderFont
- keyboardDistanceFromTextField (Category)
- IQTextView (Class)
- setCustomPreviousTarget: action: (Category)
- setCustomNextTarget: action: (Category)
- setCustomDoneTarget: action: (Category)
- enableAutoToolbar
- toolbarManageBehaviour
- overrideKeyboardAppearance
- keyboardAppearance
- shouldResignOnTouchOutside
- IQKeyboardReturnKeyHandler (Class)
- shouldHideToolbarPlaceholder (Category)
- toolbarPlaceholder (Category)
- toolbarTintColor
- toolbarDoneBarButtonItemImage
- toolbarDoneBarButtonItemText
- addPreviousNextDoneOnKeyboardWithTarget: previousAction: nextAction: doneAction:
- addDoneOnKeyboardWithTarget: action:
- Use Toolbar title as button to do something special
- disabledDistanceHandlingClasses
- enabledDistanceHandlingClasses
- disabledToolbarClasses
- enabledToolbarClasses
- toolbarPreviousNextAllowedClasses
- disabledTouchResignedClasses
- enabledTouchResignedClasses
- shouldRestoreScrollViewContentOffset
A UITableView as a child of UIViewController embedded in the storyboard using a container view.
IQKeyboardManager doesn't affet UITableViewController default scrolling implementation. UITableViewController class automatically resizes and repositions its table view when there is in-line editing of text fields
================================================
FILE: Example/IQKeyboardManagerSwiftExample/Storyboard/Base.lproj/ScrollView.storyboard
================================================
EENvbnRhaW5lcg
If you want to always show UINavigationBar, then change the UIView class to UIScrollView. Note that if scrollView.scrollEnabled = NO then library ignore scrollView and behave like as there is no scrollView in the middle
Lorem ipsum dolor sit er elit lamet, consectetaur cillium adipisicing pecu, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Nam liber te conscient to factor tum poen legum odioque civiuda. Lorem ipsum dolor sit er elit lamet, consectetaur cillium adipisicing pecu, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Nam liber te conscient to factor tum poen legum odioque civiuda. Lorem ipsum dolor sit er elit lamet, consectetaur cillium adipisicing pecu, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Nam liber te conscient to factor tum poen legum odioque civiuda.
Lorem ipsum dolor sit er elit lamet, consectetaur cillium adipisicing pecu, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Nam liber te conscient to factor tum poen legum odioque civiuda. Lorem ipsum dolor sit er elit lamet, consectetaur cillium adipisicing pecu, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Nam liber te conscient to factor tum poen legum odioque civiuda. Lorem ipsum dolor sit er elit lamet, consectetaur cillium adipisicing pecu, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Nam liber te conscient to factor tum poen legum odioque civiuda.
Lorem ipsum dolor sit er elit lamet, consectetaur cillium adipisicing pecu, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Nam liber te conscient to factor tum poen legum odioque civiuda. Lorem ipsum dolor sit er elit lamet, consectetaur cillium adipisicing pecu, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Nam liber te conscient to factor tum poen legum odioque civiuda. Lorem ipsum dolor sit er elit lamet, consectetaur cillium adipisicing pecu, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Nam liber te conscient to factor tum poen legum odioque civiuda.
Lorem ipsum dolor sit er elit lamet, consectetaur cillium adipisicing pecu, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Nam liber te conscient to factor tum poen legum odioque civiuda. Lorem ipsum dolor sit er elit lamet, consectetaur cillium adipisicing pecu, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Nam liber te conscient to factor tum poen legum odioque civiuda. Lorem ipsum dolor sit er elit lamet, consectetaur cillium adipisicing pecu, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Nam liber te conscient to factor tum poen legum odioque civiuda.
Lorem ipsum dolor sit er elit lamet, consectetaur cillium adipisicing pecu, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Nam liber te conscient to factor tum poen legum odioque civiuda. Lorem ipsum dolor sit er elit lamet, consectetaur cillium adipisicing pecu, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Nam liber te conscient to factor tum poen legum odioque civiuda. Lorem ipsum dolor sit er elit lamet, consectetaur cillium adipisicing pecu, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Nam liber te conscient to factor tum poen legum odioque civiuda.
Lorem ipsum dolor sit er elit lamet, consectetaur cillium adipisicing pecu, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Nam liber te conscient to factor tum poen legum odioque civiuda. Lorem ipsum dolor sit er elit lamet, consectetaur cillium adipisicing pecu, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Nam liber te conscient to factor tum poen legum odioque civiuda. Lorem ipsum dolor sit er elit lamet, consectetaur cillium adipisicing pecu, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Nam liber te conscient to factor tum poen legum odioque civiuda.
Lorem ipsum dolor sit er elit lamet, consectetaur cillium adipisicing pecu, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Nam liber te conscient to factor tum poen legum odioque civiuda. Lorem ipsum dolor sit er elit lamet, consectetaur cillium adipisicing pecu, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Nam liber te conscient to factor tum poen legum odioque civiuda. Lorem ipsum dolor sit er elit lamet, consectetaur cillium adipisicing pecu, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Nam liber te conscient to factor tum poen legum odioque civiuda.
Lorem ipsum dolor sit er elit lamet, consectetaur cillium adipisicing pecu, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Nam liber te conscient to factor tum poen legum odioque civiuda. Lorem ipsum dolor sit er elit lamet, consectetaur cillium adipisicing pecu, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Nam liber te conscient to factor tum poen legum odioque civiuda. Lorem ipsum dolor sit er elit lamet, consectetaur cillium adipisicing pecu, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Nam liber te conscient to factor tum poen legum odioque civiuda.
================================================
FILE: Example/IQKeyboardManagerSwiftExample/Storyboard/Base.lproj/Settings.storyboard
================================================
================================================
FILE: Example/IQKeyboardManagerSwiftExample/Storyboard/Base.lproj/SpecialCase.storyboard
================================================
TextField enabled. Long Text Test, Long Text Test, Long Text Test, Long Text Test, Long Text Test, Long Text Test, Long Text Test, Long Text Test, Long Text Test, Long Text Test, Long Text Test, Long Text Test, Long Text Test, Long Text Test, Long Text Test, Long Text Test,
Lorem ipsum dolor sit er elit lamet, consectetaur cillium adipisicing pecu, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Nam liber te conscient to factor tum poen legum odioque civiuda.
================================================
FILE: Example/IQKeyboardManagerSwiftExample/Storyboard/Base.lproj/TestCases.storyboard
================================================
Lorem ipsum dolor sit er elit lamet, consectetaur cillium adipisicing pecu, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Nam liber te conscient to factor tum poen legum odioque civiuda.
a
a
a
a
a
a
a
a
b
b
b
b
b
b
c
c
c
cc
c
c
cc
c
c
d
c
e
e
e
e
e
e
ef
ff
ff
f
f
f
Lorem ipsum dolor sit er elit lamet, consectetaur cillium adipisicing pecu, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Nam liber te conscient to factor tum poen legum odioque civiuda.
================================================
FILE: Example/IQKeyboardManagerSwiftExample/Storyboard/ar.lproj/FullScreenControllers.strings
================================================
/* Class = "UINavigationItem"; title = "UISearchController"; ObjectID = "4DZ-MZ-qyC"; */
"4DZ-MZ-qyC.title" = "UISearchController";
/* Class = "UITextView"; text = "Lorem ipsum dolor sit er elit lamet, consectetaur cillium adipisicing pecu, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Nam liber te conscient to factor tum poen legum odioque civiuda. Lorem ipsum dolor sit er elit lamet, consectetaur cillium adipisicing pecu, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Nam liber te conscient to factor tum poen legum odioque civiuda. Lorem ipsum dolor sit er elit lamet, consectetaur cillium adipisicing pecu, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Nam liber te conscient to factor tum poen legum odioque civiuda. "; ObjectID = "50p-P4-9dL"; */
"50p-P4-9dL.text" = "Lorem ipsum dolor sit er elit lamet, consectetaur cillium adipisicing pecu, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Nam liber te conscient to factor tum poen legum odioque civiuda. Lorem ipsum dolor sit er elit lamet, consectetaur cillium adipisicing pecu, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Nam liber te conscient to factor tum poen legum odioque civiuda. Lorem ipsum dolor sit er elit lamet, consectetaur cillium adipisicing pecu, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Nam liber te conscient to factor tum poen legum odioque civiuda. ";
/* Class = "UINavigationItem"; title = "TextViewController"; ObjectID = "WU4-It-O6g"; */
"WU4-It-O6g.title" = "TextViewController";
================================================
FILE: Example/IQKeyboardManagerSwiftExample/Storyboard/ar.lproj/General.strings
================================================
/* Class = "UITextView"; text = "Can set keyboard and textFiled distance"; ObjectID = "0xQ-D1-B5M"; */
"0xQ-D1-B5M.text" = "Can set keyboard and textFiled distance";
/* Class = "UITextView"; text = "`IQKeyboardManager` works on all orientations, and with the toolbar.\n \n Lorem ipsum dolor sit er elit lamet, consectetaur cillium adipisicing pecu, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Nam liber te conscient to factor tum poen legum odioque civiuda. Lorem ipsum dolor sit er elit lamet, consectetaur cillium adipisicing pecu, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Nam liber te conscient to factor tum poen legum odioque civiuda. Lorem ipsum dolor sit er elit lamet, consectetaur cillium adipisicing pecu, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Nam liber te conscient to factor tum poen legum odioque civiuda. "; ObjectID = "2d0-tG-Pzx"; */
"2d0-tG-Pzx.text" = "`IQKeyboardManager` works on all orientations, and with the toolbar.\n \n Lorem ipsum dolor sit er elit lamet, consectetaur cillium adipisicing pecu, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Nam liber te conscient to factor tum poen legum odioque civiuda. Lorem ipsum dolor sit er elit lamet, consectetaur cillium adipisicing pecu, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Nam liber te conscient to factor tum poen legum odioque civiuda. Lorem ipsum dolor sit er elit lamet, consectetaur cillium adipisicing pecu, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Nam liber te conscient to factor tum poen legum odioque civiuda. ";
/* Class = "UILabel"; text = "Customised keyboardDistanceFromTextField = 150"; ObjectID = "6fq-Kb-dPm"; */
"6fq-Kb-dPm.text" = "Customised keyboardDistanceFromTextField = 150";
/* Class = "UIButton"; normalTitle = "Present"; ObjectID = "8D8-Vm-PL6"; */
"8D8-Vm-PL6.normalTitle" = "Present";
/* Class = "UINavigationItem"; title = "Manual UIToolbar"; ObjectID = "Bsk-WG-eqv"; */
"Bsk-WG-eqv.title" = "Manual UIToolbar";
/* Class = "UITextView"; text = "can adjust textView's height when it is too big to fit on screen"; ObjectID = "Inj-lY-mEU"; */
"Inj-lY-mEU.text" = "can adjust textView's height when it is too big to fit on screen";
/* Class = "UITextField"; placeholder = "Device Orientation support"; ObjectID = "Kdq-Kn-JCR"; */
"Kdq-Kn-JCR.placeholder" = "Device Orientation support";
/* Class = "UITextView"; text = "`IQKeyboardManager` allows you to prevent issues of the keyboard sliding up and covering a text field without needing you to enter any code.\n \n Lorem ipsum dolor sit er elit lamet, consectetaur cillium adipisicing pecu, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Nam liber te conscient to factor tum poen legum odioque civiuda. Lorem ipsum dolor sit er elit lamet, consectetaur cillium adipisicing pecu, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Nam liber te conscient to factor tum poen legum odioque civiuda. Lorem ipsum dolor sit er elit lamet, consectetaur cillium adipisicing pecu, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Nam liber te conscient to factor tum poen legum odioque civiuda. "; ObjectID = "L8v-ua-y0A"; */
"L8v-ua-y0A.text" = "`IQKeyboardManager` allows you to prevent issues of the keyboard sliding up and covering a text field without needing you to enter any code.\n \n Lorem ipsum dolor sit er elit lamet, consectetaur cillium adipisicing pecu, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Nam liber te conscient to factor tum poen legum odioque civiuda. Lorem ipsum dolor sit er elit lamet, consectetaur cillium adipisicing pecu, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Nam liber te conscient to factor tum poen legum odioque civiuda. Lorem ipsum dolor sit er elit lamet, consectetaur cillium adipisicing pecu, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Nam liber te conscient to factor tum poen legum odioque civiuda. ";
/* Class = "UITextView"; text = "To use `IQKeyboardManager` you simply need to add the framework to your project or add the source files to your project.\n \n Lorem ipsum dolor sit er elit lamet, consectetaur cillium adipisicing pecu, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Nam liber te conscient to factor tum poen legum odioque civiuda. Lorem ipsum dolor sit er elit lamet, consectetaur cillium adipisicing pecu, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Nam liber te conscient to factor tum poen legum odioque civiuda. Lorem ipsum dolor sit er elit lamet, consectetaur cillium adipisicing pecu, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Nam liber te conscient to factor tum poen legum odioque civiuda. "; ObjectID = "LEb-Ei-7Sx"; */
"LEb-Ei-7Sx.text" = "To use `IQKeyboardManager` you simply need to add the framework to your project or add the source files to your project.\n \n Lorem ipsum dolor sit er elit lamet, consectetaur cillium adipisicing pecu, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Nam liber te conscient to factor tum poen legum odioque civiuda. Lorem ipsum dolor sit er elit lamet, consectetaur cillium adipisicing pecu, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Nam liber te conscient to factor tum poen legum odioque civiuda. Lorem ipsum dolor sit er elit lamet, consectetaur cillium adipisicing pecu, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Nam liber te conscient to factor tum poen legum odioque civiuda. ";
/* Class = "UIButton"; normalTitle = "Push"; ObjectID = "OBL-N5-MlD"; */
"OBL-N5-MlD.normalTitle" = "Push";
/* Class = "UINavigationItem"; title = "UITextView"; ObjectID = "Qen-Wv-SxX"; */
"Qen-Wv-SxX.title" = "UITextView";
/* Class = "UILabel"; text = "This textField customise toolbar titile to use as UIButton"; ObjectID = "R4y-qs-Tiw"; */
"R4y-qs-Tiw.text" = "This textField customise toolbar titile to use as UIButton";
/* Class = "UITextField"; placeholder = "Easiest integration"; ObjectID = "Rr4-Yx-SRn"; */
"Rr4-Yx-SRn.placeholder" = "Easiest integration";
/* Class = "UIButton"; normalTitle = "Push"; ObjectID = "Tt5-47-EvZ"; */
"Tt5-47-EvZ.normalTitle" = "Push";
/* Class = "UITextView"; text = "2 There are also nice optional features allowing you to customize the distance from the text field, add the next/previous done button as a keyboard UIToolbar, play sounds when the user navigations through the form and more. Lorem ipsum dolor sit er elit lamet, consectetaur cillium adipisicing pecu, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Nam liber te conscient to factor tum poen legum odioque civiuda. Lorem ipsum dolor sit er elit lamet, consectetaur cillium adipisicing pecu, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Nam liber te conscient to factor tum poen legum odioque civiuda. Lorem ipsum dolor sit er elit lamet, consectetaur cillium adipisicing pecu, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Nam liber te conscient to factor tum poen legum odioque civiuda. "; ObjectID = "Zjk-gc-QEr"; */
"Zjk-gc-QEr.text" = "2 There are also nice optional features allowing you to customize the distance from the text field, add the next/previous done button as a keyboard UIToolbar, play sounds when the user navigations through the form and more. Lorem ipsum dolor sit er elit lamet, consectetaur cillium adipisicing pecu, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Nam liber te conscient to factor tum poen legum odioque civiuda. Lorem ipsum dolor sit er elit lamet, consectetaur cillium adipisicing pecu, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Nam liber te conscient to factor tum poen legum odioque civiuda. Lorem ipsum dolor sit er elit lamet, consectetaur cillium adipisicing pecu, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Nam liber te conscient to factor tum poen legum odioque civiuda. ";
/* Class = "UITextField"; text = "3"; ObjectID = "ai2-LR-bIl"; */
"ai2-LR-bIl.text" = "3";
/* Class = "UITextField"; text = "1"; ObjectID = "dET-Cl-VUb"; */
"dET-Cl-VUb.text" = "1";
/* Class = "UITextField"; placeholder = "Enter Username"; ObjectID = "dQK-Ms-QYa"; */
"dQK-Ms-QYa.placeholder" = "Enter Username";
/* Class = "UILabel"; text = "This is IQTextView with placeholder support"; ObjectID = "eGW-E3-wza"; */
"eGW-E3-wza.text" = "This is IQTextView with placeholder support";
/* Class = "UITextField"; placeholder = "UITextField Category for Keyboard"; ObjectID = "f9i-hv-EJj"; */
"f9i-hv-EJj.placeholder" = "UITextField Category for Keyboard";
/* Class = "UITextView"; text = "`ZERO LINE OF CODE`, `No More imports`, `No More Subclasses`, `No More Manual Work`.\n \n Lorem ipsum dolor sit er elit lamet, consectetaur cillium adipisicing pecu, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Nam liber te conscient to factor tum poen legum odioque civiuda. Lorem ipsum dolor sit er elit lamet, consectetaur cillium adipisicing pecu, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Nam liber te conscient to factor tum poen legum odioque civiuda. Lorem ipsum dolor sit er elit lamet, consectetaur cillium adipisicing pecu, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Nam liber te conscient to factor tum poen legum odioque civiuda. "; ObjectID = "m72-tJ-oyd"; */
"m72-tJ-oyd.text" = "`ZERO LINE OF CODE`, `No More imports`, `No More Subclasses`, `No More Manual Work`.\n \n Lorem ipsum dolor sit er elit lamet, consectetaur cillium adipisicing pecu, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Nam liber te conscient to factor tum poen legum odioque civiuda. Lorem ipsum dolor sit er elit lamet, consectetaur cillium adipisicing pecu, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Nam liber te conscient to factor tum poen legum odioque civiuda. Lorem ipsum dolor sit er elit lamet, consectetaur cillium adipisicing pecu, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Nam liber te conscient to factor tum poen legum odioque civiuda. ";
/* Class = "UILabel"; text = "If you do not want to add any UIToolbar on a textField, just set ablank UIView as it's inputAccessoryView\n \n textField.inputAcessoryView = [[UIView alloc] init];"; ObjectID = "oB6-a2-0nS"; */
"oB6-a2-0nS.text" = "If you do not want to add any UIToolbar on a textField, just set ablank UIView as it's inputAccessoryView\n \n textField.inputAcessoryView = [[UIView alloc] init];";
/* Class = "UITextView"; text = "One of the Speciality of this Library is `It Works Automatically`.\n \n Lorem ipsum dolor sit er elit lamet, consectetaur cillium adipisicing pecu, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Nam liber te conscient to factor tum poen legum odioque civiuda. Lorem ipsum dolor sit er elit lamet, consectetaur cillium adipisicing pecu, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Nam liber te conscient to factor tum poen legum odioque civiuda. Lorem ipsum dolor sit er elit lamet, consectetaur cillium adipisicing pecu, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Nam liber te conscient to factor tum poen legum odioque civiuda. "; ObjectID = "rUI-UY-dtz"; */
"rUI-UY-dtz.text" = "One of the Speciality of this Library is `It Works Automatically`.\n \n Lorem ipsum dolor sit er elit lamet, consectetaur cillium adipisicing pecu, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Nam liber te conscient to factor tum poen legum odioque civiuda. Lorem ipsum dolor sit er elit lamet, consectetaur cillium adipisicing pecu, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Nam liber te conscient to factor tum poen legum odioque civiuda. Lorem ipsum dolor sit er elit lamet, consectetaur cillium adipisicing pecu, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Nam liber te conscient to factor tum poen legum odioque civiuda. ";
/* Class = "UILabel"; text = "This textField observes custom prev/next/done selector"; ObjectID = "s35-Qq-Nsv"; */
"s35-Qq-Nsv.text" = "This textField observes custom prev/next/done selector";
/* Class = "UINavigationItem"; title = "TextField Demo"; ObjectID = "s8z-5e-RBK"; */
"s8z-5e-RBK.title" = "TextField Demo";
/* Class = "UIButton"; normalTitle = "Present"; ObjectID = "uNE-Wh-GsT"; */
"uNE-Wh-GsT.normalTitle" = "Present";
/* Class = "UITextView"; text = "Can resign on touching outside"; ObjectID = "wIC-LZ-asw"; */
"wIC-LZ-asw.text" = "Can resign on touching outside";
/* Class = "UITextField"; placeholder = "Customize InputView support"; ObjectID = "z7r-JB-8xa"; */
"z7r-JB-8xa.placeholder" = "Customize InputView support";
================================================
FILE: Example/IQKeyboardManagerSwiftExample/Storyboard/ar.lproj/Launch.strings
================================================
/* Class = "UILabel"; text = "IQKeyboardManager
Swift"; ObjectID = "8Gp-lr-M5c"; */
"8Gp-lr-M5c.text" = "IQKeyboardManager
Swift";
================================================
FILE: Example/IQKeyboardManagerSwiftExample/Storyboard/ar.lproj/Main.strings
================================================
/* Class = "UILabel"; text = "Full Screen TextViewController"; ObjectID = "29q-7C-AJL"; */
"29q-7C-AJL.text" = "Full Screen TextViewController";
/* Class = "UILabel"; text = "- registerTextFieldViewClass: didBeginEditingNotificationName: didEndEditingNotificationName"; ObjectID = "3xx-A5-U5p"; */
"3xx-A5-U5p.text" = "- registerTextFieldViewClass: didBeginEditingNotificationName: didEndEditingNotificationName";
/* Class = "UILabel"; text = "UITableViewController"; ObjectID = "47J-01-GaW"; */
"47J-01-GaW.text" = "UITableViewController";
/* Class = "UILabel"; text = "UITableView"; ObjectID = "4tu-ej-glw"; */
"4tu-ej-glw.text" = "UITableView";
/* Class = "UILabel"; text = "UICollectionView example"; ObjectID = "5G2-JX-PU5"; */
"5G2-JX-PU5.text" = "UICollectionView example";
/* Class = "UILabel"; text = "Text Selection #56"; ObjectID = "5Sl-ZO-6OH"; */
"5Sl-ZO-6OH.text" = "Text Selection #56";
/* Class = "UILabel"; text = "StackView"; ObjectID = "686-2k-7Sa"; */
"686-2k-7Sa.text" = "StackView";
/* Class = "UITableViewSection"; headerTitle = "UIScrollView & it's subclasses example"; ObjectID = "6Y6-J2-kBv"; */
"6Y6-J2-kBv.headerTitle" = "UIScrollView & it's subclasses example";
/* Class = "UILabel"; text = "UIStackView example in iOS9"; ObjectID = "7nn-db-1QM"; */
"7nn-db-1QM.text" = "UIStackView example in iOS9";
/* Class = "UILabel"; text = "WKWebView example"; ObjectID = "8XY-A5-dnk"; */
"8XY-A5-dnk.text" = "WKWebView example";
/* Class = "UILabel"; text = "Refreshing Layout on the fly"; ObjectID = "C0s-kb-Bl8"; */
"C0s-kb-Bl8.text" = "Refreshing Layout on the fly";
/* Class = "UILabel"; text = "- (void)reloadLayoutIfNeeded"; ObjectID = "Dzz-bo-Ft8"; */
"Dzz-bo-Ft8.text" = "- (void)reloadLayoutIfNeeded";
/* Class = "UILabel"; text = "NavigationBar & Toolbar"; ObjectID = "F3P-4I-j2h"; */
"F3P-4I-j2h.text" = "NavigationBar & Toolbar";
/* Class = "UITableViewSection"; headerTitle = "Full Screen"; ObjectID = "GLu-hg-zhP"; */
"GLu-hg-zhP.headerTitle" = "Full Screen";
/* Class = "UILabel"; text = "UIPageViewController"; ObjectID = "Gc8-g0-sng"; */
"Gc8-g0-sng.text" = "UIPageViewController";
/* Class = "UILabel"; text = "UITableView in Container"; ObjectID = "JTC-NP-c0d"; */
"JTC-NP-c0d.text" = "UITableView in Container";
/* Class = "UILabel"; text = "UITableView inside UIScrollView"; ObjectID = "JUG-pm-L0a"; */
"JUG-pm-L0a.text" = "UITableView inside UIScrollView";
/* Class = "UILabel"; text = "- enableAutoToolbar
- toolbarManageBehaviour
- overrideKeyboardAppearance
- keyboardAppearance
- shouldResignOnTouchOutside
- IQKeyboardReturnKeyHandler (Class)
- shouldHideToolbarPlaceholder (Category)
- toolbarPlaceholder (Category)
- toolbarTintColor
- toolbarDoneBarButtonItemImage
- toolbarDoneBarButtonItemText"; ObjectID = "KuD-1z-36f"; */
"KuD-1z-36f.text" = "- enableAutoToolbar
- toolbarManageBehaviour
- overrideKeyboardAppearance
- keyboardAppearance
- shouldResignOnTouchOutside
- IQKeyboardReturnKeyHandler (Class)
- shouldHideToolbarPlaceholder (Category)
- toolbarPlaceholder (Category)
- toolbarTintColor
- toolbarDoneBarButtonItemImage
- toolbarDoneBarButtonItemText";
/* Class = "UILabel"; text = "Text Selection"; ObjectID = "WIY-wJ-lgq"; */
"WIY-wJ-lgq.text" = "Text Selection";
/* Class = "UILabel"; text = "Popover"; ObjectID = "XnQ-PR-MXs"; */
"XnQ-PR-MXs.text" = "Popover";
/* Class = "UILabel"; text = "- disabledDistanceHandlingClasses
- enabledDistanceHandlingClasses
- disabledToolbarClasses
- enabledToolbarClasses
- toolbarPreviousNextAllowedClasses
- disabledTouchResignedClasses\n- enabledTouchResignedClasses"; ObjectID = "YB6-DC-bfI"; */
"YB6-DC-bfI.text" = "- disabledDistanceHandlingClasses
- enabledDistanceHandlingClasses
- disabledToolbarClasses
- enabledToolbarClasses
- toolbarPreviousNextAllowedClasses
- disabledTouchResignedClasses\n- enabledTouchResignedClasses";
/* Class = "UILabel"; text = "CustomView example"; ObjectID = "ask-lD-56a"; */
"ask-lD-56a.text" = "CustomView example";
/* Class = "UILabel"; text = "Navigate next/prev in collectionView"; ObjectID = "bC5-7g-33X"; */
"bC5-7g-33X.text" = "Navigate next/prev in collectionView";
/* Class = "UILabel"; text = "IQKeyboardManager doesn't affet UITableViewController default scrolling implementation. UITableViewController class automatically resizes and repositions its table view when there is in-line editing of text fields"; ObjectID = "dVp-ny-Wn7"; */
"dVp-ny-Wn7.text" = "IQKeyboardManager doesn't affet UITableViewController default scrolling implementation. UITableViewController class automatically resizes and repositions its table view when there is in-line editing of text fields";
/* Class = "UILabel"; text = "- UISearchBar, UIAlertView, UITextField within different UIView"; ObjectID = "dYe-IU-fRj"; */
"dYe-IU-fRj.text" = "- UISearchBar, UIAlertView, UITextField within different UIView";
/* Class = "UILabel"; text = "- shouldRestoreScrollViewContentOffset
A UITableView as a child of UIViewController embedded in the storyboard using a container view."; ObjectID = "ed7-8b-Ck4"; */
"ed7-8b-Ck4.text" = "- shouldRestoreScrollViewContentOffset
A UITableView as a child of UIViewController embedded in the storyboard using a container view.";
/* Class = "UITableViewSection"; headerTitle = "Library Properties"; ObjectID = "fYv-iE-p8L"; */
"fYv-iE-p8L.headerTitle" = "Library Properties";
/* Class = "UILabel"; text = "UITextView ContentInset adjustment"; ObjectID = "fsu-LW-S6P"; */
"fsu-LW-S6P.text" = "UITextView ContentInset adjustment";
/* Class = "UILabel"; text = "- TextViewController using IQLayoutGuide"; ObjectID = "gQK-gD-yCA"; */
"gQK-gD-yCA.text" = "- TextViewController using IQLayoutGuide";
/* Class = "UILabel"; text = "Special Cases"; ObjectID = "hSl-CV-20a"; */
"hSl-CV-20a.text" = "Special Cases";
/* Class = "UILabel"; text = "UITextField, UITextView inside UITableView"; ObjectID = "hfZ-RB-s53"; */
"hfZ-RB-s53.text" = "UITextField, UITextView inside UITableView";
/* Class = "UILabel"; text = "UISearchController"; ObjectID = "ira-UX-Ixl"; */
"ira-UX-Ixl.text" = "UISearchController";
/* Class = "UILabel"; text = "UITextField/UITextView example"; ObjectID = "itr-sp-j54"; */
"itr-sp-j54.text" = "UITextField/UITextView example";
/* Class = "UILabel"; text = "- enable
- shouldToolbarUsesTextFieldTintColor
- keyboardDistanceFromTextField
- shouldShowToolbarPlaceholder
- placeholderFont
- keyboardDistanceFromTextField (Category)
- IQTextView (Class)
- setCustomPreviousTarget: action: (Category)
- setCustomNextTarget: action: (Category)
- setCustomDoneTarget: action: (Category)"; ObjectID = "ko2-SX-mJs"; */
"ko2-SX-mJs.text" = "- enable
- shouldToolbarUsesTextFieldTintColor
- keyboardDistanceFromTextField
- shouldShowToolbarPlaceholder
- placeholderFont
- keyboardDistanceFromTextField (Category)
- IQTextView (Class)
- setCustomPreviousTarget: action: (Category)
- setCustomNextTarget: action: (Category)
- setCustomDoneTarget: action: (Category)";
/* Class = "UILabel"; text = "Search Controller"; ObjectID = "sfy-kL-TLi"; */
"sfy-kL-TLi.text" = "Search Controller";
/* Class = "UITableViewSection"; headerTitle = "Others"; ObjectID = "t68-ki-Vqj"; */
"t68-ki-Vqj.headerTitle" = "Others";
/* Class = "UINavigationItem"; title = "IQKeyboardManagerSwift"; ObjectID = "tP6-QK-Jl8"; */
"tP6-QK-Jl8.title" = "IQKeyboardManagerSwift";
/* Class = "UILabel"; text = "- addPreviousNextDoneOnKeyboardWithTarget: previousAction: nextAction: doneAction:
- addDoneOnKeyboardWithTarget: action:
- Use Toolbar title as button to do something special"; ObjectID = "wqF-JW-cmz"; */
"wqF-JW-cmz.text" = "- addPreviousNextDoneOnKeyboardWithTarget: previousAction: nextAction: doneAction:
- addDoneOnKeyboardWithTarget: action:
- Use Toolbar title as button to do something special";
/* Class = "UILabel"; text = "Manual UIToolbar + No UIToolbar"; ObjectID = "xCu-GT-OP1"; */
"xCu-GT-OP1.text" = "Manual UIToolbar + No UIToolbar";
/* Class = "UILabel"; text = "UIScrollView+UITableView example"; ObjectID = "xTK-Wa-4qX"; */
"xTK-Wa-4qX.text" = "UIScrollView+UITableView example";
/* Class = "UILabel"; text = "- Doesn't affect WKWebView default scrolling implementation"; ObjectID = "zU8-4C-nid"; */
"zU8-4C-nid.text" = "- Doesn't affect WKWebView default scrolling implementation";
================================================
FILE: Example/IQKeyboardManagerSwiftExample/Storyboard/ar.lproj/ScrollView.strings
================================================
/* Class = "UINavigationItem"; title = "UIScrollView Example"; ObjectID = "1XW-VW-7XA"; */
"1XW-VW-7XA.title" = "UIScrollView Example";
/* Class = "UILabel"; text = "If you want to always show UINavigationBar, then change the UIView class to UIScrollView. Note that if scrollView.scrollEnabled = NO then library ignore scrollView and behave like as there is no scrollView in the middle"; ObjectID = "2HE-8l-pwN"; */
"2HE-8l-pwN.text" = "If you want to always show UINavigationBar, then change the UIView class to UIScrollView. Note that if scrollView.scrollEnabled = NO then library ignore scrollView and behave like as there is no scrollView in the middle";
/* Class = "UINavigationItem"; title = "UITableViewController"; ObjectID = "7ET-Mf-F9b"; */
"7ET-Mf-F9b.title" = "UITableViewController";
/* Class = "UITextView"; text = "Lorem ipsum dolor sit er elit lamet, consectetaur cillium adipisicing pecu, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Nam liber te conscient to factor tum poen legum odioque civiuda. Lorem ipsum dolor sit er elit lamet, consectetaur cillium adipisicing pecu, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Nam liber te conscient to factor tum poen legum odioque civiuda. Lorem ipsum dolor sit er elit lamet, consectetaur cillium adipisicing pecu, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Nam liber te conscient to factor tum poen legum odioque civiuda. "; ObjectID = "7Nj-eG-LrV"; */
"7Nj-eG-LrV.text" = "Lorem ipsum dolor sit er elit lamet, consectetaur cillium adipisicing pecu, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Nam liber te conscient to factor tum poen legum odioque civiuda. Lorem ipsum dolor sit er elit lamet, consectetaur cillium adipisicing pecu, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Nam liber te conscient to factor tum poen legum odioque civiuda. Lorem ipsum dolor sit er elit lamet, consectetaur cillium adipisicing pecu, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Nam liber te conscient to factor tum poen legum odioque civiuda. ";
/* Class = "UINavigationItem"; title = "UICollectionView"; ObjectID = "Byq-bS-sCQ"; */
"Byq-bS-sCQ.title" = "UICollectionView";
/* Class = "UITextField"; placeholder = "Subview Position: 7, Tag: 3"; ObjectID = "Fa0-cQ-2Qp"; */
"Fa0-cQ-2Qp.placeholder" = "Subview Position: 7, Tag: 3";
/* Class = "UINavigationItem"; title = "Navigation Bar"; ObjectID = "IWx-4s-DcF"; */
"IWx-4s-DcF.title" = "Navigation Bar";
/* Class = "UITextField"; placeholder = "Subview Position: 3, Tag: 7"; ObjectID = "JwK-tl-xro"; */
"JwK-tl-xro.placeholder" = "Subview Position: 3, Tag: 7";
/* Class = "UITextView"; text = "TextView2"; ObjectID = "Qlj-B6-NJn"; */
"Qlj-B6-NJn.text" = "TextView2";
/* Class = "UITextView"; text = "Lorem ipsum dolor sit er elit lamet, consectetaur cillium adipisicing pecu, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Nam liber te conscient to factor tum poen legum odioque civiuda. Lorem ipsum dolor sit er elit lamet, consectetaur cillium adipisicing pecu, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Nam liber te conscient to factor tum poen legum odioque civiuda. Lorem ipsum dolor sit er elit lamet, consectetaur cillium adipisicing pecu, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Nam liber te conscient to factor tum poen legum odioque civiuda. "; ObjectID = "QxW-ea-vah"; */
"QxW-ea-vah.text" = "Lorem ipsum dolor sit er elit lamet, consectetaur cillium adipisicing pecu, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Nam liber te conscient to factor tum poen legum odioque civiuda. Lorem ipsum dolor sit er elit lamet, consectetaur cillium adipisicing pecu, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Nam liber te conscient to factor tum poen legum odioque civiuda. Lorem ipsum dolor sit er elit lamet, consectetaur cillium adipisicing pecu, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Nam liber te conscient to factor tum poen legum odioque civiuda. ";
/* Class = "UILabel"; text = "Try editing the last cell."; ObjectID = "RIL-5e-TSk"; */
"RIL-5e-TSk.text" = "Try editing the last cell.";
/* Class = "UILabel"; text = "scrollView.scrollEnabled"; ObjectID = "V8j-ee-Y7K"; */
"V8j-ee-Y7K.text" = "scrollView.scrollEnabled";
/* Class = "UINavigationItem"; title = "UITableView Example"; ObjectID = "ZVF-w5-7zs"; */
"ZVF-w5-7zs.title" = "UITableView Example";
/* Class = "UITextField"; placeholder = "Subview Position: 2, Tag: 5"; ObjectID = "bxS-Ei-dBG"; */
"bxS-Ei-dBG.placeholder" = "Subview Position: 2, Tag: 5";
/* Class = "UITextView"; text = "Lorem ipsum dolor sit er elit lamet, consectetaur cillium adipisicing pecu, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Nam liber te conscient to factor tum poen legum odioque civiuda. Lorem ipsum dolor sit er elit lamet, consectetaur cillium adipisicing pecu, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Nam liber te conscient to factor tum poen legum odioque civiuda. Lorem ipsum dolor sit er elit lamet, consectetaur cillium adipisicing pecu, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Nam liber te conscient to factor tum poen legum odioque civiuda. "; ObjectID = "c05-oS-Wjq"; */
"c05-oS-Wjq.text" = "Lorem ipsum dolor sit er elit lamet, consectetaur cillium adipisicing pecu, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Nam liber te conscient to factor tum poen legum odioque civiuda. Lorem ipsum dolor sit er elit lamet, consectetaur cillium adipisicing pecu, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Nam liber te conscient to factor tum poen legum odioque civiuda. Lorem ipsum dolor sit er elit lamet, consectetaur cillium adipisicing pecu, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Nam liber te conscient to factor tum poen legum odioque civiuda. ";
/* Class = "UITextField"; placeholder = "Subview Position: 4, Tag: 2"; ObjectID = "cfl-i4-rKq"; */
"cfl-i4-rKq.placeholder" = "Subview Position: 4, Tag: 2";
/* Class = "UINavigationItem"; title = "UITableView in Container"; ObjectID = "f0D-mr-Rzc"; */
"f0D-mr-Rzc.title" = "UITableView in Container";
/* Class = "UITextView"; text = "Lorem ipsum dolor sit er elit lamet, consectetaur cillium adipisicing pecu, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Nam liber te conscient to factor tum poen legum odioque civiuda. Lorem ipsum dolor sit er elit lamet, consectetaur cillium adipisicing pecu, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Nam liber te conscient to factor tum poen legum odioque civiuda. Lorem ipsum dolor sit er elit lamet, consectetaur cillium adipisicing pecu, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Nam liber te conscient to factor tum poen legum odioque civiuda. "; ObjectID = "fgX-lN-poh"; */
"fgX-lN-poh.text" = "Lorem ipsum dolor sit er elit lamet, consectetaur cillium adipisicing pecu, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Nam liber te conscient to factor tum poen legum odioque civiuda. Lorem ipsum dolor sit er elit lamet, consectetaur cillium adipisicing pecu, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Nam liber te conscient to factor tum poen legum odioque civiuda. Lorem ipsum dolor sit er elit lamet, consectetaur cillium adipisicing pecu, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Nam liber te conscient to factor tum poen legum odioque civiuda. ";
/* Class = "UITextField"; placeholder = "Subview Position: 5, Tag: 6"; ObjectID = "heE-KG-kGl"; */
"heE-KG-kGl.placeholder" = "Subview Position: 5, Tag: 6";
/* Class = "UITextField"; placeholder = "Subview Position: 6, Tag: 1"; ObjectID = "iZI-Ur-2uh"; */
"iZI-Ur-2uh.placeholder" = "Subview Position: 6, Tag: 1";
/* Class = "UITextView"; text = "Lorem ipsum dolor sit er elit lamet, consectetaur cillium adipisicing pecu, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Nam liber te conscient to factor tum poen legum odioque civiuda. Lorem ipsum dolor sit er elit lamet, consectetaur cillium adipisicing pecu, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Nam liber te conscient to factor tum poen legum odioque civiuda. Lorem ipsum dolor sit er elit lamet, consectetaur cillium adipisicing pecu, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Nam liber te conscient to factor tum poen legum odioque civiuda. "; ObjectID = "jHL-zT-u6g"; */
"jHL-zT-u6g.text" = "Lorem ipsum dolor sit er elit lamet, consectetaur cillium adipisicing pecu, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Nam liber te conscient to factor tum poen legum odioque civiuda. Lorem ipsum dolor sit er elit lamet, consectetaur cillium adipisicing pecu, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Nam liber te conscient to factor tum poen legum odioque civiuda. Lorem ipsum dolor sit er elit lamet, consectetaur cillium adipisicing pecu, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Nam liber te conscient to factor tum poen legum odioque civiuda. ";
/* Class = "UITextView"; text = "Lorem ipsum dolor sit er elit lamet, consectetaur cillium adipisicing pecu, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Nam liber te conscient to factor tum poen legum odioque civiuda. Lorem ipsum dolor sit er elit lamet, consectetaur cillium adipisicing pecu, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Nam liber te conscient to factor tum poen legum odioque civiuda. Lorem ipsum dolor sit er elit lamet, consectetaur cillium adipisicing pecu, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Nam liber te conscient to factor tum poen legum odioque civiuda. "; ObjectID = "kmt-IJ-ajj"; */
"kmt-IJ-ajj.text" = "Lorem ipsum dolor sit er elit lamet, consectetaur cillium adipisicing pecu, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Nam liber te conscient to factor tum poen legum odioque civiuda. Lorem ipsum dolor sit er elit lamet, consectetaur cillium adipisicing pecu, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Nam liber te conscient to factor tum poen legum odioque civiuda. Lorem ipsum dolor sit er elit lamet, consectetaur cillium adipisicing pecu, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Nam liber te conscient to factor tum poen legum odioque civiuda. ";
/* Class = "UITextView"; text = "Lorem ipsum dolor sit er elit lamet, consectetaur cillium adipisicing pecu, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Nam liber te conscient to factor tum poen legum odioque civiuda. Lorem ipsum dolor sit er elit lamet, consectetaur cillium adipisicing pecu, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Nam liber te conscient to factor tum poen legum odioque civiuda. Lorem ipsum dolor sit er elit lamet, consectetaur cillium adipisicing pecu, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Nam liber te conscient to factor tum poen legum odioque civiuda. "; ObjectID = "nJx-vj-aC8"; */
"nJx-vj-aC8.text" = "Lorem ipsum dolor sit er elit lamet, consectetaur cillium adipisicing pecu, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Nam liber te conscient to factor tum poen legum odioque civiuda. Lorem ipsum dolor sit er elit lamet, consectetaur cillium adipisicing pecu, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Nam liber te conscient to factor tum poen legum odioque civiuda. Lorem ipsum dolor sit er elit lamet, consectetaur cillium adipisicing pecu, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Nam liber te conscient to factor tum poen legum odioque civiuda. ";
/* Class = "UILabel"; text = "Should Hide Title?"; ObjectID = "oiz-z1-TuT"; */
"oiz-z1-TuT.text" = "Should Hide Title?";
/* Class = "UITextView"; text = "TextView1"; ObjectID = "pMi-TP-eI0"; */
"pMi-TP-eI0.text" = "TextView1";
/* Class = "UITextField"; placeholder = "Subview Postion: 1, Tag: 4"; ObjectID = "wO8-Qd-oOx"; */
"wO8-Qd-oOx.placeholder" = "Subview Postion: 1, Tag: 4";
/* Class = "UITextView"; text = "Lorem ipsum dolor sit er elit lamet, consectetaur cillium adipisicing pecu, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Nam liber te conscient to factor tum poen legum odioque civiuda. Lorem ipsum dolor sit er elit lamet, consectetaur cillium adipisicing pecu, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Nam liber te conscient to factor tum poen legum odioque civiuda. Lorem ipsum dolor sit er elit lamet, consectetaur cillium adipisicing pecu, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Nam liber te conscient to factor tum poen legum odioque civiuda. "; ObjectID = "xgn-PI-i5c"; */
"xgn-PI-i5c.text" = "Lorem ipsum dolor sit er elit lamet, consectetaur cillium adipisicing pecu, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Nam liber te conscient to factor tum poen legum odioque civiuda. Lorem ipsum dolor sit er elit lamet, consectetaur cillium adipisicing pecu, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Nam liber te conscient to factor tum poen legum odioque civiuda. Lorem ipsum dolor sit er elit lamet, consectetaur cillium adipisicing pecu, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Nam liber te conscient to factor tum poen legum odioque civiuda. ";
================================================
FILE: Example/IQKeyboardManagerSwiftExample/Storyboard/ar.lproj/Settings.strings
================================================
/* Class = "UILabel"; text = "Set customised text for displaying instead of done button"; ObjectID = "6c1-Bw-1aW"; */
"6c1-Bw-1aW.text" = "Set customised text for displaying instead of done button";
/* Class = "UILabel"; text = "Keyboard Distance From TextField"; ObjectID = "6ui-Nh-dce"; */
"6ui-Nh-dce.text" = "Keyboard Distance From TextField";
/* Class = "UILabel"; text = "Enable/Disable IQKeyboardManager"; ObjectID = "83w-3B-iAB"; */
"83w-3B-iAB.text" = "Enable/Disable IQKeyboardManager";
/* Class = "UILabel"; text = "Toolbar Done BarButtonItem Image"; ObjectID = "Fho-oc-M7i"; */
"Fho-oc-M7i.text" = "Toolbar Done BarButtonItem Image";
/* Class = "UILabel"; text = "Enable/Disable IQKeyboardManager"; ObjectID = "GSN-ib-2QV"; */
"GSN-ib-2QV.text" = "Enable/Disable IQKeyboardManager";
/* Class = "UINavigationItem"; title = "Options"; ObjectID = "H3G-vI-2WD"; */
"H3G-vI-2WD.title" = "Options";
/* Class = "UILabel"; text = "Set keyboard distance from textField"; ObjectID = "OWA-3C-V4P"; */
"OWA-3C-V4P.text" = "Set keyboard distance from textField";
/* Class = "UILabel"; text = "Enable"; ObjectID = "P6l-3B-Vbo"; */
"P6l-3B-Vbo.text" = "Enable";
/* Class = "UILabel"; text = "Set keyboard distance from textField"; ObjectID = "YNr-d4-Faa"; */
"YNr-d4-Faa.text" = "Set keyboard distance from textField";
/* Class = "UILabel"; text = "100"; ObjectID = "eZu-JU-5IX"; */
"eZu-JU-5IX.text" = "100";
/* Class = "UILabel"; text = "Keyboard Distance From TextField"; ObjectID = "eij-19-1a2"; */
"eij-19-1a2.text" = "Keyboard Distance From TextField";
/* Class = "UILabel"; text = "Toolbar Done BarButtonItem Text"; ObjectID = "epd-OM-hrb"; */
"epd-OM-hrb.text" = "Toolbar Done BarButtonItem Text";
/* Class = "UILabel"; text = "Toolbar Tint Color"; ObjectID = "gbI-Y1-o9F"; */
"gbI-Y1-o9F.text" = "Toolbar Tint Color";
/* Class = "UILabel"; text = "Toolbar Manage Behaviour"; ObjectID = "iPm-jy-a7o"; */
"iPm-jy-a7o.text" = "Toolbar Manage Behaviour";
/* Class = "UILabel"; text = "Set keyboard toolbar tintColor"; ObjectID = "kpy-XG-RQx"; */
"kpy-XG-RQx.text" = "Set keyboard toolbar tintColor";
/* Class = "UINavigationItem"; title = "Settings"; ObjectID = "kw6-7O-wxw"; */
"kw6-7O-wxw.title" = "Settings";
================================================
FILE: Example/IQKeyboardManagerSwiftExample/Storyboard/ar.lproj/SpecialCase.strings
================================================
/* Class = "UITextField"; placeholder = "Custom Work"; ObjectID = "2mf-mU-ovU"; */
"2mf-mU-ovU.placeholder" = "Custom Work";
/* Class = "UINavigationItem"; title = "WKWebView Example"; ObjectID = "3s1-JL-XZo"; */
"3s1-JL-XZo.title" = "WKWebView Example";
/* Class = "UITextField"; placeholder = "TextField 2"; ObjectID = "48H-nl-1ha"; */
"48H-nl-1ha.placeholder" = "TextField 2";
/* Class = "UILabel"; text = "Enable Touch Resign inside CustomViewController"; ObjectID = "B56-NE-au7"; */
"B56-NE-au7.text" = "Enable Touch Resign inside CustomViewController";
/* Class = "UILabel"; text = "DisableDistanceHandling Inside CustomViewController even if IQKeyboardManager is enabled."; ObjectID = "I5d-yW-B3e"; */
"I5d-yW-B3e.text" = "DisableDistanceHandling Inside CustomViewController even if IQKeyboardManager is enabled.";
/* Class = "UILabel"; text = "Disable Toolbar inside CustomViewController"; ObjectID = "JGH-5V-8ic"; */
"JGH-5V-8ic.text" = "Disable Toolbar inside CustomViewController";
/* Class = "UINavigationItem"; title = "UIStackView Example"; ObjectID = "L7c-7d-d1o"; */
"L7c-7d-d1o.title" = "UIStackView Example";
/* Class = "UITextField"; placeholder = "TextField 1"; ObjectID = "LhW-1m-VYd"; */
"LhW-1m-VYd.placeholder" = "TextField 1";
/* Class = "UITextField"; placeholder = "textField.userEnteractionEnabled = NO"; ObjectID = "PfH-qV-9D8"; */
"PfH-qV-9D8.placeholder" = "textField.userEnteractionEnabled = NO";
/* Class = "UITextField"; placeholder = "TextField 3"; ObjectID = "UJZ-io-mQK"; */
"UJZ-io-mQK.placeholder" = "TextField 3";
/* Class = "UIButton"; normalTitle = "Show Alert with TextField"; ObjectID = "YrO-Gs-dk3"; */
"YrO-Gs-dk3.normalTitle" = "Show Alert with TextField";
/* Class = "UILabel"; text = "Disable Touch Resign inside CustomViewController"; ObjectID = "a6b-j6-OEh"; */
"a6b-j6-OEh.text" = "Disable Touch Resign inside CustomViewController";
/* Class = "UINavigationItem"; title = "Refresh Layout"; ObjectID = "aR0-XP-p7v"; */
"aR0-XP-p7v.title" = "Refresh Layout";
/* Class = "UITextField"; placeholder = "TextField 5"; ObjectID = "cub-N3-8xz"; */
"cub-N3-8xz.placeholder" = "TextField 5";
/* Class = "UITextField"; placeholder = "TextField.enabled = NO"; ObjectID = "d6z-1T-UIh"; */
"d6z-1T-UIh.placeholder" = "TextField.enabled = NO";
/* Class = "UITextView"; text = "Lorem ipsum dolor sit er elit lamet, consectetaur cillium adipisicing pecu, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Nam liber te conscient to factor tum poen legum odioque civiuda."; ObjectID = "djH-2u-YPC"; */
"djH-2u-YPC.text" = "Lorem ipsum dolor sit er elit lamet, consectetaur cillium adipisicing pecu, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Nam liber te conscient to factor tum poen legum odioque civiuda.";
/* Class = "UINavigationItem"; title = "UITextView Selection (#56)"; ObjectID = "f8P-PN-bre"; */
"f8P-PN-bre.title" = "UITextView Selection (#56)";
/* Class = "UINavigationItem"; title = "Special Cases"; ObjectID = "iYf-Wa-Sqo"; */
"iYf-Wa-Sqo.title" = "Special Cases";
/* Class = "UILabel"; text = "EnableDistanceHandling Inside CustomViewController even if IQKeyboardManager is disabled."; ObjectID = "nhk-VO-9Ye"; */
"nhk-VO-9Ye.text" = "EnableDistanceHandling Inside CustomViewController even if IQKeyboardManager is disabled.";
/* Class = "UILabel"; text = "Enable Toolbar inside CustomViewController"; ObjectID = "oLV-3B-B0Z"; */
"oLV-3B-B0Z.text" = "Enable Toolbar inside CustomViewController";
/* Class = "UINavigationItem"; title = "CustomView Demo"; ObjectID = "oVJ-aw-xfZ"; */
"oVJ-aw-xfZ.title" = "CustomView Demo";
/* Class = "UILabel"; text = "Allow Toolbar PreviousNext Inside IQPreviousNextView"; ObjectID = "uiA-Vu-37g"; */
"uiA-Vu-37g.text" = "Allow Toolbar PreviousNext Inside IQPreviousNextView";
/* Class = "UITextField"; placeholder = "TextField enabled. Long Text Test, Long Text Test, Long Text Test, Long Text Test, Long Text Test, Long Text Test, Long Text Test, Long Text Test, Long Text Test, Long Text Test, Long Text Test, Long Text Test, Long Text Test, Long Text Test, Long Text Test, Long Text Test,"; ObjectID = "wcb-LB-3eZ"; */
"wcb-LB-3eZ.placeholder" = "TextField enabled. Long Text Test, Long Text Test, Long Text Test, Long Text Test, Long Text Test, Long Text Test, Long Text Test, Long Text Test, Long Text Test, Long Text Test, Long Text Test, Long Text Test, Long Text Test, Long Text Test, Long Text Test, Long Text Test,";
/* Class = "UITextField"; placeholder = "TextField 4"; ObjectID = "yDj-sx-3pn"; */
"yDj-sx-3pn.placeholder" = "TextField 4";
/* Class = "UIButton"; normalTitle = "Reload Layout"; ObjectID = "zDG-8z-I8F"; */
"zDG-8z-I8F.normalTitle" = "Reload Layout";
================================================
FILE: Example/IQKeyboardManagerSwiftExample/ViewController/AutofillPasswordViewController.swift
================================================
//
// AutofillPasswordViewController.swift
// https://github.com/hackiftekhar/IQKeyboardManager
// Copyright (c) 2013-24 Iftekhar Qurashi.
//
// Permission is hereby granted, free of charge, to any person obtaining a copy
// of this software and associated documentation files (the "Software"), to deal
// in the Software without restriction, including without limitation the rights
// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
// copies of the Software, and to permit persons to whom the Software is
// furnished to do so, subject to the following conditions:
//
// The above copyright notice and this permission notice shall be included in
// all copies or substantial portions of the Software.
//
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
// THE SOFTWARE.
import UIKit
class AutofillPasswordViewController: BaseViewController {
@IBAction private func loginActin(_ sender: UIButton) {
self.view.endEditing(true)
DispatchQueue.main.asyncAfter(deadline: .now() + 1, execute: {
let viewController = BaseViewController()
viewController.view.backgroundColor = UIColor.white
self.navigationController?.pushViewController(viewController, animated: true)
})
}
}
================================================
FILE: Example/IQKeyboardManagerSwiftExample/ViewController/BaseTableViewController.swift
================================================
//
// BaseTableViewController.swift
// https://github.com/hackiftekhar/IQKeyboardManager
// Copyright (c) 2013-24 Iftekhar Qurashi.
//
// Permission is hereby granted, free of charge, to any person obtaining a copy
// of this software and associated documentation files (the "Software"), to deal
// in the Software without restriction, including without limitation the rights
// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
// copies of the Software, and to permit persons to whom the Software is
// furnished to do so, subject to the following conditions:
//
// The above copyright notice and this permission notice shall be included in
// all copies or substantial portions of the Software.
//
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
// THE SOFTWARE.
import UIKit
class BaseTableViewController: UITableViewController {
override func viewWillAppear(_ animated: Bool) {
super.viewWillAppear(animated)
let presentButtonTitle = (self.presentingViewController == nil) ? "Present" : "Dismiss"
let presentBarButtonItem = UIBarButtonItem(title: presentButtonTitle,
style: .done,
target: self,
action: #selector(presentAction(_:)))
let settingsBarButtongItem = UIBarButtonItem(image: UIImage(named: "settings"),
style: .done,
target: self,
action: #selector(settingsAction(_:)))
self.navigationItem.rightBarButtonItems = [settingsBarButtongItem, presentBarButtonItem]
}
override var shouldAutorotate: Bool {
return true
}
}
extension BaseTableViewController {
@IBAction private func presentAction(_ sender: UIBarButtonItem) {
if self.presentingViewController == nil {
let controller = UIAlertController.init(title: nil, message: nil, preferredStyle: .actionSheet)
controller.popoverPresentationController?.barButtonItem = sender
controller.addAction(.init(title: "Full Screen", style: .default, handler: { _ in
self.presentUsing(style: .fullScreen, sender: sender)
}))
controller.addAction(.init(title: "Page Sheet", style: .default, handler: { _ in
self.presentUsing(style: .pageSheet, sender: sender)
}))
controller.addAction(.init(title: "Form Sheet", style: .default, handler: { _ in
self.presentUsing(style: .formSheet, sender: sender)
}))
controller.addAction(.init(title: "Current Context", style: .default, handler: { _ in
self.presentUsing(style: .currentContext, sender: sender)
}))
controller.addAction(.init(title: "Over Full Screen", style: .default, handler: { _ in
self.presentUsing(style: .overFullScreen, sender: sender)
}))
controller.addAction(.init(title: "Over Current Context", style: .default, handler: { _ in
self.presentUsing(style: .overCurrentContext, sender: sender)
}))
controller.addAction(.init(title: "Popover", style: .default, handler: { _ in
self.presentUsing(style: .popover, sender: sender)
}))
if #available(iOS 13, *) {
controller.addAction(.init(title: "Automatic", style: .default, handler: { _ in
self.presentUsing(style: .automatic, sender: sender)
}))
}
controller.addAction(.init(title: "Cancel", style: .cancel))
present(controller, animated: true, completion: nil)
} else {
dismiss(animated: true, completion: nil)
}
}
func presentUsing(style: UIModalPresentationStyle, sender: UIBarButtonItem) {
let classNameString: String = "\(type(of: self.self))"
let controller: UIViewController = (storyboard?.instantiateViewController(withIdentifier: classNameString))!
let navController: NavigationController = NavigationController(rootViewController: controller)
navController.navigationBar.tintColor = self.navigationController?.navigationBar.tintColor
navController.navigationBar.barTintColor = self.navigationController?.navigationBar.barTintColor
navController.navigationBar.titleTextAttributes = self.navigationController?.navigationBar.titleTextAttributes
navController.modalPresentationStyle = style
if style == .popover {
let heightWidth = max(UIScreen.main.bounds.width, UIScreen.main.bounds.height)
navController.preferredContentSize = CGSize(width: heightWidth, height: heightWidth)
navController.popoverPresentationController?.barButtonItem = sender
navController.popoverPresentationController?.delegate = self
}
present(navController, animated: true, completion: nil)
}
}
extension BaseTableViewController {
@IBAction private func settingsAction(_ sender: UIBarButtonItem) {
let storyboard = UIStoryboard(name: "Settings", bundle: nil)
let controller = storyboard.instantiateViewController(withIdentifier: "SettingsViewController")
let navController: NavigationController = NavigationController(rootViewController: controller)
navController.navigationBar.tintColor = self.navigationController?.navigationBar.tintColor
navController.navigationBar.barTintColor = self.navigationController?.navigationBar.barTintColor
navController.navigationBar.titleTextAttributes = self.navigationController?.navigationBar.titleTextAttributes
navController.modalPresentationStyle = .popover
navController.popoverPresentationController?.barButtonItem = sender
let heightWidth = max(UIScreen.main.bounds.width, UIScreen.main.bounds.height)
navController.preferredContentSize = CGSize(width: heightWidth, height: heightWidth)
navController.popoverPresentationController?.delegate = self
present(navController, animated: true, completion: nil)
}
}
extension BaseTableViewController: UIPopoverPresentationControllerDelegate {
func adaptivePresentationStyle(for controller: UIPresentationController) -> UIModalPresentationStyle {
return .none
}
func prepareForPopoverPresentation(_ popoverPresentationController: UIPopoverPresentationController) {
self.view.endEditing(true)
}
}
================================================
FILE: Example/IQKeyboardManagerSwiftExample/ViewController/BaseViewController.swift
================================================
//
// BaseViewController.swift
// https://github.com/hackiftekhar/IQKeyboardManager
// Copyright (c) 2013-24 Iftekhar Qurashi.
//
// Permission is hereby granted, free of charge, to any person obtaining a copy
// of this software and associated documentation files (the "Software"), to deal
// in the Software without restriction, including without limitation the rights
// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
// copies of the Software, and to permit persons to whom the Software is
// furnished to do so, subject to the following conditions:
//
// The above copyright notice and this permission notice shall be included in
// all copies or substantial portions of the Software.
//
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
// THE SOFTWARE.
import UIKit
class BaseViewController: UIViewController {
override func viewWillAppear(_ animated: Bool) {
super.viewWillAppear(animated)
let presentButtonTitle = (self.presentingViewController == nil) ? "Present" : "Dismiss"
let presentBarButtonItem = UIBarButtonItem(title: presentButtonTitle,
style: .done,
target: self,
action: #selector(presentAction(_:)))
let settingsBarButtongItem = UIBarButtonItem(image: UIImage(named: "settings"),
style: .done,
target: self,
action: #selector(settingsAction(_:)))
self.navigationItem.rightBarButtonItems = [settingsBarButtongItem, presentBarButtonItem]
}
override var shouldAutorotate: Bool {
return true
}
}
extension BaseViewController {
@IBAction private func presentAction(_ sender: UIBarButtonItem) {
if self.presentingViewController == nil {
let controller = UIAlertController.init(title: nil, message: nil, preferredStyle: .actionSheet)
controller.popoverPresentationController?.barButtonItem = sender
controller.addAction(.init(title: "Full Screen", style: .default, handler: { _ in
self.presentUsing(style: .fullScreen, sender: sender)
}))
controller.addAction(.init(title: "Page Sheet", style: .default, handler: { _ in
self.presentUsing(style: .pageSheet, sender: sender)
}))
controller.addAction(.init(title: "Form Sheet", style: .default, handler: { _ in
self.presentUsing(style: .formSheet, sender: sender)
}))
controller.addAction(.init(title: "Current Context", style: .default, handler: { _ in
self.presentUsing(style: .currentContext, sender: sender)
}))
controller.addAction(.init(title: "Over Full Screen", style: .default, handler: { _ in
self.presentUsing(style: .overFullScreen, sender: sender)
}))
controller.addAction(.init(title: "Over Current Context", style: .default, handler: { _ in
self.presentUsing(style: .overCurrentContext, sender: sender)
}))
controller.addAction(.init(title: "Popover", style: .default, handler: { _ in
self.presentUsing(style: .popover, sender: sender)
}))
if #available(iOS 13, *) {
controller.addAction(.init(title: "Automatic", style: .default, handler: { _ in
self.presentUsing(style: .automatic, sender: sender)
}))
}
controller.addAction(.init(title: "Cancel", style: .cancel))
present(controller, animated: true, completion: nil)
} else {
dismiss(animated: true, completion: nil)
}
}
func presentUsing(style: UIModalPresentationStyle, sender: UIBarButtonItem) {
let classNameString: String = "\(type(of: self.self))"
let controller: UIViewController = (storyboard?.instantiateViewController(withIdentifier: classNameString))!
let navController: NavigationController = NavigationController(rootViewController: controller)
navController.navigationBar.tintColor = self.navigationController?.navigationBar.tintColor
navController.navigationBar.barTintColor = self.navigationController?.navigationBar.barTintColor
navController.navigationBar.titleTextAttributes = self.navigationController?.navigationBar.titleTextAttributes
navController.modalPresentationStyle = style
if style == .popover {
let heightWidth = max(UIScreen.main.bounds.width, UIScreen.main.bounds.height)
navController.preferredContentSize = CGSize(width: heightWidth, height: heightWidth)
navController.popoverPresentationController?.barButtonItem = sender
navController.popoverPresentationController?.delegate = self
}
present(navController, animated: true, completion: nil)
}
}
extension BaseViewController {
@IBAction private func settingsAction(_ sender: UIBarButtonItem) {
let storyboard = UIStoryboard(name: "Settings", bundle: nil)
let controller = storyboard.instantiateViewController(withIdentifier: "SettingsViewController")
let navController: NavigationController = NavigationController(rootViewController: controller)
navController.navigationBar.tintColor = self.navigationController?.navigationBar.tintColor
navController.navigationBar.barTintColor = self.navigationController?.navigationBar.barTintColor
navController.navigationBar.titleTextAttributes = self.navigationController?.navigationBar.titleTextAttributes
navController.modalPresentationStyle = .popover
navController.popoverPresentationController?.barButtonItem = sender
let heightWidth = max(UIScreen.main.bounds.width, UIScreen.main.bounds.height)
navController.preferredContentSize = CGSize(width: heightWidth, height: heightWidth)
navController.popoverPresentationController?.delegate = self
present(navController, animated: true, completion: nil)
}
}
extension BaseViewController: UIPopoverPresentationControllerDelegate {
func adaptivePresentationStyle(for controller: UIPresentationController) -> UIModalPresentationStyle {
return .none
}
func prepareForPopoverPresentation(_ popoverPresentationController: UIPopoverPresentationController) {
self.view.endEditing(true)
}
}
================================================
FILE: Example/IQKeyboardManagerSwiftExample/ViewController/CollectionViewDemoController.swift
================================================
//
// CollectionViewDemoController.swift
// https://github.com/hackiftekhar/IQKeyboardManager
// Copyright (c) 2013-24 Iftekhar Qurashi.
//
// Permission is hereby granted, free of charge, to any person obtaining a copy
// of this software and associated documentation files (the "Software"), to deal
// in the Software without restriction, including without limitation the rights
// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
// copies of the Software, and to permit persons to whom the Software is
// furnished to do so, subject to the following conditions:
//
// The above copyright notice and this permission notice shall be included in
// all copies or substantial portions of the Software.
//
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
// THE SOFTWARE.
import UIKit
class CollectionViewDemoController: BaseViewController, UICollectionViewDelegate, UICollectionViewDataSource {
@IBOutlet var collectionView: UICollectionView!
override func viewDidLoad() {
super.viewDidLoad()
do {
let itemSize = NSCollectionLayoutSize(widthDimension: .fractionalWidth(1.0),
heightDimension: .fractionalHeight(1.0))
let groupSize = NSCollectionLayoutSize(widthDimension: .fractionalWidth(1.0),
heightDimension: .absolute(50))
let item = NSCollectionLayoutItem(layoutSize: itemSize)
let group = NSCollectionLayoutGroup.horizontal(layoutSize: groupSize,
subitems: [item])
let section: NSCollectionLayoutSection = NSCollectionLayoutSection(group: group)
let configuration: UICollectionViewCompositionalLayoutConfiguration = .init()
configuration.scrollDirection = .vertical
collectionView.collectionViewLayout = UICollectionViewCompositionalLayout(section: section,
configuration: configuration)
}
}
func collectionView(_ collectionView: UICollectionView,
numberOfItemsInSection section: Int) -> Int {
return 15
}
func collectionView(_ collectionView: UICollectionView,
cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {
let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "TextFieldCollectionViewCell",
for: indexPath)
let textField = cell.viewWithTag(10) as? UITextField
textField?.placeholder = "\(indexPath.section) \(indexPath.row)"
return cell
}
}
================================================
FILE: Example/IQKeyboardManagerSwiftExample/ViewController/CustomViewController.swift
================================================
//
// CustomViewController.swift
// https://github.com/hackiftekhar/IQKeyboardManager
// Copyright (c) 2013-24 Iftekhar Qurashi.
//
// Permission is hereby granted, free of charge, to any person obtaining a copy
// of this software and associated documentation files (the "Software"), to deal
// in the Software without restriction, including without limitation the rights
// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
// copies of the Software, and to permit persons to whom the Software is
// furnished to do so, subject to the following conditions:
//
// The above copyright notice and this permission notice shall be included in
// all copies or substantial portions of the Software.
//
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
// THE SOFTWARE.
import UIKit
import IQKeyboardManagerSwift
import IQKeyboardReturnManager
import IQKeyboardToolbarManager
class CustomViewController: BaseViewController {
private let returnHandler: IQKeyboardReturnManager = .init()
@IBOutlet var settingsView: UIView!
@IBOutlet var switchDisableViewController: UISwitch!
@IBOutlet var switchEnableViewController: UISwitch!
@IBOutlet var switchDisableToolbar: UISwitch!
@IBOutlet var switchEnableToolbar: UISwitch!
@IBOutlet var switchDisableTouchResign: UISwitch!
@IBOutlet var switchEnableTouchResign: UISwitch!
@IBOutlet var switchAllowPreviousNext: UISwitch!
@IBOutlet var settingsTopConstraint: NSLayoutConstraint!
override func viewDidLoad() {
super.viewDidLoad()
settingsView.layer.shadowColor = UIColor.black.cgColor
settingsView.layer.shadowOffset = CGSize.zero
settingsView.layer.shadowRadius = 5.0
settingsView.layer.shadowOpacity = 0.5
returnHandler.addResponderSubviews(of: self.view, recursive: true)
returnHandler.lastTextInputViewReturnKeyType = .done
}
override func viewWillAppear(_ animated: Bool) {
super.viewWillAppear(animated)
do {
let classes = IQKeyboardManager.shared.disabledDistanceHandlingClasses
switchDisableViewController.isOn = classes.contains(where: { element in
return element == CustomViewController.self
})
}
do {
let classes = IQKeyboardManager.shared.enabledDistanceHandlingClasses
switchEnableViewController.isOn = classes.contains(where: { element in
return element == CustomViewController.self
})
}
do {
let classes = IQKeyboardToolbarManager.shared.disabledToolbarClasses
switchDisableToolbar.isOn = classes.contains(where: { element in
return element == CustomViewController.self
})
}
do {
let classes = IQKeyboardToolbarManager.shared.enabledToolbarClasses
switchEnableToolbar.isOn = classes.contains(where: { element in
return element == CustomViewController.self
})
}
do {
let classes = IQKeyboardManager.shared.disabledTouchResignedClasses
switchDisableTouchResign.isOn = classes.contains(where: { element in
return element == CustomViewController.self
})
}
do {
let classes = IQKeyboardManager.shared.enabledTouchResignedClasses
switchEnableTouchResign.isOn = classes.contains(where: { element in
return element == CustomViewController.self
})
}
do {
let classes = IQKeyboardToolbarManager.shared.deepResponderAllowedContainerClasses
switchAllowPreviousNext.isOn = classes.contains(where: { element in
return element == IQDeepResponderContainerView.self
})
}
}
@IBAction func tapAction(_ sender: UITapGestureRecognizer) {
if sender.state == .ended {
let finalCurve = UIView.AnimationOptions.beginFromCurrentState.union(.init(rawValue: 7))
let animationDuration: TimeInterval = 0.3
UIView.animate(withDuration: animationDuration, delay: 0, options: finalCurve, animations: {
if self.settingsTopConstraint.constant != 0 {
self.settingsTopConstraint.constant = 0
} else {
self.settingsTopConstraint.constant = -self.settingsView.frame.size.height+30
}
self.view.setNeedsLayout()
self.view.layoutIfNeeded()
}, completion: nil)
}
}
@IBAction func disableInViewControllerAction(_ sender: UISwitch) {
self.view.endEditing(true)
if sender.isOn {
IQKeyboardManager.shared.disabledDistanceHandlingClasses.append(CustomViewController.self)
} else {
if let index = IQKeyboardManager.shared.disabledDistanceHandlingClasses.firstIndex(where: { element in
return element == CustomViewController.self
}) {
IQKeyboardManager.shared.disabledDistanceHandlingClasses.remove(at: index)
}
}
}
@IBAction func enableInViewControllerAction(_ sender: UISwitch) {
self.view.endEditing(true)
if sender.isOn {
IQKeyboardManager.shared.enabledDistanceHandlingClasses.append(CustomViewController.self)
} else {
if let index = IQKeyboardManager.shared.enabledDistanceHandlingClasses.firstIndex(where: { element in
return element == CustomViewController.self
}) {
IQKeyboardManager.shared.enabledDistanceHandlingClasses.remove(at: index)
}
}
}
@IBAction func disableToolbarAction(_ sender: UISwitch) {
self.view.endEditing(true)
if sender.isOn {
IQKeyboardToolbarManager.shared.disabledToolbarClasses.append(CustomViewController.self)
} else {
if let index = IQKeyboardToolbarManager.shared.disabledToolbarClasses.firstIndex(where: { element in
return element == CustomViewController.self
}) {
IQKeyboardToolbarManager.shared.disabledToolbarClasses.remove(at: index)
}
}
}
@IBAction func enableToolbarAction(_ sender: UISwitch) {
self.view.endEditing(true)
if sender.isOn {
IQKeyboardToolbarManager.shared.enabledToolbarClasses.append(CustomViewController.self)
} else {
if let index = IQKeyboardToolbarManager.shared.enabledToolbarClasses.firstIndex(where: { element in
return element == CustomViewController.self
}) {
IQKeyboardToolbarManager.shared.enabledToolbarClasses.remove(at: index)
}
}
}
@IBAction func disableTouchOutsideAction(_ sender: UISwitch) {
self.view.endEditing(true)
if sender.isOn {
IQKeyboardManager.shared.disabledTouchResignedClasses.append(CustomViewController.self)
} else {
if let index = IQKeyboardManager.shared.disabledTouchResignedClasses.firstIndex(where: { element in
return element == CustomViewController.self
}) {
IQKeyboardManager.shared.disabledTouchResignedClasses.remove(at: index)
}
}
}
@IBAction func enableTouchOutsideAction(_ sender: UISwitch) {
self.view.endEditing(true)
if sender.isOn {
IQKeyboardManager.shared.enabledTouchResignedClasses.append(CustomViewController.self)
} else {
if let index = IQKeyboardManager.shared.enabledTouchResignedClasses.firstIndex(where: { element in
return element == CustomViewController.self
}) {
IQKeyboardManager.shared.enabledTouchResignedClasses.remove(at: index)
}
}
}
@IBAction func allowedPreviousNextAction(_ sender: UISwitch) {
self.view.endEditing(true)
if sender.isOn {
IQKeyboardToolbarManager.shared
.deepResponderAllowedContainerClasses.append(IQDeepResponderContainerView.self)
} else {
if let index = IQKeyboardToolbarManager.shared
.deepResponderAllowedContainerClasses.firstIndex(where: { element in
return element == IQDeepResponderContainerView.self
}) {
IQKeyboardToolbarManager.shared.deepResponderAllowedContainerClasses.remove(at: index)
}
}
}
}
================================================
FILE: Example/IQKeyboardManagerSwiftExample/ViewController/EdgesForExtendedLayoutViewController.swift
================================================
//
// EdgesForExtendedLayoutViewController.swift
// https://github.com/hackiftekhar/IQKeyboardManager
// Copyright (c) 2013-24 Iftekhar Qurashi.
//
// Permission is hereby granted, free of charge, to any person obtaining a copy
// of this software and associated documentation files (the "Software"), to deal
// in the Software without restriction, including without limitation the rights
// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
// copies of the Software, and to permit persons to whom the Software is
// furnished to do so, subject to the following conditions:
//
// The above copyright notice and this permission notice shall be included in
// all copies or substantial portions of the Software.
//
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
// THE SOFTWARE.
import UIKit
class EdgesForExtendedLayoutViewController: BaseViewController {
override func viewDidLoad() {
super.viewDidLoad()
self.edgesForExtendedLayout = .all
}
}
================================================
FILE: Example/IQKeyboardManagerSwiftExample/ViewController/EnableMode2000ViewController.swift
================================================
//
// TextSelectionViewController.swift
// https://github.com/hackiftekhar/IQKeyboardManager
// Copyright (c) 2013-24 Iftekhar Qurashi.
//
// Permission is hereby granted, free of charge, to any person obtaining a copy
// of this software and associated documentation files (the "Software"), to deal
// in the Software without restriction, including without limitation the rights
// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
// copies of the Software, and to permit persons to whom the Software is
// furnished to do so, subject to the following conditions:
//
// The above copyright notice and this permission notice shall be included in
// all copies or substantial portions of the Software.
//
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
// THE SOFTWARE.
import UIKit
import IQKeyboardManagerSwift
class EnableMode2000ViewController: BaseViewController {
@IBOutlet private var textField1: UITextField!
@IBOutlet private var textField2: UITextField!
@IBAction private func textField1ModeAction(_ sender: UISwitch) {
textField1.iq.enableMode = sender.isOn ? .enabled : .disabled
}
@IBAction private func textField2ModeAction(_ sender: UISwitch) {
textField2.iq.enableMode = sender.isOn ? .enabled : .disabled
}
}
================================================
FILE: Example/IQKeyboardManagerSwiftExample/ViewController/ExampleTableViewController.swift
================================================
//
// ExampleTableViewController.swift
// https://github.com/hackiftekhar/IQKeyboardManager
// Copyright (c) 2013-24 Iftekhar Qurashi.
//
// Permission is hereby granted, free of charge, to any person obtaining a copy
// of this software and associated documentation files (the "Software"), to deal
// in the Software without restriction, including without limitation the rights
// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
// copies of the Software, and to permit persons to whom the Software is
// furnished to do so, subject to the following conditions:
//
// The above copyright notice and this permission notice shall be included in
// all copies or substantial portions of the Software.
//
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
// THE SOFTWARE.
import UIKit
class ExampleTableViewController: BaseViewController, UITableViewDataSource, UITableViewDelegate {
func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return 10
}
func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat {
if (indexPath.row % 2) == 0 {
return 40
} else {
return 160
}
}
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let identifier = "\(indexPath.section) \(indexPath.row)"
var cell = tableView.dequeueReusableCell(withIdentifier: identifier)
if cell == nil {
cell = UITableViewCell(style: .default, reuseIdentifier: identifier)
cell?.backgroundColor = UIColor.clear
cell?.selectionStyle = .none
let contentView: UIView! = cell?.contentView
if (indexPath.row % 2) == 0 {
let textField = UITextField(frame: CGRect(x: 5, y: 5,
width: contentView.frame.size.width-10,
height: 30))
textField.autoresizingMask = [.flexibleBottomMargin, .flexibleTopMargin, .flexibleWidth]
textField.placeholder = identifier
textField.backgroundColor = UIColor.clear
textField.borderStyle = .roundedRect
cell?.contentView.addSubview(textField)
} else {
let textView = UITextView(frame: contentView.bounds.insetBy(dx: 5, dy: 5))
textView.autoresizingMask = [.flexibleHeight, .flexibleWidth]
textView.text = "Sample Text"
cell?.contentView.addSubview(textView)
}
}
return cell!
}
}
================================================
FILE: Example/IQKeyboardManagerSwiftExample/ViewController/ManualToolbarViewController.swift
================================================
//
// ManualToolbarViewController.swift
// https://github.com/hackiftekhar/IQKeyboardManager
// Copyright (c) 2013-24 Iftekhar Qurashi.
//
// Permission is hereby granted, free of charge, to any person obtaining a copy
// of this software and associated documentation files (the "Software"), to deal
// in the Software without restriction, including without limitation the rights
// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
// copies of the Software, and to permit persons to whom the Software is
// furnished to do so, subject to the following conditions:
//
// The above copyright notice and this permission notice shall be included in
// all copies or substantial portions of the Software.
//
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
// THE SOFTWARE.
import UIKit
import IQKeyboardManagerSwift
class ManualToolbarViewController: BaseViewController {
@IBOutlet var textField1: UITextField!
@IBOutlet var textField2: UITextField!
@IBOutlet var textView3: UITextView!
@IBOutlet var textField4: UITextField!
@IBOutlet var textField5: UITextField!
deinit {
textField1 = nil
textField2 = nil
textView3 = nil
textField4 = nil
textField5 = nil
}
override func viewDidLoad() {
super.viewDidLoad()
textField1.iq.addPreviousNextDone(target: self,
previousAction: #selector(self.previousAction(_:)),
nextAction: #selector(self.nextAction(_:)),
doneAction: #selector(self.doneAction(_:)),
showPlaceholder: true)
textField1.iq.toolbar.previousBarButton.isEnabled = false
textField1.iq.toolbar.nextBarButton.isEnabled = true
textField2.iq.addPreviousNextDone(target: self,
previousAction: #selector(self.previousAction(_:)),
nextAction: #selector(self.nextAction(_:)),
doneAction: #selector(self.doneAction(_:)),
showPlaceholder: true)
textField2.iq.toolbar.previousBarButton.isEnabled = true
textField2.iq.toolbar.nextBarButton.isEnabled = false
textView3.iq.addPreviousNextDone(target: self,
previousAction: #selector(self.previousAction(_:)),
nextAction: #selector(self.nextAction(_:)),
doneAction: #selector(self.doneAction(_:)),
showPlaceholder: true)
textField4.iq.toolbar.titleBarButton.setTarget(self, action: #selector(self.titleAction(_:)))
textField4.iq.placeholder = "Saved Passwords"
textField4.iq.addDone(target: self, action: #selector(self.doneAction(_:)), showPlaceholder: true)
textField5.inputAccessoryView = UIView()
}
@objc func previousAction(_ sender: UITextField!) {
if textField2.isFirstResponder {
textView3.becomeFirstResponder()
} else if textView3.isFirstResponder {
textField1.becomeFirstResponder()
}
}
@objc func nextAction(_ sender: UITextField!) {
if textField1.isFirstResponder {
textView3.becomeFirstResponder()
} else if textView3.isFirstResponder {
textField2.becomeFirstResponder()
}
}
@objc func doneAction(_ sender: UITextField!) {
self.view.endEditing(true)
}
@objc func titleAction(_ sender: UIButton) {
let alertController = UIAlertController(title: nil, message: nil, preferredStyle: .actionSheet)
alertController.addAction(UIAlertAction(title: "Cancel", style: .cancel, handler: nil))
alertController.addAction(UIAlertAction(title: "test@example.com",
style: .default,
handler: { (_: UIAlertAction) in
self.textField4.text = "test"
}))
alertController.addAction(UIAlertAction(title: "demo@example.com",
style: .default,
handler: { (_: UIAlertAction) in
self.textField4.text = "demo"
}))
alertController.popoverPresentationController?.sourceView = sender
self.present(alertController, animated: true, completion: nil)
}
}
================================================
FILE: Example/IQKeyboardManagerSwiftExample/ViewController/NavigationBarViewController.swift
================================================
//
// NavigationBarViewController.swift
// https://github.com/hackiftekhar/IQKeyboardManager
// Copyright (c) 2013-24 Iftekhar Qurashi.
//
// Permission is hereby granted, free of charge, to any person obtaining a copy
// of this software and associated documentation files (the "Software"), to deal
// in the Software without restriction, including without limitation the rights
// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
// copies of the Software, and to permit persons to whom the Software is
// furnished to do so, subject to the following conditions:
//
// The above copyright notice and this permission notice shall be included in
// all copies or substantial portions of the Software.
//
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
// THE SOFTWARE.
import UIKit
import IQKeyboardManagerSwift
import IQKeyboardReturnManager
class NavigationBarViewController: BaseViewController, UITextFieldDelegate {
private let returnHandler: IQKeyboardReturnManager = .init()
@IBOutlet var textField2: UITextField!
@IBOutlet var textField3: UITextField!
@IBOutlet var scrollView: UIScrollView!
deinit {
textField2 = nil
textField3 = nil
}
override func viewDidLoad() {
super.viewDidLoad()
textField3.iq.placeholder = "This is the customised placeholder title for displaying as toolbar title"
returnHandler.addResponderSubviews(of: self.view, recursive: true)
returnHandler.lastTextInputViewReturnKeyType = UIReturnKeyType.done
}
@IBAction func textFieldClicked(_ sender: UITextField!) {
}
@IBAction func enableScrollAction(_ sender: UISwitch!) {
scrollView.isScrollEnabled = sender.isOn
}
@IBAction func shouldHideTitle(_ sender: UISwitch!) {
textField2.iq.hidePlaceholder = !textField2.iq.hidePlaceholder
}
func textFieldShouldReturn(_ textField: UITextField) -> Bool {
return true
}
}
================================================
FILE: Example/IQKeyboardManagerSwiftExample/ViewController/NavigationController.swift
================================================
//
// NavigationController.swift
// https://github.com/hackiftekhar/IQKeyboardManager
// Copyright (c) 2013-24 Iftekhar Qurashi.
//
// Permission is hereby granted, free of charge, to any person obtaining a copy
// of this software and associated documentation files (the "Software"), to deal
// in the Software without restriction, including without limitation the rights
// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
// copies of the Software, and to permit persons to whom the Software is
// furnished to do so, subject to the following conditions:
//
// The above copyright notice and this permission notice shall be included in
// all copies or substantial portions of the Software.
//
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
// THE SOFTWARE.
import UIKit
class NavigationController: UINavigationController {
override func viewDidLoad() {
super.viewDidLoad()
self.navigationBar.barTintColor = UIColor.white
if #available(iOS 13.0, *) {
let navigationBarAppearance = UINavigationBarAppearance()
navigationBarAppearance.configureWithTransparentBackground()
navigationBarAppearance.backgroundColor = UIColor.white
navigationBar.standardAppearance = navigationBarAppearance
navigationBar.compactAppearance = navigationBarAppearance
navigationBar.scrollEdgeAppearance = navigationBarAppearance
if #available(iOS 15.0, *) {
navigationBar.compactScrollEdgeAppearance = navigationBarAppearance
}
}
navigationBar.setBackgroundImage(UIImage(), for: .default)
navigationBar.shadowImage = UIImage()
}
override var preferredStatusBarUpdateAnimation: UIStatusBarAnimation {
if let tabBarController = tabBarController {
return tabBarController.preferredStatusBarUpdateAnimation
} else {
return .fade
}
}
override var preferredStatusBarStyle: UIStatusBarStyle {
if let tabBarController = tabBarController {
return tabBarController.preferredStatusBarStyle
} else {
return .lightContent
}
}
}
================================================
FILE: Example/IQKeyboardManagerSwiftExample/ViewController/NonScrollTextView1979ViewController.swift
================================================
//
// NonScrollTextView1979ViewController.swift
// https://github.com/hackiftekhar/IQKeyboardManager
// Copyright (c) 2013-24 Iftekhar Qurashi.
//
// Permission is hereby granted, free of charge, to any person obtaining a copy
// of this software and associated documentation files (the "Software"), to deal
// in the Software without restriction, including without limitation the rights
// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
// copies of the Software, and to permit persons to whom the Software is
// furnished to do so, subject to the following conditions:
//
// The above copyright notice and this permission notice shall be included in
// all copies or substantial portions of the Software.
//
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
// THE SOFTWARE.
import UIKit
class NonScrollTextView1979ViewController: BaseViewController {
override func viewDidLoad() {
super.viewDidLoad()
let scrollView = UIScrollView()
view.addSubview(scrollView)
scrollView.translatesAutoresizingMaskIntoConstraints = false
NSLayoutConstraint.activate([
scrollView.leadingAnchor.constraint(equalTo: view.safeAreaLayoutGuide.leadingAnchor),
scrollView.topAnchor.constraint(equalTo: view.safeAreaLayoutGuide.topAnchor),
scrollView.trailingAnchor.constraint(equalTo: view.safeAreaLayoutGuide.trailingAnchor),
scrollView.bottomAnchor.constraint(equalTo: view.safeAreaLayoutGuide.bottomAnchor)
])
setupForStackView(in: scrollView)
// setupForView(in: scrollView)
}
private func setupForStackView(in scrollView: UIScrollView) {
let stackView = UIStackView()
stackView.spacing = 10
stackView.axis = .vertical
scrollView.addSubview(stackView)
stackView.translatesAutoresizingMaskIntoConstraints = false
NSLayoutConstraint.activate([
stackView.widthAnchor.constraint(equalTo: scrollView.widthAnchor, constant: -20),
stackView.leadingAnchor.constraint(equalTo: scrollView.contentLayoutGuide.leadingAnchor, constant: 10),
stackView.trailingAnchor.constraint(equalTo: scrollView.contentLayoutGuide.trailingAnchor),
stackView.topAnchor.constraint(equalTo: scrollView.contentLayoutGuide.topAnchor),
stackView.bottomAnchor.constraint(equalTo: scrollView.contentLayoutGuide.bottomAnchor)
])
for index in 1...8 {
let textView = UITextView()
textView.text = "\(index)"
textView.backgroundColor = .lightGray
textView.textColor = UIColor.black
textView.isEditable = true
// if set isScrollEnabled to true, it works fine
textView.isScrollEnabled = false
stackView.addArrangedSubview(textView)
textView.translatesAutoresizingMaskIntoConstraints = false
NSLayoutConstraint.activate([
textView.heightAnchor.constraint(equalToConstant: 500)
])
}
}
private func setupForView(in scrollView: UIScrollView) {
let eachHeight: CGFloat = 600
let gap: CGFloat = 10
let stackView = UIView()
scrollView.addSubview(stackView)
stackView.translatesAutoresizingMaskIntoConstraints = false
NSLayoutConstraint.activate([
stackView.widthAnchor.constraint(equalTo: scrollView.widthAnchor, constant: -20),
stackView.heightAnchor.constraint(equalToConstant: (eachHeight + gap) * 8),
stackView.leadingAnchor.constraint(equalTo: scrollView.contentLayoutGuide.leadingAnchor, constant: 10),
stackView.trailingAnchor.constraint(equalTo: scrollView.contentLayoutGuide.trailingAnchor),
stackView.topAnchor.constraint(equalTo: scrollView.contentLayoutGuide.topAnchor),
stackView.bottomAnchor.constraint(equalTo: scrollView.contentLayoutGuide.bottomAnchor)
])
for index in 1...8 {
let textView = UITextView()
textView.text = "\(index)"
textView.backgroundColor = .lightGray
textView.textColor = UIColor.black
textView.isEditable = true
// if set isScrollEnabled to true, it works fine
textView.isScrollEnabled = false
stackView.addSubview(textView)
textView.translatesAutoresizingMaskIntoConstraints = false
NSLayoutConstraint.activate([
textView.topAnchor.constraint(equalTo: stackView.topAnchor,
constant: (eachHeight + gap) * CGFloat(index-1)),
textView.widthAnchor.constraint(equalTo: stackView.widthAnchor),
textView.heightAnchor.constraint(equalToConstant: eachHeight)
])
}
}
}
================================================
FILE: Example/IQKeyboardManagerSwiftExample/ViewController/OptionsViewController.swift
================================================
//
// OptionsViewController.swift
// https://github.com/hackiftekhar/IQKeyboardManager
// Copyright (c) 2013-24 Iftekhar Qurashi.
//
// Permission is hereby granted, free of charge, to any person obtaining a copy
// of this software and associated documentation files (the "Software"), to deal
// in the Software without restriction, including without limitation the rights
// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
// copies of the Software, and to permit persons to whom the Software is
// furnished to do so, subject to the following conditions:
//
// The above copyright notice and this permission notice shall be included in
// all copies or substantial portions of the Software.
//
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
// THE SOFTWARE.
import UIKit
protocol OptionsViewControllerDelegate: AnyObject {
func optionsViewController(_ controller: OptionsViewController, index: NSInteger)
}
class OptionsViewController: UITableViewController {
weak var delegate: OptionsViewControllerDelegate?
var options = [String]()
var selectedIndex: Int = 0
override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return self.options.count
}
override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
guard let cell = tableView.dequeueReusableCell(withIdentifier: "OptionTableViewCell",
for: indexPath) as? OptionTableViewCell else {
fatalError("Can't dequeue cell")
}
cell.labelOption.text = options[indexPath.row]
if indexPath.row == self.selectedIndex {
cell.accessoryType = .checkmark
} else {
cell.accessoryType = .none
}
return cell
}
override func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
tableView.deselectRow(at: indexPath, animated: true)
selectedIndex = indexPath.row
delegate?.optionsViewController(self, index: indexPath.row)
tableView.reloadRows(at: tableView.indexPathsForVisibleRows!, with: .automatic)
}
}
================================================
FILE: Example/IQKeyboardManagerSwiftExample/ViewController/PageViewController.swift
================================================
//
// PageViewController.swift
// https://github.com/hackiftekhar/IQKeyboardManager
// Copyright (c) 2013-24 Iftekhar Qurashi.
//
// Permission is hereby granted, free of charge, to any person obtaining a copy
// of this software and associated documentation files (the "Software"), to deal
// in the Software without restriction, including without limitation the rights
// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
// copies of the Software, and to permit persons to whom the Software is
// furnished to do so, subject to the following conditions:
//
// The above copyright notice and this permission notice shall be included in
// all copies or substantial portions of the Software.
//
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
// THE SOFTWARE.
import UIKit
class PageViewController: BaseViewController {
}
================================================
FILE: Example/IQKeyboardManagerSwiftExample/ViewController/PopoverViewController.swift
================================================
//
// PopoverViewController.swift
// https://github.com/hackiftekhar/IQKeyboardManager
// Copyright (c) 2013-24 Iftekhar Qurashi.
//
// Permission is hereby granted, free of charge, to any person obtaining a copy
// of this software and associated documentation files (the "Software"), to deal
// in the Software without restriction, including without limitation the rights
// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
// copies of the Software, and to permit persons to whom the Software is
// furnished to do so, subject to the following conditions:
//
// The above copyright notice and this permission notice shall be included in
// all copies or substantial portions of the Software.
//
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
// THE SOFTWARE.
import UIKit
class PopoverViewController: BaseViewController {
}
================================================
FILE: Example/IQKeyboardManagerSwiftExample/ViewController/RefreshLayoutViewController.swift
================================================
//
// RefreshLayoutViewController.swift
// https://github.com/hackiftekhar/IQKeyboardManager
// Copyright (c) 2013-24 Iftekhar Qurashi.
//
// Permission is hereby granted, free of charge, to any person obtaining a copy
// of this software and associated documentation files (the "Software"), to deal
// in the Software without restriction, including without limitation the rights
// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
// copies of the Software, and to permit persons to whom the Software is
// furnished to do so, subject to the following conditions:
//
// The above copyright notice and this permission notice shall be included in
// all copies or substantial portions of the Software.
//
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
// THE SOFTWARE.
import UIKit
import IQKeyboardManagerSwift
class RefreshLayoutViewController: BaseViewController {
@IBOutlet var textViewHeightConstraint: NSLayoutConstraint!
@IBAction func stepperChanged(_ sender: UIStepper) {
let finalCurve = UIView.AnimationOptions.beginFromCurrentState.union(.init(rawValue: 7))
let animationDuration: TimeInterval = 0.3
UIView.animate(withDuration: animationDuration, delay: 0, options: finalCurve, animations: {
self.textViewHeightConstraint.constant = CGFloat(sender.value)
self.view.setNeedsLayout()
self.view.layoutIfNeeded()
}, completion: nil)
}
@IBAction func reloadLayoutAction(_ sender: UIButton) {
IQKeyboardManager.shared.reloadLayoutIfNeeded()
}
}
================================================
FILE: Example/IQKeyboardManagerSwiftExample/ViewController/ReloadLayout1892ViewController.swift
================================================
//
// ReloadLayout1892ViewController.swift
// https://github.com/hackiftekhar/IQKeyboardManager
// Copyright (c) 2013-24 Iftekhar Qurashi.
//
// Permission is hereby granted, free of charge, to any person obtaining a copy
// of this software and associated documentation files (the "Software"), to deal
// in the Software without restriction, including without limitation the rights
// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
// copies of the Software, and to permit persons to whom the Software is
// furnished to do so, subject to the following conditions:
//
// The above copyright notice and this permission notice shall be included in
// all copies or substantial portions of the Software.
//
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
// THE SOFTWARE.
import UIKit
import IQKeyboardManagerSwift
class ReloadLayout1892ViewController: BaseViewController {
@IBOutlet weak var textView: UITextView!
}
extension ViewController: UITextViewDelegate {
func textViewDidChange(_ textView: UITextView) {
IQKeyboardManager.shared.reloadLayoutIfNeeded()
}
}
================================================
FILE: Example/IQKeyboardManagerSwiftExample/ViewController/SafeAreaViewController.swift
================================================
//
// SafeAreaViewController.swift
// https://github.com/hackiftekhar/IQKeyboardManager
// Copyright (c) 2013-24 Iftekhar Qurashi.
//
// Permission is hereby granted, free of charge, to any person obtaining a copy
// of this software and associated documentation files (the "Software"), to deal
// in the Software without restriction, including without limitation the rights
// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
// copies of the Software, and to permit persons to whom the Software is
// furnished to do so, subject to the following conditions:
//
// The above copyright notice and this permission notice shall be included in
// all copies or substantial portions of the Software.
//
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
// THE SOFTWARE.
import UIKit
class SafeAreaViewController: BaseViewController {
}
================================================
FILE: Example/IQKeyboardManagerSwiftExample/ViewController/ScrollViewController.swift
================================================
//
// ScrollViewController.swift
// https://github.com/hackiftekhar/IQKeyboardManager
// Copyright (c) 2013-24 Iftekhar Qurashi.
//
// Permission is hereby granted, free of charge, to any person obtaining a copy
// of this software and associated documentation files (the "Software"), to deal
// in the Software without restriction, including without limitation the rights
// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
// copies of the Software, and to permit persons to whom the Software is
// furnished to do so, subject to the following conditions:
//
// The above copyright notice and this permission notice shall be included in
// all copies or substantial portions of the Software.
//
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
// THE SOFTWARE.
import UIKit
import IQKeyboardManagerSwift
class ScrollViewController: BaseViewController, UITextFieldDelegate, UITextViewDelegate {
@IBOutlet var scrollViewDemo: UIScrollView!
@IBOutlet var simpleTableView: UITableView!
@IBOutlet var scrollViewOfTableViews: UIScrollView!
@IBOutlet var tableViewInsideScrollView: UITableView!
@IBOutlet var scrollViewInsideScrollView: UIScrollView!
@IBOutlet var topTextField: UITextField!
@IBOutlet var bottomTextField: UITextField!
@IBOutlet var topTextView: UITextView!
@IBOutlet var bottomTextView: UITextView!
override func viewDidLoad() {
super.viewDidLoad()
scrollViewInsideScrollView.iq.ignoreScrollingAdjustment = true
}
deinit {
topTextField = nil
bottomTextField = nil
topTextView = nil
bottomTextView = nil
}
}
extension ScrollViewController: UITableViewDelegate, UITableViewDataSource {
func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return 5
}
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let identifier = "\(indexPath.section) \(indexPath.row)"
var cell = tableView.dequeueReusableCell(withIdentifier: identifier)
if cell == nil {
cell = UITableViewCell(style: .default, reuseIdentifier: identifier)
cell?.selectionStyle = .none
cell?.backgroundColor = UIColor.clear
let textField = UITextField(frame: cell!.contentView.bounds.insetBy(dx: 5, dy: 5))
textField.autoresizingMask = [.flexibleBottomMargin, .flexibleTopMargin, .flexibleWidth]
textField.placeholder = identifier
textField.borderStyle = .roundedRect
cell?.contentView.addSubview(textField)
}
return cell!
}
}
================================================
FILE: Example/IQKeyboardManagerSwiftExample/ViewController/SearchViewController.swift
================================================
//
// SearchViewController.swift
// https://github.com/hackiftekhar/IQKeyboardManager
// Copyright (c) 2013-24 Iftekhar Qurashi.
//
// Permission is hereby granted, free of charge, to any person obtaining a copy
// of this software and associated documentation files (the "Software"), to deal
// in the Software without restriction, including without limitation the rights
// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
// copies of the Software, and to permit persons to whom the Software is
// furnished to do so, subject to the following conditions:
//
// The above copyright notice and this permission notice shall be included in
// all copies or substantial portions of the Software.
//
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
// THE SOFTWARE.
import UIKit
class SearchViewController: BaseTableViewController, UISearchResultsUpdating, UISearchBarDelegate {
let dataList = [["name": "David Smith", "email": "david@example.com"],
["name": "Kevin John", "email": "kjohn@example.com"],
["name": "Jacob Brown", "email": "jacobb@example.com"],
["name": "Paul Johnson", "email": "johnsonp@example.com"],
["name": "Sam William", "email": "willsam@example.com"],
["name": "Brian Taylor", "email": "btaylor@example.com"],
["name": "Charles Smith", "email": "charless@example.com"],
["name": "Andrew White", "email": "awhite@example.com"],
["name": "Matt Thomas", "email": "mthomas@example.com"],
["name": "Michael Clark", "email": "clarkm@example.com"]]
var filteredList = [[String: String]]()
var searchController: UISearchController!
override func viewDidLoad() {
super.viewDidLoad()
self.searchController = UISearchController(searchResultsController: nil)
// self.searchController.hidesNavigationBarDuringPresentation = false
self.searchController.searchResultsUpdater = self
self.searchController.obscuresBackgroundDuringPresentation = false
self.searchController.searchBar.scopeButtonTitles = ["All", "Name", "Email"]
self.searchController.searchBar.delegate = self
self.searchController.searchBar.sizeToFit()
if #available(iOS 11.0, *) {
navigationItem.searchController = searchController
} else {
self.tableView.tableHeaderView = self.searchController.searchBar
}
}
func searchForText(_ searchText: String?, scope: Int) {
guard let text = searchText, !text.isEmpty else {
self.filteredList = self.dataList
return
}
if scope == 0 {
self.filteredList = self.dataList.filter({ (obj: [String: String]) -> Bool in
if obj["name"]?.contains(text) == true || obj["email"]?.contains(text) == true {
return true
} else {
return false
}
})
} else if scope == 1 {
self.filteredList = self.dataList.filter({ (obj: [String: String]) -> Bool in
if obj["name"]?.contains(text) == true || obj["email"]?.contains(text) == true {
return true
} else {
return false
}
})
} else if scope == 2 {
self.filteredList = self.dataList.filter({ (obj: [String: String]) -> Bool in
if obj["email"]?.contains(text) == true {
return true
} else {
return false
}
})
}
}
func updateSearchResults(for searchController: UISearchController) {
self.searchForText(searchController.searchBar.text, scope: searchController.searchBar.selectedScopeButtonIndex)
self.tableView.reloadData()
}
func searchBar(_ searchBar: UISearchBar, selectedScopeButtonIndexDidChange selectedScope: Int) {
self.updateSearchResults(for: self.searchController)
}
// MARK: - Table view data source
override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
if searchController.isActive == false {
return dataList.count
} else {
return filteredList.count
}
}
override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
var cell = tableView.dequeueReusableCell(withIdentifier: "UITableViewCell")
if cell == nil {
cell = UITableViewCell(style: .subtitle, reuseIdentifier: "UITableViewCell")
}
if searchController.isActive == false {
cell?.textLabel?.text = dataList[indexPath.row]["name"]
cell?.detailTextLabel?.text = dataList[indexPath.row]["email"]
} else {
cell?.textLabel?.text = filteredList[indexPath.row]["name"]
cell?.detailTextLabel?.text = filteredList[indexPath.row]["email"]
}
return cell!
}
}
================================================
FILE: Example/IQKeyboardManagerSwiftExample/ViewController/SettingsViewController+TableView.swift
================================================
//
// SettingsViewController+TableView.swift
// https://github.com/hackiftekhar/IQKeyboardManager
// Copyright (c) 2013-24 Iftekhar Qurashi.
//
// Permission is hereby granted, free of charge, to any person obtaining a copy
// of this software and associated documentation files (the "Software"), to deal
// in the Software without restriction, including without limitation the rights
// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
// copies of the Software, and to permit persons to whom the Software is
// furnished to do so, subject to the following conditions:
//
// The above copyright notice and this permission notice shall be included in
// all copies or substantial portions of the Software.
//
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
// THE SOFTWARE.
import UIKit
import IQKeyboardManagerSwift
import IQKeyboardToolbarManager
extension SettingsViewController {
override func tableView(_ tableView: UITableView, estimatedHeightForRowAt indexPath: IndexPath) -> CGFloat {
return 80
}
override func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat {
return UITableView.automaticDimension
}
override func numberOfSections(in tableView: UITableView) -> Int {
return sectionTitles.count
}
override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
switch section {
case 0:
if IQKeyboardManager.shared.isEnabled == true {
let properties = keyboardManagerProperties[section]
return properties.count
} else {
return 1
}
case 1:
if IQKeyboardToolbarManager.shared.isEnabled == false {
return 1
} else if IQKeyboardToolbarManager.shared
.toolbarConfiguration.placeholderConfiguration.showPlaceholder == false {
return 4
} else {
let properties = keyboardManagerProperties[section]
return properties.count
}
case 2:
if IQKeyboardManager.shared.keyboardConfiguration.overrideAppearance == true {
let properties = keyboardManagerProperties[section]
return properties.count
} else {
return 1
}
case 3, 4, 5:
let properties = keyboardManagerProperties[section]
return properties.count
default:
return 0
}
}
override func tableView(_ tableView: UITableView, titleForHeaderInSection section: Int) -> String? {
return sectionTitles[section]
}
// swiftlint:disable cyclomatic_complexity
// swiftlint:disable function_body_length
override func tableView(_ tableView: UITableView,
cellForRowAt indexPath: IndexPath) -> UITableViewCell {
switch indexPath.section {
case 0:
switch indexPath.row {
case 0:
guard let cell = tableView.dequeueReusableCell(withIdentifier: "SwitchTableViewCell",
for: indexPath) as? SwitchTableViewCell else {
fatalError("Can't dequeue cell")
}
cell.switchEnable.isEnabled = true
cell.labelTitle.text = keyboardManagerProperties[indexPath.section][indexPath.row]
cell.labelSubtitle.text = keyboardManagerPropertyDetails[indexPath.section][indexPath.row]
cell.switchEnable.isOn = IQKeyboardManager.shared.isEnabled
cell.switchEnable.removeTarget(nil, action: nil, for: .allEvents)
cell.switchEnable.addTarget(self, action: #selector(self.enableAction(_:)), for: .valueChanged)
return cell
case 1:
guard let cell = tableView.dequeueReusableCell(withIdentifier: "StepperTableViewCell",
for: indexPath) as? StepperTableViewCell else {
fatalError("Can't dequeue cell")
}
cell.labelTitle.text = keyboardManagerProperties[indexPath.section][indexPath.row]
cell.labelSubtitle.text = keyboardManagerPropertyDetails[indexPath.section][indexPath.row]
cell.stepper.value = Double(IQKeyboardManager.shared.keyboardDistance)
let distance = IQKeyboardManager.shared.keyboardDistance
let text: String = NSString(format: "%.0f", distance) as String
cell.labelStepperValue.text = text
cell.stepper.removeTarget(nil, action: nil, for: .allEvents)
cell.stepper.addTarget(self, action: #selector(self.keyboardDistanceFromTextFieldAction(_:)),
for: .valueChanged)
return cell
case 2:
guard let cell = tableView.dequeueReusableCell(withIdentifier: "SwitchTableViewCell",
for: indexPath) as? SwitchTableViewCell else {
fatalError("Can't dequeue cell")
}
cell.switchEnable.isEnabled = true
cell.labelTitle.text = keyboardManagerProperties[indexPath.section][indexPath.row]
cell.labelSubtitle.text = keyboardManagerPropertyDetails[indexPath.section][indexPath.row]
cell.switchEnable.isOn = IQKeyboardManager.shared.layoutIfNeededOnUpdate
cell.switchEnable.removeTarget(nil, action: nil, for: .allEvents)
cell.switchEnable.addTarget(self, action: #selector(self.layoutIfNeededOnUpdateAction(_:)),
for: .valueChanged)
return cell
default: break
}
case 1:
switch indexPath.row {
case 0:
guard let cell = tableView.dequeueReusableCell(withIdentifier: "SwitchTableViewCell",
for: indexPath) as? SwitchTableViewCell else {
fatalError("Can't dequeue cell")
}
cell.switchEnable.isEnabled = true
cell.labelTitle.text = keyboardManagerProperties[indexPath.section][indexPath.row]
cell.labelSubtitle.text = keyboardManagerPropertyDetails[indexPath.section][indexPath.row]
cell.switchEnable.isOn = IQKeyboardToolbarManager.shared.isEnabled
cell.switchEnable.removeTarget(nil, action: nil, for: .allEvents)
cell.switchEnable.addTarget(self, action: #selector(self.enableAutoToolbarAction(_:)),
for: .valueChanged)
return cell
case 1:
guard let cell = tableView.dequeueReusableCell(withIdentifier: "NavigationTableViewCell",
for: indexPath) as? NavigationTableViewCell else {
fatalError("Can't dequeue cell")
}
cell.labelTitle.text = keyboardManagerProperties[indexPath.section][indexPath.row]
cell.labelSubtitle.text = keyboardManagerPropertyDetails[indexPath.section][indexPath.row]
return cell
case 2:
guard let cell = tableView.dequeueReusableCell(withIdentifier: "SwitchTableViewCell",
for: indexPath) as? SwitchTableViewCell else {
fatalError("Can't dequeue cell")
}
cell.switchEnable.isEnabled = true
cell.labelTitle.text = keyboardManagerProperties[indexPath.section][indexPath.row]
cell.labelSubtitle.text = keyboardManagerPropertyDetails[indexPath.section][indexPath.row]
cell.switchEnable.isOn = IQKeyboardToolbarManager.shared.toolbarConfiguration.useTextInputViewTintColor
cell.switchEnable.removeTarget(nil, action: nil, for: .allEvents)
cell.switchEnable.addTarget(self, action: #selector(self.shouldToolbarUsesTextFieldTintColorAction(_:)),
for: .valueChanged)
return cell
case 3:
guard let cell = tableView.dequeueReusableCell(withIdentifier: "SwitchTableViewCell",
for: indexPath) as? SwitchTableViewCell else {
fatalError("Can't dequeue cell")
}
cell.switchEnable.isEnabled = true
let subtitle = keyboardManagerPropertyDetails[indexPath.section][indexPath.row]
cell.labelTitle.text = keyboardManagerProperties[indexPath.section][indexPath.row]
cell.labelSubtitle.text = subtitle
let toolbarConfig = IQKeyboardToolbarManager.shared.toolbarConfiguration
cell.switchEnable.isOn = toolbarConfig.placeholderConfiguration.showPlaceholder
cell.switchEnable.removeTarget(nil, action: nil, for: .allEvents)
cell.switchEnable.addTarget(self, action: #selector(self.shouldShowToolbarPlaceholder(_:)),
for: .valueChanged)
return cell
case 4:
guard let cell = tableView.dequeueReusableCell(withIdentifier: "NavigationTableViewCell",
for: indexPath) as? NavigationTableViewCell else {
fatalError("Can't dequeue cell")
}
cell.labelTitle.text = keyboardManagerProperties[indexPath.section][indexPath.row]
cell.labelSubtitle.text = keyboardManagerPropertyDetails[indexPath.section][indexPath.row]
return cell
case 5:
guard let cell = tableView.dequeueReusableCell(withIdentifier: "ColorTableViewCell",
for: indexPath) as? ColorTableViewCell else {
fatalError("Can't dequeue cell")
}
cell.labelTitle.text = keyboardManagerProperties[indexPath.section][indexPath.row]
cell.labelSubtitle.text = keyboardManagerPropertyDetails[indexPath.section][indexPath.row]
cell.selectedColorView.backgroundColor = IQKeyboardToolbarManager.shared.toolbarConfiguration.tintColor
cell.selectedColorView.layer.borderColor = UIColor.lightGray.cgColor
cell.selectedColorView.layer.borderWidth = 1.0
return cell
case 6:
guard let cell = tableView.dequeueReusableCell(withIdentifier: "ImageSwitchTableViewCell",
for: indexPath) as? ImageSwitchTableViewCell else {
fatalError("Can't dequeue cell")
}
cell.switchEnable.isEnabled = true
cell.labelTitle.text = keyboardManagerProperties[indexPath.section][indexPath.row]
cell.labelSubtitle.text = keyboardManagerPropertyDetails[indexPath.section][indexPath.row]
let doneButtonConfiguration = IQKeyboardToolbarManager.shared
.toolbarConfiguration.doneBarButtonConfiguration
cell.arrowImageView.image = doneButtonConfiguration?.image
cell.switchEnable.isOn = doneButtonConfiguration?.image != nil
cell.switchEnable.removeTarget(nil, action: nil, for: .allEvents)
cell.switchEnable.addTarget(self,
action: #selector(self.toolbarDoneBarButtonItemImage(_:)),
for: .valueChanged)
return cell
case 7:
guard let cell = tableView.dequeueReusableCell(withIdentifier: "TextFieldTableViewCell",
for: indexPath) as? TextFieldTableViewCell else {
fatalError("Can't dequeue cell")
}
cell.labelTitle.text = keyboardManagerProperties[indexPath.section][indexPath.row]
cell.labelSubtitle.text = keyboardManagerPropertyDetails[indexPath.section][indexPath.row]
cell.textField.text = IQKeyboardToolbarManager.shared
.toolbarConfiguration.doneBarButtonConfiguration?.title
cell.textField.tag = 17
cell.textField.delegate = self
return cell
default: break
}
case 2:
switch indexPath.row {
case 0:
guard let cell = tableView.dequeueReusableCell(withIdentifier: "SwitchTableViewCell",
for: indexPath) as? SwitchTableViewCell else {
fatalError("Can't dequeue cell")
}
cell.switchEnable.isEnabled = true
cell.labelTitle.text = keyboardManagerProperties[indexPath.section][indexPath.row]
cell.labelSubtitle.text = keyboardManagerPropertyDetails[indexPath.section][indexPath.row]
cell.switchEnable.isOn = IQKeyboardManager.shared.keyboardConfiguration.overrideAppearance
cell.switchEnable.removeTarget(nil, action: nil, for: .allEvents)
cell.switchEnable.addTarget(self,
action: #selector(self.overrideKeyboardAppearanceAction(_:)),
for: .valueChanged)
return cell
case 1:
guard let cell = tableView.dequeueReusableCell(withIdentifier: "NavigationTableViewCell",
for: indexPath) as? NavigationTableViewCell else {
fatalError("Can't dequeue cell")
}
cell.labelTitle.text = keyboardManagerProperties[indexPath.section][indexPath.row]
cell.labelSubtitle.text = keyboardManagerPropertyDetails[indexPath.section][indexPath.row]
return cell
default:
break
}
case 3:
switch indexPath.row {
case 0:
guard let cell = tableView.dequeueReusableCell(withIdentifier: "SwitchTableViewCell",
for: indexPath) as? SwitchTableViewCell else {
fatalError("Can't dequeue cell")
}
cell.switchEnable.isEnabled = true
cell.labelTitle.text = keyboardManagerProperties[indexPath.section][indexPath.row]
cell.labelSubtitle.text = keyboardManagerPropertyDetails[indexPath.section][indexPath.row]
cell.switchEnable.isOn = IQKeyboardManager.shared.resignOnTouchOutside
cell.switchEnable.removeTarget(nil, action: nil, for: .allEvents)
cell.switchEnable.addTarget(self,
action: #selector(self.shouldResignOnTouchOutsideAction(_:)),
for: .valueChanged)
return cell
default: break
}
case 4:
switch indexPath.row {
case 0:
guard let cell = tableView.dequeueReusableCell(withIdentifier: "SwitchTableViewCell",
for: indexPath) as? SwitchTableViewCell else {
fatalError("Can't dequeue cell")
}
cell.switchEnable.isEnabled = true
cell.labelTitle.text = keyboardManagerProperties[indexPath.section][indexPath.row]
cell.labelSubtitle.text = keyboardManagerPropertyDetails[indexPath.section][indexPath.row]
cell.switchEnable.isOn = IQKeyboardToolbarManager.shared.playInputClicks
cell.switchEnable.removeTarget(nil, action: nil, for: .allEvents)
cell.switchEnable.addTarget(self, action: #selector(self.shouldPlayInputClicksAction(_:)),
for: .valueChanged)
return cell
default: break
}
case 5:
switch indexPath.row {
case 0:
guard let cell = tableView.dequeueReusableCell(withIdentifier: "SwitchTableViewCell",
for: indexPath) as? SwitchTableViewCell else {
fatalError("Can't dequeue cell")
}
cell.switchEnable.isEnabled = true
cell.labelTitle.text = keyboardManagerProperties[indexPath.section][indexPath.row]
cell.labelSubtitle.text = keyboardManagerPropertyDetails[indexPath.section][indexPath.row]
cell.switchEnable.isOn = IQKeyboardManager.shared.isDebuggingEnabled
cell.switchEnable.removeTarget(nil, action: nil, for: .allEvents)
cell.switchEnable.addTarget(self, action: #selector(self.enableDebugging(_:)), for: .valueChanged)
return cell
default: break
}
default: break
}
return UITableViewCell()
}
// swiftlint:enable cyclomatic_complexity
// swiftlint:enable function_body_length
}
================================================
FILE: Example/IQKeyboardManagerSwiftExample/ViewController/SettingsViewController.swift
================================================
//
// SettingsViewController.swift
// https://github.com/hackiftekhar/IQKeyboardManager
// Copyright (c) 2013-24 Iftekhar Qurashi.
//
// Permission is hereby granted, free of charge, to any person obtaining a copy
// of this software and associated documentation files (the "Software"), to deal
// in the Software without restriction, including without limitation the rights
// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
// copies of the Software, and to permit persons to whom the Software is
// furnished to do so, subject to the following conditions:
//
// The above copyright notice and this permission notice shall be included in
// all copies or substantial portions of the Software.
//
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
// THE SOFTWARE.
import UIKit
import IQKeyboardManagerSwift
import IQKeyboardToolbar
import IQKeyboardToolbarManager
class SettingsViewController: UITableViewController {
let sectionTitles = ["UIKeyboard handling",
"IQToolbar handling",
"UIKeyboard appearance overriding",
"Resign first responder handling",
"UISound handling",
"IQKeyboardManager Debug"]
let keyboardManagerProperties = [
["Enable",
"Keyboard Distance From TextField",
"Layout If Needed on Update"],
["Enable AutoToolbar",
"Toolbar Manage Behaviour",
"Should Toolbar Uses TextField TintColor",
"Should Show TextField Placeholder",
"Placeholder Font",
"Toolbar Tint Color",
"Toolbar Done BarButtonItem Image",
"Toolbar Done Button Text"],
["Override Keyboard Appearance",
"UIKeyboard Appearance"],
["Should Resign On Touch Outside"],
["Should Play Input Clicks"],
["Debugging logs in Console"]
]
let keyboardManagerPropertyDetails = [
["Enable/Disable IQKeyboardManager",
"Set keyboard distance from textField",
"Layout the whole view on change"],
["Automatic add the IQToolbar on UIKeyboard",
"AutoToolbar previous/next button managing behaviour",
"Uses textField's tintColor property for IQToolbar",
"Add the textField's placeholder text on IQToolbar",
"UIFont for IQToolbar placeholder text",
"Override toolbar tintColor property",
"Replace toolbar done button text with provided image",
"Override toolbar done button text"],
["Override the keyboardAppearance for all UITextField/UITextView",
"All the UITextField keyboardAppearance is set using this property"],
["Resigns Keyboard on touching outside of UITextField/View"],
["Plays inputClick sound on next/previous/done click"],
["Setting enableDebugging to YES/No to turn on/off debugging mode"]
]
var selectedIndexPathForOptions: IndexPath?
@IBAction func doneAction(_ sender: UIBarButtonItem) {
self.dismiss(animated: true, completion: nil)
}
/** UIKeyboard Handling */
@objc func enableAction(_ sender: UISwitch) {
IQKeyboardManager.shared.isEnabled = sender.isOn
self.tableView.reloadSections(IndexSet(integer: 0), with: .fade)
}
@objc func keyboardDistanceFromTextFieldAction(_ sender: UIStepper) {
IQKeyboardManager.shared.keyboardDistance = CGFloat(sender.value)
self.tableView.reloadRows(at: [IndexPath(row: 1, section: 0)], with: .none)
}
@objc func layoutIfNeededOnUpdateAction(_ sender: UISwitch) {
IQKeyboardManager.shared.layoutIfNeededOnUpdate = sender.isOn
self.tableView.reloadRows(at: [IndexPath(row: 2, section: 0)], with: .none)
}
/** IQToolbar handling */
@objc func enableAutoToolbarAction(_ sender: UISwitch) {
IQKeyboardToolbarManager.shared.isEnabled = sender.isOn
self.tableView.reloadSections(IndexSet(integer: 1), with: .fade)
}
@objc func shouldToolbarUsesTextFieldTintColorAction(_ sender: UISwitch) {
IQKeyboardToolbarManager.shared.toolbarConfiguration.useTextInputViewTintColor = sender.isOn
}
@objc func shouldShowToolbarPlaceholder(_ sender: UISwitch) {
IQKeyboardToolbarManager.shared.toolbarConfiguration.placeholderConfiguration.showPlaceholder = sender.isOn
self.tableView.reloadSections(IndexSet(integer: 1), with: .fade)
}
@objc func toolbarDoneBarButtonItemImage(_ sender: UISwitch) {
if sender.isOn {
let config = IQBarButtonItemConfiguration(image: UIImage(named: "IQButtonBarArrowDown")!)
IQKeyboardToolbarManager.shared.toolbarConfiguration.doneBarButtonConfiguration = config
} else {
IQKeyboardToolbarManager.shared.toolbarConfiguration.doneBarButtonConfiguration = nil
}
self.tableView.reloadSections(IndexSet(integer: 1), with: .fade)
}
/** "Keyboard appearance overriding */
@objc func overrideKeyboardAppearanceAction(_ sender: UISwitch) {
IQKeyboardManager.shared.keyboardConfiguration.overrideAppearance = sender.isOn
self.tableView.reloadSections(IndexSet(integer: 2), with: .fade)
}
/** Resign first responder handling */
@objc func shouldResignOnTouchOutsideAction(_ sender: UISwitch) {
IQKeyboardManager.shared.resignOnTouchOutside = sender.isOn
}
/** Sound handling */
@objc func shouldPlayInputClicksAction(_ sender: UISwitch) {
IQKeyboardToolbarManager.shared.playInputClicks = sender.isOn
}
/** Debugging */
@objc func enableDebugging(_ sender: UISwitch) {
IQKeyboardManager.shared.isDebuggingEnabled = sender.isOn
IQKeyboardToolbarManager.shared.isDebuggingEnabled = sender.isOn
}
override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
guard let identifier = segue.identifier else {
return
}
if identifier.elementsEqual("OptionsViewController"),
let controller = segue.destination as? OptionsViewController,
let cell = sender as? UITableViewCell {
controller.delegate = self
selectedIndexPathForOptions = self.tableView.indexPath(for: cell)
guard let selectedIndexPath = selectedIndexPathForOptions else {
return
}
if selectedIndexPath.section == 1 && selectedIndexPath.row == 1 {
controller.title = "Toolbar Manage Behaviour"
controller.options = ["IQAutoToolbar By Subviews", "IQAutoToolbar By Tag", "IQAutoToolbar By Position"]
controller.selectedIndex = IQKeyboardToolbarManager.shared.toolbarConfiguration.manageBehavior.hashValue
} else if selectedIndexPath.section == 1 && selectedIndexPath.row == 4 {
controller.title = "Fonts"
controller.options = ["Bold System Font", "Italic system font", "Regular"]
controller.selectedIndex = IQKeyboardToolbarManager.shared.toolbarConfiguration.manageBehavior.hashValue
let fonts = [UIFont.boldSystemFont(ofSize: 12),
UIFont.italicSystemFont(ofSize: 12),
UIFont.systemFont(ofSize: 12)]
if let placeholderFont = IQKeyboardToolbarManager.shared
.toolbarConfiguration.placeholderConfiguration.font {
if let index = fonts.firstIndex(of: placeholderFont) {
controller.selectedIndex = index
}
}
} else if selectedIndexPath.section == 2 && selectedIndexPath.row == 1 {
controller.title = "Keyboard Appearance"
controller.options = ["UIKeyboardAppearance Default",
"UIKeyboardAppearance Dark",
"UIKeyboardAppearance Light"]
controller.selectedIndex = IQKeyboardManager.shared.keyboardConfiguration.appearance.hashValue
}
}
}
}
@available(iOS 14.0, *)
extension SettingsViewController: UIColorPickerViewControllerDelegate {
func colorPickerViewControllerDidFinish(_ viewController: UIColorPickerViewController) {
viewController.dismiss(animated: true)
}
func colorPickerViewControllerDidSelectColor(_ viewController: UIColorPickerViewController) {
viewController.dismiss(animated: true)
let color = viewController.selectedColor
if color.isEqual(UIColor.clear) {
IQKeyboardToolbarManager.shared.toolbarConfiguration.tintColor = nil
} else {
IQKeyboardToolbarManager.shared.toolbarConfiguration.tintColor = color
}
self.tableView.reloadData()
}
func colorPickerViewController(_ viewController: UIColorPickerViewController,
didSelect color: UIColor, continuously: Bool) {
viewController.dismiss(animated: true)
if color.isEqual(UIColor.clear) {
IQKeyboardToolbarManager.shared.toolbarConfiguration.tintColor = nil
} else {
IQKeyboardToolbarManager.shared.toolbarConfiguration.tintColor = color
}
self.tableView.reloadData()
}
}
extension SettingsViewController: UITextFieldDelegate {
override func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
tableView.deselectRow(at: indexPath, animated: true)
if indexPath.section == 1 && indexPath.row == 5 {
if #available(iOS 14.0, *) {
let colorPicker = UIColorPickerViewController()
colorPicker.title = "Toolbar Tint Color"
colorPicker.supportsAlpha = false
colorPicker.delegate = self
colorPicker.modalPresentationStyle = .popover
colorPicker.popoverPresentationController?.sourceView = tableView.cellForRow(at: indexPath)
self.present(colorPicker, animated: true)
}
}
}
func textFieldDidEndEditing(_ textField: UITextField) {
if textField.tag == 17 {
if let title = textField.text, !title.isEmpty {
let config = IQBarButtonItemConfiguration(title: title)
IQKeyboardToolbarManager.shared.toolbarConfiguration.doneBarButtonConfiguration = config
} else {
IQKeyboardToolbarManager.shared.toolbarConfiguration.doneBarButtonConfiguration = nil
}
}
}
}
extension SettingsViewController: OptionsViewControllerDelegate {
nonisolated func optionsViewController(_ controller: OptionsViewController, index: NSInteger) {
DispatchQueue.main.async {
guard let selectedIndexPath = self.selectedIndexPathForOptions else {
return
}
if selectedIndexPath.section == 1 && selectedIndexPath.row == 1 {
let value = IQKeyboardToolbarManageBehavior(rawValue: index)!
IQKeyboardToolbarManager.shared.toolbarConfiguration.manageBehavior = value
} else if selectedIndexPath.section == 1 && selectedIndexPath.row == 4 {
let fonts = [UIFont.boldSystemFont(ofSize: 12),
UIFont.italicSystemFont(ofSize: 12),
UIFont.systemFont(ofSize: 12)]
IQKeyboardToolbarManager.shared.toolbarConfiguration.placeholderConfiguration.font = fonts[index]
} else if selectedIndexPath.section == 2 && selectedIndexPath.row == 1 {
IQKeyboardManager.shared.keyboardConfiguration.appearance = UIKeyboardAppearance(rawValue: index)!
}
}
}
}
================================================
FILE: Example/IQKeyboardManagerSwiftExample/ViewController/SpecialCaseViewController.swift
================================================
//
// SpecialCaseViewController.swift
// https://github.com/hackiftekhar/IQKeyboardManager
// Copyright (c) 2013-24 Iftekhar Qurashi.
//
// Permission is hereby granted, free of charge, to any person obtaining a copy
// of this software and associated documentation files (the "Software"), to deal
// in the Software without restriction, including without limitation the rights
// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
// copies of the Software, and to permit persons to whom the Software is
// furnished to do so, subject to the following conditions:
//
// The above copyright notice and this permission notice shall be included in
// all copies or substantial portions of the Software.
//
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
// THE SOFTWARE.
import UIKit
import IQKeyboardManagerSwift
import IQKeyboardToolbarManager
class SpecialCaseViewController: BaseViewController, UISearchBarDelegate, UITextFieldDelegate, UITextViewDelegate {
@IBOutlet var customWorkTextField: UITextField!
@IBOutlet var textField6: UITextField!
@IBOutlet var textField7: UITextField!
@IBOutlet var textField8: UITextField!
@IBOutlet var switchInteraction1: UISwitch!
@IBOutlet var switchInteraction2: UISwitch!
@IBOutlet var switchInteraction3: UISwitch!
@IBOutlet var switchEnabled1: UISwitch!
@IBOutlet var switchEnabled2: UISwitch!
@IBOutlet var switchEnabled3: UISwitch!
deinit {
customWorkTextField = nil
textField6 = nil
textField7 = nil
textField8 = nil
}
override func viewDidLoad() {
super.viewDidLoad()
textField6.isUserInteractionEnabled = switchInteraction1.isOn
textField7.isUserInteractionEnabled = switchInteraction2.isOn
textField8.isUserInteractionEnabled = switchInteraction3.isOn
textField6.isEnabled = switchEnabled1.isOn
textField7.isEnabled = switchEnabled2.isOn
textField8.isEnabled = switchEnabled3.isOn
updateUI()
}
@IBAction func showAlertClicked(_ barButton: UIBarButtonItem!) {
let message = "It doesn't affect UIAlertController (Doesn't add IQToolbar on it's textField"
let alertController = UIAlertController(title: "IQKeyboardManager",
message: message,
preferredStyle: .alert)
alertController.addAction(UIAlertAction(title: "OK", style: .cancel, handler: nil))
alertController.addTextField(configurationHandler: { (textField: UITextField) in
textField.placeholder = "Username"
})
alertController.addTextField(configurationHandler: { (textField: UITextField) in
textField.placeholder = "Password"
textField.isSecureTextEntry = true
})
self.present(alertController, animated: true, completion: nil)
}
func searchBarTextDidBeginEditing(_ searchBar: UISearchBar) {
searchBar.setShowsCancelButton(true, animated: true)
}
func searchBarTextDidEndEditing(_ searchBar: UISearchBar) {
searchBar.setShowsCancelButton(false, animated: true)
}
func searchBarCancelButtonClicked(_ searchBar: UISearchBar) {
searchBar.resignFirstResponder()
}
func updateUI() {
textField6.placeholder = (textField6.isEnabled ? "enabled" : "" ) + "," +
(textField6.isUserInteractionEnabled ? "userInteractionEnabled" : "" )
textField7.placeholder = (textField7.isEnabled ? "enabled" : "" ) + "," +
(textField7.isUserInteractionEnabled ? "userInteractionEnabled" : "" )
textField8.placeholder = (textField8.isEnabled ? "enabled" : "" ) + "," +
(textField8.isUserInteractionEnabled ? "userInteractionEnabled" : "" )
}
@IBAction func switch1UserInteractionAction(_ sender: UISwitch) {
textField6.isUserInteractionEnabled = sender.isOn
IQKeyboardToolbarManager.shared.reloadInputViews()
updateUI()
}
@IBAction func switch2UserInteractionAction(_ sender: UISwitch) {
textField7.isUserInteractionEnabled = sender.isOn
IQKeyboardToolbarManager.shared.reloadInputViews()
updateUI()
}
@IBAction func switch3UserInteractionAction(_ sender: UISwitch) {
textField8.isUserInteractionEnabled = sender.isOn
IQKeyboardToolbarManager.shared.reloadInputViews()
updateUI()
}
@IBAction func switch1Action(_ sender: UISwitch) {
textField6.isEnabled = sender.isOn
IQKeyboardToolbarManager.shared.reloadInputViews()
updateUI()
}
@IBAction func switch2Action(_ sender: UISwitch) {
textField7.isEnabled = sender.isOn
IQKeyboardToolbarManager.shared.reloadInputViews()
updateUI()
}
@IBAction func switch3Action(_ sender: UISwitch) {
textField8.isEnabled = sender.isOn
IQKeyboardToolbarManager.shared.reloadInputViews()
updateUI()
}
func textFieldShouldBeginEditing(_ textField: UITextField) -> Bool {
if textField == customWorkTextField {
let alertController = UIAlertController(title: "IQKeyboardManager",
message: "Do your custom work here",
preferredStyle: .alert)
alertController.addAction(UIAlertAction(title: "OK", style: .cancel, handler: nil))
self.present(alertController, animated: true, completion: nil)
return false
} else {
return true
}
}
func textFieldDidBeginEditing(_ textField: UITextField) {
}
func textFieldDidEndEditing(_ textField: UITextField) {
}
}
================================================
FILE: Example/IQKeyboardManagerSwiftExample/ViewController/StackViewController.swift
================================================
//
// StackViewController.swift
// https://github.com/hackiftekhar/IQKeyboardManager
// Copyright (c) 2013-24 Iftekhar Qurashi.
//
// Permission is hereby granted, free of charge, to any person obtaining a copy
// of this software and associated documentation files (the "Software"), to deal
// in the Software without restriction, including without limitation the rights
// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
// copies of the Software, and to permit persons to whom the Software is
// furnished to do so, subject to the following conditions:
//
// The above copyright notice and this permission notice shall be included in
// all copies or substantial portions of the Software.
//
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
// THE SOFTWARE.
import UIKit
class StackViewController: BaseViewController {
}
================================================
FILE: Example/IQKeyboardManagerSwiftExample/ViewController/TableViewContainerViewController.swift
================================================
//
// TableViewContainerViewController.swift
// https://github.com/hackiftekhar/IQKeyboardManager
// Copyright (c) 2013-24 Iftekhar Qurashi.
//
// Permission is hereby granted, free of charge, to any person obtaining a copy
// of this software and associated documentation files (the "Software"), to deal
// in the Software without restriction, including without limitation the rights
// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
// copies of the Software, and to permit persons to whom the Software is
// furnished to do so, subject to the following conditions:
//
// The above copyright notice and this permission notice shall be included in
// all copies or substantial portions of the Software.
//
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
// THE SOFTWARE.
import UIKit
class TableViewContainerViewController: BaseViewController {
}
================================================
FILE: Example/IQKeyboardManagerSwiftExample/ViewController/TableViewController.swift
================================================
//
// TableViewController.swift
// https://github.com/hackiftekhar/IQKeyboardManager
// Copyright (c) 2013-24 Iftekhar Qurashi.
//
// Permission is hereby granted, free of charge, to any person obtaining a copy
// of this software and associated documentation files (the "Software"), to deal
// in the Software without restriction, including without limitation the rights
// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
// copies of the Software, and to permit persons to whom the Software is
// furnished to do so, subject to the following conditions:
//
// The above copyright notice and this permission notice shall be included in
// all copies or substantial portions of the Software.
//
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
// THE SOFTWARE.
import UIKit
class TableViewController: BaseTableViewController {
}
================================================
FILE: Example/IQKeyboardManagerSwiftExample/ViewController/TableViewInContainerViewController.swift
================================================
//
// TableViewInContainerViewController.swift
// https://github.com/hackiftekhar/IQKeyboardManager
// Copyright (c) 2013-24 Iftekhar Qurashi.
//
// Permission is hereby granted, free of charge, to any person obtaining a copy
// of this software and associated documentation files (the "Software"), to deal
// in the Software without restriction, including without limitation the rights
// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
// copies of the Software, and to permit persons to whom the Software is
// furnished to do so, subject to the following conditions:
//
// The above copyright notice and this permission notice shall be included in
// all copies or substantial portions of the Software.
//
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
// THE SOFTWARE.
import UIKit
final class HeaderFooterView: UITableViewHeaderFooterView {
let textField: UITextField
override init(reuseIdentifier: String?) {
textField = UITextField(frame: CGRect(x: 15.0, y: 10.0, width: UIScreen.main.bounds.width - 30, height: 30.0))
super.init(reuseIdentifier: reuseIdentifier)
self.contentView.addSubview(textField)
}
required init?(coder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}
}
class TableViewInContainerViewController: BaseViewController, UITableViewDataSource, UITableViewDelegate {
@IBOutlet private var tableView: UITableView!
func tableView(_ tableView: UITableView, heightForHeaderInSection section: Int) -> CGFloat {
return 50
}
func tableView(_ tableView: UITableView, heightForFooterInSection section: Int) -> CGFloat {
return 50
}
func tableView(_ tableView: UITableView, viewForHeaderInSection section: Int) -> UIView? {
let view: HeaderFooterView = tableView.dequeueHeaderFooter(HeaderFooterView.self)
view.textField.placeholder = "\(section) Section Header"
return view
}
func tableView(_ tableView: UITableView, viewForFooterInSection section: Int) -> UIView? {
let view: HeaderFooterView = tableView.dequeueHeaderFooter(HeaderFooterView.self)
view.textField.placeholder = "\(section) Section Footer"
return view
}
func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return 5
}
func numberOfSections(in tableView: UITableView) -> Int {
return 5
}
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let identifier = "TestCell"
var cell = tableView.dequeueReusableCell(withIdentifier: identifier)
if cell == nil {
cell = UITableViewCell(style: .default, reuseIdentifier: identifier)
cell?.backgroundColor = UIColor.clear
let contentView: UIView! = cell?.contentView
let textField = UITextField(frame: CGRect(x: 10, y: 0, width: contentView.frame.size.width-20, height: 33))
textField.autoresizingMask = [.flexibleBottomMargin, .flexibleTopMargin, .flexibleWidth]
textField.center = contentView.center
textField.backgroundColor = UIColor.clear
textField.borderStyle = .roundedRect
textField.tag = 123
cell?.contentView.addSubview(textField)
}
let textField = cell?.viewWithTag(123) as? UITextField
textField?.placeholder = "Cell \(indexPath.section), \(indexPath.row)"
return cell!
}
}
================================================
FILE: Example/IQKeyboardManagerSwiftExample/ViewController/TestViewController.swift
================================================
//
// TestViewController.swift
// https://github.com/hackiftekhar/IQKeyboardManager
// Copyright (c) 2013-24 Iftekhar Qurashi.
//
// Permission is hereby granted, free of charge, to any person obtaining a copy
// of this software and associated documentation files (the "Software"), to deal
// in the Software without restriction, including without limitation the rights
// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
// copies of the Software, and to permit persons to whom the Software is
// furnished to do so, subject to the following conditions:
//
// The above copyright notice and this permission notice shall be included in
// all copies or substantial portions of the Software.
//
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
// THE SOFTWARE.
import UIKit
class TestViewController: BaseViewController {
}
================================================
FILE: Example/IQKeyboardManagerSwiftExample/ViewController/TextFieldHostingViewController.swift
================================================
//
// TextFieldHostingViewController.swift
// https://github.com/hackiftekhar/IQKeyboardManager
// Copyright (c) 2013-24 Iftekhar Qurashi.
//
// Permission is hereby granted, free of charge, to any person obtaining a copy
// of this software and associated documentation files (the "Software"), to deal
// in the Software without restriction, including without limitation the rights
// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
// copies of the Software, and to permit persons to whom the Software is
// furnished to do so, subject to the following conditions:
//
// The above copyright notice and this permission notice shall be included in
// all copies or substantial portions of the Software.
//
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
// THE SOFTWARE.
import UIKit
import SwiftUI
@available(iOS 15.0, *)
class TextFieldHostingViewController: UIHostingController {
required init?(coder: NSCoder) {
super.init(coder: coder, rootView: TextFieldView())
}
}
================================================
FILE: Example/IQKeyboardManagerSwiftExample/ViewController/TextFieldView.swift
================================================
//
// TextFieldView.swift
// DemoSwift
//
// Created by Iftekhar on 11/6/23.
// Copyright © 2023 Iftekhar. All rights reserved.
//
import SwiftUI
@available(iOS 15.0, *)
struct TextFieldView: View {
@State private var text1 = ""
@State private var text2 = ""
@State private var text3 = ""
@State private var text4 = ""
@State private var text5 = ""
@State private var text6 = ""
@State private var text7 = ""
@State private var text8 = ""
@State private var text9 = ""
@State private var text10 = ""
var body: some View {
VStack(spacing: 40) {
TextField("Text Field 1", text: $text1)
.background(Color.white)
TextField("Text Field 2", text: $text2)
.background(Color.white)
TextField("Text Field 3", text: $text3)
.background(Color.white)
TextField("Text Field 4", text: $text4)
.background(Color.white)
TextField("Text Field 5", text: $text5)
.background(Color.white)
// .toolbar {
// ToolbarItemGroup(placement: .keyboard) {
// Button("Click me 5!") {
// print("Clicked 5")
// }
// }
// }
TextField("Text Field 6", text: $text6)
.background(Color.white)
TextField("Text Field 7", text: $text7)
.background(Color.white)
TextField("Text Field 8", text: $text8)
.background(Color.white)
TextField("Text Field 9", text: $text9)
.background(Color.white)
TextField("Text Field 10", text: $text10)
.background(Color.white)
}
.padding()
.background(Color.yellow)
.navigationTitle("SwiftUI")
// .toolbar {
// ToolbarItemGroup(placement: .keyboard) {
// Button("Click me! All") {
// print("Clicked all")
// }
// }
// }
}
}
@available(iOS 15.0, *)
struct TextFieldView_Previews: PreviewProvider {
static var previews: some View {
TextFieldView()
}
}
================================================
FILE: Example/IQKeyboardManagerSwiftExample/ViewController/TextFieldViewController.swift
================================================
//
// TextFieldViewController.swift
// https://github.com/hackiftekhar/IQKeyboardManager
// Copyright (c) 2013-24 Iftekhar Qurashi.
//
// Permission is hereby granted, free of charge, to any person obtaining a copy
// of this software and associated documentation files (the "Software"), to deal
// in the Software without restriction, including without limitation the rights
// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
// copies of the Software, and to permit persons to whom the Software is
// furnished to do so, subject to the following conditions:
//
// The above copyright notice and this permission notice shall be included in
// all copies or substantial portions of the Software.
//
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
// THE SOFTWARE.
import UIKit
import IQKeyboardManagerSwift
import IQDropDownTextFieldSwift
import IQKeyboardNotification
import IQTextView
class TextFieldViewController: BaseViewController {
@IBOutlet var textField3: UITextField!
@IBOutlet var textView1: IQTextView!
@IBOutlet var textView2: UITextView!
@IBOutlet var textView3: UITextView!
let keyboardListener = IQKeyboardNotification()
@IBOutlet var dropDownTextField: IQDropDownTextField!
@objc func previousAction(_ sender: UITextField) {
print("PreviousAction")
}
@objc func nextAction(_ sender: UITextField) {
print("nextAction")
}
@objc func doneAction(_ sender: UITextField) {
print("doneAction")
}
deinit {
textView1 = nil
textField3 = nil
dropDownTextField = nil
}
override func viewDidLoad() {
super.viewDidLoad()
textView1.delegate = self
textView2.iq.enableMode = .disabled
#if swift(>=5.7)
if #available(iOS 16.0, *) {
textView3.isFindInteractionEnabled = true
}
#endif
// textView1.attributedPlaceholder = NSAttributedString(string: "Attributed string from code is supported too",
// attributes: [.foregroundColor: UIColor.red])
textField3.iq.toolbar.previousBarButton.setTarget(self, action: #selector(self.previousAction(_:)))
textField3.iq.toolbar.nextBarButton.setTarget(self, action: #selector(self.nextAction(_:)))
textField3.iq.toolbar.doneBarButton.setTarget(self, action: #selector(self.doneAction(_:)))
dropDownTextField.iq.distanceFromKeyboard = 150
let clearButton = UIBarButtonItem(title: "Clear", style: .plain, target: self, action: #selector(clearAction))
textField3.iq.toolbar.additionalTrailingItems = [clearButton]
var itemLists = [String]()
itemLists.append("Zero Line Of Code")
itemLists.append("No More UIScrollView")
itemLists.append("No More Subclasses")
itemLists.append("No More Manual Work")
itemLists.append("No More #imports")
itemLists.append("Device Orientation support")
itemLists.append("UITextField Category for Keyboard")
itemLists.append("Enable/Desable Keyboard Manager")
itemLists.append("Customize InputView support")
itemLists.append("IQTextView for placeholder support")
itemLists.append("Automanage keyboard toolbar")
itemLists.append("Can set keyboard and textFiled distance")
itemLists.append("Can resign on touching outside")
itemLists.append("Auto adjust textView's height")
itemLists.append("Adopt tintColor from textField")
itemLists.append("Customize keyboardAppearance")
itemLists.append("Play sound on next/prev/done")
dropDownTextField.itemList = itemLists
}
@objc private func clearAction() {
textField3.text = ""
}
override func viewWillAppear(_ animated: Bool) {
super.viewWillAppear(animated)
keyboardListener.subscribe(identifier: "TextFieldViewController") { _, _ in
// print(size)
}
}
override func viewWillDisappear(_ animated: Bool) {
super.viewWillDisappear(animated)
keyboardListener.unsubscribe(identifier: "TextFieldViewController")
}
}
extension TextFieldViewController: UITextViewDelegate {
func textViewDidBeginEditing(_ textView: UITextView) {
print("textViewDidBeginEditing")
}
}
extension TextFieldViewController: UITextFieldDelegate {
func textFieldDidEndEditing(_ textField: UITextField) {
print("textFieldDidEndEditing")
}
}
================================================
FILE: Example/IQKeyboardManagerSwiftExample/ViewController/TextSelectionViewController.swift
================================================
//
// TextSelectionViewController.swift
// https://github.com/hackiftekhar/IQKeyboardManager
// Copyright (c) 2013-24 Iftekhar Qurashi.
//
// Permission is hereby granted, free of charge, to any person obtaining a copy
// of this software and associated documentation files (the "Software"), to deal
// in the Software without restriction, including without limitation the rights
// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
// copies of the Software, and to permit persons to whom the Software is
// furnished to do so, subject to the following conditions:
//
// The above copyright notice and this permission notice shall be included in
// all copies or substantial portions of the Software.
//
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
// THE SOFTWARE.
import UIKit
class TextSelectionViewController: BaseViewController, UITableViewDelegate, UITableViewDataSource {
@IBOutlet var tableView: UITableView!
private let data = ["Hello", "This is a demo code", "Issue #56", "With mutiple cells", "And some useless text.",
"Hello", "This is a demo code", "Issue #56", "With mutiple cells", "And some useless text.",
"Hello", "This is a demo code", "Issue #56", "With mutiple cells", "And some useless text."]
func tableView(_ tableView: UITableView, heightForRowAt heightForRowAtIndexPath: IndexPath) -> CGFloat {
return tableView.rowHeight
}
func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return data.count
}
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let identifier = "\(indexPath.section) \(indexPath.row)"
var cell = tableView.dequeueReusableCell(withIdentifier: identifier)
if cell == nil {
cell = UITableViewCell(style: .default, reuseIdentifier: identifier)
cell?.selectionStyle = .none
cell?.backgroundColor = UIColor.clear
let textView = UITextView(frame: CGRect(x: 5, y: 7, width: 135, height: 30))
textView.autoresizingMask = [.flexibleHeight, .flexibleWidth]
textView.backgroundColor = UIColor.clear
textView.text = data[indexPath.row]
textView.dataDetectorTypes = UIDataDetectorTypes.all
textView.isScrollEnabled = false
textView.isEditable = false
cell?.contentView.addSubview(textView)
}
return cell!
}
}
================================================
FILE: Example/IQKeyboardManagerSwiftExample/ViewController/TextViewController.swift
================================================
//
// TextViewController.swift
// https://github.com/hackiftekhar/IQKeyboardManager
// Copyright (c) 2013-24 Iftekhar Qurashi.
//
// Permission is hereby granted, free of charge, to any person obtaining a copy
// of this software and associated documentation files (the "Software"), to deal
// in the Software without restriction, including without limitation the rights
// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
// copies of the Software, and to permit persons to whom the Software is
// furnished to do so, subject to the following conditions:
//
// The above copyright notice and this permission notice shall be included in
// all copies or substantial portions of the Software.
//
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
// THE SOFTWARE.
import UIKit
class TextViewController: BaseViewController {
}
================================================
FILE: Example/IQKeyboardManagerSwiftExample/ViewController/TextViewSpecialCaseViewController.swift
================================================
//
// TextViewSpecialCaseViewController.swift
// https://github.com/hackiftekhar/IQKeyboardManager
// Copyright (c) 2013-24 Iftekhar Qurashi.
//
// Permission is hereby granted, free of charge, to any person obtaining a copy
// of this software and associated documentation files (the "Software"), to deal
// in the Software without restriction, including without limitation the rights
// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
// copies of the Software, and to permit persons to whom the Software is
// furnished to do so, subject to the following conditions:
//
// The above copyright notice and this permission notice shall be included in
// all copies or substantial portions of the Software.
//
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
// THE SOFTWARE.
import UIKit
class TextViewSpecialCaseViewController: BaseViewController, UITextViewDelegate {
func textView(_ textView: UITextView, shouldChangeTextIn range: NSRange, replacementText text: String) -> Bool {
if text == "\n" {
textView.resignFirstResponder()
}
return true
}
}
================================================
FILE: Example/IQKeyboardManagerSwiftExample/ViewController/ViewController.swift
================================================
//
// ViewController.swift
// https://github.com/hackiftekhar/IQKeyboardManager
// Copyright (c) 2013-24 Iftekhar Qurashi.
//
// Permission is hereby granted, free of charge, to any person obtaining a copy
// of this software and associated documentation files (the "Software"), to deal
// in the Software without restriction, including without limitation the rights
// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
// copies of the Software, and to permit persons to whom the Software is
// furnished to do so, subject to the following conditions:
//
// The above copyright notice and this permission notice shall be included in
// all copies or substantial portions of the Software.
//
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
// THE SOFTWARE.
import UIKit
import IQKeyboardManagerSwift
import IQKeyboardToolbarManager
class ViewController: BaseTableViewController {
@IBAction func shareClicked(_ sender: UIBarButtonItem) {
let shareString: String = "IQKeyboardManager is really great for iOS developer to manage keyboard-textField."
// let shareImage: UIImage = UIImage(named: "IQKeyboardManagerScreenshot")!
let youtubeUrl: URL = URL(string: "http://youtu.be/6nhLw6hju2A")!
var activityItems = [Any]()
activityItems.append(shareString)
// activityItems.append(shareImage)
activityItems.append(youtubeUrl)
let controller = UIActivityViewController(activityItems: activityItems, applicationActivities: nil)
controller.excludedActivityTypes = [.print, .copyToPasteboard, .assignToContact, .saveToCameraRoll]
present(controller, animated: true)
}
override func viewDidLoad() {
super.viewDidLoad()
IQKeyboardToolbarManager.shared.toolbarConfiguration.manageBehavior = .byPosition
// Do any additional setup after loading the view, typically from a nib.
}
override func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
tableView.deselectRow(at: indexPath, animated: true)
}
override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
guard let identifier = segue.identifier else {
return
}
if identifier == "PopoverViewController" {
let controller = segue.destination
controller.modalPresentationStyle = .popover
controller.popoverPresentationController?.barButtonItem = sender as? UIBarButtonItem
controller.popoverPresentationController?.sourceView = sender as? UIView
let heightWidth = max(UIScreen.main.bounds.width, UIScreen.main.bounds.height)
controller.preferredContentSize = CGSize(width: heightWidth, height: heightWidth)
controller.popoverPresentationController?.delegate = self
}
}
}
================================================
FILE: Example/IQKeyboardManagerSwiftExample/ViewController/WebViewController.swift
================================================
//
// WebViewController.swift
// https://github.com/hackiftekhar/IQKeyboardManager
// Copyright (c) 2013-24 Iftekhar Qurashi.
//
// Permission is hereby granted, free of charge, to any person obtaining a copy
// of this software and associated documentation files (the "Software"), to deal
// in the Software without restriction, including without limitation the rights
// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
// copies of the Software, and to permit persons to whom the Software is
// furnished to do so, subject to the following conditions:
//
// The above copyright notice and this permission notice shall be included in
// all copies or substantial portions of the Software.
//
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
// THE SOFTWARE.
import UIKit
import WebKit
class WebViewController: BaseViewController {
let activity = UIActivityIndicatorView(style: .medium)
var webView: WKWebView!
@IBOutlet var webContainerView: UIView!
override func viewDidLoad() {
super.viewDidLoad()
let configuration = WKWebViewConfiguration()
self.webView = WKWebView(frame: webContainerView.bounds, configuration: configuration)
self.webView.uiDelegate = self
self.webView.navigationDelegate = self
self.webView.autoresizingMask = [.flexibleWidth, .flexibleHeight]
self.webContainerView.addSubview(self.webView)
let request: URLRequest = URLRequest(url: URL(string: "http://www.google.com")!,
cachePolicy: .useProtocolCachePolicy,
timeoutInterval: 60)
self.webView.load(request)
self.navigationItem.rightBarButtonItem = UIBarButtonItem(customView: activity)
}
}
extension WebViewController: WKUIDelegate, WKNavigationDelegate {
nonisolated func webView(_ webView: WKWebView, didCommit navigation: WKNavigation!) {
DispatchQueue.main.async {
self.activity.startAnimating()
}
}
nonisolated func webView(_ webView: WKWebView, didFinish navigation: WKNavigation!) {
DispatchQueue.main.async {
self.activity.stopAnimating()
}
}
nonisolated func webView(_ webView: WKWebView, didFail navigation: WKNavigation!, withError error: Error) {
DispatchQueue.main.async {
self.activity.stopAnimating()
}
}
}
================================================
FILE: Example/IQKeyboardManagerSwiftExample.xcodeproj/project.pbxproj
================================================
// !$*UTF8*$!
{
archiveVersion = 1;
classes = {
};
objectVersion = 54;
objects = {
/* Begin PBXBuildFile section */
03ADCF0447958F5BE7A48B6B /* Pods_IQKeyboardManagerSwiftExample.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 7AC7BF348A3EBFE4CD9EA9BD /* Pods_IQKeyboardManagerSwiftExample.framework */; };
4CF58EAD1D36BD910081FB08 /* Social.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 9D9A0FC218C9DB5700585D3F /* Social.framework */; };
56FCBF7A24C36678007B0332 /* WebKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 56FCBF7824C36672007B0332 /* WebKit.framework */; };
56FCBF7B24C36686007B0332 /* CoreGraphics.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = C0B63BA31781FAB1008D3B64 /* CoreGraphics.framework */; };
56FCBF7C24C3668A007B0332 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = C0B63BA11781FAB1008D3B64 /* Foundation.framework */; };
56FCBF7D24C3668E007B0332 /* UIKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = C0B63B9F1781FAB1008D3B64 /* UIKit.framework */; };
C0121F292E94000A002DBAF2 /* General.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = C0121EEF2E94000A002DBAF2 /* General.storyboard */; };
C0121F2A2E94000A002DBAF2 /* TestCases.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = C0121F002E94000A002DBAF2 /* TestCases.storyboard */; };
C0121F2B2E94000A002DBAF2 /* Settings.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = C0121EFB2E94000A002DBAF2 /* Settings.storyboard */; };
C0121F2C2E94000A002DBAF2 /* Launch.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = C0121EF22E94000A002DBAF2 /* Launch.storyboard */; };
C0121F2D2E94000A002DBAF2 /* ScrollView.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = C0121EF82E94000A002DBAF2 /* ScrollView.storyboard */; };
C0121F2E2E94000A002DBAF2 /* InfoPlist.strings in Resources */ = {isa = PBXBuildFile; fileRef = C0121EE72E94000A002DBAF2 /* InfoPlist.strings */; };
C0121F302E94000A002DBAF2 /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = C0121EF52E94000A002DBAF2 /* Main.storyboard */; };
C0121F312E94000A002DBAF2 /* SpecialCase.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = C0121EFE2E94000A002DBAF2 /* SpecialCase.storyboard */; };
C0121F322E94000A002DBAF2 /* FullScreenControllers.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = C0121EEC2E94000A002DBAF2 /* FullScreenControllers.storyboard */; };
C0121F332E94000A002DBAF2 /* NonScrollTextView1979ViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = C0121F0D2E94000A002DBAF2 /* NonScrollTextView1979ViewController.swift */; };
C0121F342E94000A002DBAF2 /* SettingsViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = C0121F162E94000A002DBAF2 /* SettingsViewController.swift */; };
C0121F352E94000A002DBAF2 /* TableViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = C0121F1B2E94000A002DBAF2 /* TableViewController.swift */; };
C0121F362E94000A002DBAF2 /* PageViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = C0121F0F2E94000A002DBAF2 /* PageViewController.swift */; };
C0121F372E94000A002DBAF2 /* BaseTableViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = C0121F032E94000A002DBAF2 /* BaseTableViewController.swift */; };
C0121F382E94000A002DBAF2 /* TextFieldView.swift in Sources */ = {isa = PBXBuildFile; fileRef = C0121F1F2E94000A002DBAF2 /* TextFieldView.swift */; };
C0121F392E94000A002DBAF2 /* NavigationController.swift in Sources */ = {isa = PBXBuildFile; fileRef = C0121F0C2E94000A002DBAF2 /* NavigationController.swift */; };
C0121F3A2E94000A002DBAF2 /* NavigationBarViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = C0121F0B2E94000A002DBAF2 /* NavigationBarViewController.swift */; };
C0121F3B2E94000A002DBAF2 /* ReloadLayout1892ViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = C0121F122E94000A002DBAF2 /* ReloadLayout1892ViewController.swift */; };
C0121F3C2E94000A002DBAF2 /* TextFieldHostingViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = C0121F1E2E94000A002DBAF2 /* TextFieldHostingViewController.swift */; };
C0121F3D2E94000A002DBAF2 /* EdgesForExtendedLayoutViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = C0121F072E94000A002DBAF2 /* EdgesForExtendedLayoutViewController.swift */; };
C0121F3E2E94000A002DBAF2 /* StackViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = C0121F192E94000A002DBAF2 /* StackViewController.swift */; };
C0121F3F2E94000A002DBAF2 /* TextSelectionViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = C0121F212E94000A002DBAF2 /* TextSelectionViewController.swift */; };
C0121F402E94000A002DBAF2 /* TableViewInContainerViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = C0121F1C2E94000A002DBAF2 /* TableViewInContainerViewController.swift */; };
C0121F412E94000A002DBAF2 /* ScrollViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = C0121F142E94000A002DBAF2 /* ScrollViewController.swift */; };
C0121F422E94000A002DBAF2 /* TextViewSpecialCaseViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = C0121F232E94000A002DBAF2 /* TextViewSpecialCaseViewController.swift */; };
C0121F432E94000A002DBAF2 /* AutofillPasswordViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = C0121F022E94000A002DBAF2 /* AutofillPasswordViewController.swift */; };
C0121F442E94000A002DBAF2 /* ViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = C0121F242E94000A002DBAF2 /* ViewController.swift */; };
C0121F452E94000A002DBAF2 /* ManualToolbarViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = C0121F0A2E94000A002DBAF2 /* ManualToolbarViewController.swift */; };
C0121F462E94000A002DBAF2 /* SwitchTableViewCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = C0121EDF2E94000A002DBAF2 /* SwitchTableViewCell.swift */; };
C0121F472E94000A002DBAF2 /* TestViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = C0121F1D2E94000A002DBAF2 /* TestViewController.swift */; };
C0121F482E94000A002DBAF2 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = C0121F272E94000A002DBAF2 /* AppDelegate.swift */; };
C0121F492E94000A002DBAF2 /* TextViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = C0121F222E94000A002DBAF2 /* TextViewController.swift */; };
C0121F4A2E94000A002DBAF2 /* ImageSwitchTableViewCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = C0121EDB2E94000A002DBAF2 /* ImageSwitchTableViewCell.swift */; };
C0121F4B2E94000A002DBAF2 /* TextFieldTableViewCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = C0121EE02E94000A002DBAF2 /* TextFieldTableViewCell.swift */; };
C0121F4C2E94000A002DBAF2 /* SpecialCaseViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = C0121F182E94000A002DBAF2 /* SpecialCaseViewController.swift */; };
C0121F4D2E94000A002DBAF2 /* NavigationTableViewCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = C0121EDC2E94000A002DBAF2 /* NavigationTableViewCell.swift */; };
C0121F4E2E94000A002DBAF2 /* UITableView+Extension.swift in Sources */ = {isa = PBXBuildFile; fileRef = C0121EE22E94000A002DBAF2 /* UITableView+Extension.swift */; };
C0121F4F2E94000A002DBAF2 /* TableViewContainerViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = C0121F1A2E94000A002DBAF2 /* TableViewContainerViewController.swift */; };
C0121F502E94000A002DBAF2 /* SearchViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = C0121F152E94000A002DBAF2 /* SearchViewController.swift */; };
C0121F512E94000A002DBAF2 /* OptionTableViewCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = C0121EDD2E94000A002DBAF2 /* OptionTableViewCell.swift */; };
C0121F522E94000A002DBAF2 /* CollectionViewDemoController.swift in Sources */ = {isa = PBXBuildFile; fileRef = C0121F052E94000A002DBAF2 /* CollectionViewDemoController.swift */; };
C0121F532E94000A002DBAF2 /* TextFieldViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = C0121F202E94000A002DBAF2 /* TextFieldViewController.swift */; };
C0121F542E94000A002DBAF2 /* OptionsViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = C0121F0E2E94000A002DBAF2 /* OptionsViewController.swift */; };
C0121F552E94000A002DBAF2 /* BaseViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = C0121F042E94000A002DBAF2 /* BaseViewController.swift */; };
C0121F562E94000A002DBAF2 /* ExampleTableViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = C0121F092E94000A002DBAF2 /* ExampleTableViewController.swift */; };
C0121F572E94000A002DBAF2 /* WebViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = C0121F252E94000A002DBAF2 /* WebViewController.swift */; };
C0121F582E94000A002DBAF2 /* PopoverViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = C0121F102E94000A002DBAF2 /* PopoverViewController.swift */; };
C0121F592E94000A002DBAF2 /* EnableMode2000ViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = C0121F082E94000A002DBAF2 /* EnableMode2000ViewController.swift */; };
C0121F5A2E94000A002DBAF2 /* CustomViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = C0121F062E94000A002DBAF2 /* CustomViewController.swift */; };
C0121F5B2E94000A002DBAF2 /* RefreshLayoutViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = C0121F112E94000A002DBAF2 /* RefreshLayoutViewController.swift */; };
C0121F5C2E94000A002DBAF2 /* ColorTableViewCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = C0121EDA2E94000A002DBAF2 /* ColorTableViewCell.swift */; };
C0121F5D2E94000A002DBAF2 /* SettingsViewController+TableView.swift in Sources */ = {isa = PBXBuildFile; fileRef = C0121F172E94000A002DBAF2 /* SettingsViewController+TableView.swift */; };
C0121F5E2E94000A002DBAF2 /* StepperTableViewCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = C0121EDE2E94000A002DBAF2 /* StepperTableViewCell.swift */; };
C0121F5F2E94000A002DBAF2 /* SafeAreaViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = C0121F132E94000A002DBAF2 /* SafeAreaViewController.swift */; };
C0121F612E94003E002DBAF2 /* Images.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = C0121F602E94003E002DBAF2 /* Images.xcassets */; };
C0121F692E9400C4002DBAF2 /* ActionViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = C0121F622E9400C4002DBAF2 /* ActionViewController.swift */; };
C0121F6A2E9400C4002DBAF2 /* MainInterface.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = C0121F662E9400C4002DBAF2 /* MainInterface.storyboard */; };
C0121F6B2E9400C4002DBAF2 /* Media.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = C0121F672E9400C4002DBAF2 /* Media.xcassets */; };
C0121F992E9400DF002DBAF2 /* UITableView+IndexPaths.swift in Sources */ = {isa = PBXBuildFile; fileRef = C0121F812E9400DF002DBAF2 /* UITableView+IndexPaths.swift */; };
C0121F9A2E9400DF002DBAF2 /* IQKeyboardAppearanceManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = C0121F6E2E9400DF002DBAF2 /* IQKeyboardAppearanceManager.swift */; };
C0121F9B2E9400DF002DBAF2 /* IQRootControllerConfiguration.swift in Sources */ = {isa = PBXBuildFile; fileRef = C0121F742E9400DF002DBAF2 /* IQRootControllerConfiguration.swift */; };
C0121F9C2E9400DF002DBAF2 /* UIView+Parent.swift in Sources */ = {isa = PBXBuildFile; fileRef = C0121F822E9400DF002DBAF2 /* UIView+Parent.swift */; };
C0121F9D2E9400DF002DBAF2 /* IQKeyboardManager+Appearance_Deprecated.swift in Sources */ = {isa = PBXBuildFile; fileRef = C0121F712E9400DF002DBAF2 /* IQKeyboardManager+Appearance_Deprecated.swift */; };
C0121F9E2E9400DF002DBAF2 /* IQKeyboardManager+ToolbarManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = C0121F8B2E9400DF002DBAF2 /* IQKeyboardManager+ToolbarManager.swift */; };
C0121F9F2E9400DF002DBAF2 /* UIView+IQKeyboardManagerExtension.swift in Sources */ = {isa = PBXBuildFile; fileRef = C0121F7D2E9400DF002DBAF2 /* UIView+IQKeyboardManagerExtension.swift */; };
C0121FA02E9400DF002DBAF2 /* UIScrollView+IQKeyboardManagerExtensionObjc.swift in Sources */ = {isa = PBXBuildFile; fileRef = C0121F7C2E9400DF002DBAF2 /* UIScrollView+IQKeyboardManagerExtensionObjc.swift */; };
C0121FA12E9400DF002DBAF2 /* IQKeyboardManager+ActiveConfiguration.swift in Sources */ = {isa = PBXBuildFile; fileRef = C0121F872E9400DF002DBAF2 /* IQKeyboardManager+ActiveConfiguration.swift */; };
C0121FA22E9400DF002DBAF2 /* IQKeyboardResignHandler+Internal.swift in Sources */ = {isa = PBXBuildFile; fileRef = C0121F942E9400DF002DBAF2 /* IQKeyboardResignHandler+Internal.swift */; };
C0121FA32E9400DF002DBAF2 /* IQKeyboardAppearanceManager+Internal.swift in Sources */ = {isa = PBXBuildFile; fileRef = C0121F6F2E9400DF002DBAF2 /* IQKeyboardAppearanceManager+Internal.swift */; };
C0121FA42E9400DF002DBAF2 /* UICollectionView+IndexPaths.swift in Sources */ = {isa = PBXBuildFile; fileRef = C0121F802E9400DF002DBAF2 /* UICollectionView+IndexPaths.swift */; };
C0121FA52E9400DF002DBAF2 /* UIView+ParentObjc.swift in Sources */ = {isa = PBXBuildFile; fileRef = C0121F832E9400DF002DBAF2 /* UIView+ParentObjc.swift */; };
C0121FA62E9400DF002DBAF2 /* IQKeyboardManager+Appearance.swift in Sources */ = {isa = PBXBuildFile; fileRef = C0121F702E9400DF002DBAF2 /* IQKeyboardManager+Appearance.swift */; };
C0121FA72E9400DF002DBAF2 /* IQScrollViewConfiguration.swift in Sources */ = {isa = PBXBuildFile; fileRef = C0121F752E9400DF002DBAF2 /* IQScrollViewConfiguration.swift */; };
C0121FA82E9400DF002DBAF2 /* IQKeyboardAppearanceConfiguration.swift in Sources */ = {isa = PBXBuildFile; fileRef = C0121F6D2E9400DF002DBAF2 /* IQKeyboardAppearanceConfiguration.swift */; };
C0121FA92E9400DF002DBAF2 /* UIView+ResignObjc.swift in Sources */ = {isa = PBXBuildFile; fileRef = C0121F8F2E9400DF002DBAF2 /* UIView+ResignObjc.swift */; };
C0121FAA2E9400DF002DBAF2 /* IQKeyboardManager+Internal.swift in Sources */ = {isa = PBXBuildFile; fileRef = C0121F882E9400DF002DBAF2 /* IQKeyboardManager+Internal.swift */; };
C0121FAB2E9400DF002DBAF2 /* IQKeyboardResignHandler.swift in Sources */ = {isa = PBXBuildFile; fileRef = C0121F932E9400DF002DBAF2 /* IQKeyboardResignHandler.swift */; };
C0121FAC2E9400DF002DBAF2 /* IQKeyboardManager+ToolbarManagerDeprecated.swift in Sources */ = {isa = PBXBuildFile; fileRef = C0121F8C2E9400DF002DBAF2 /* IQKeyboardManager+ToolbarManagerDeprecated.swift */; };
C0121FAD2E9400DF002DBAF2 /* IQKeyboardManager+Debug.swift in Sources */ = {isa = PBXBuildFile; fileRef = C0121F772E9400DF002DBAF2 /* IQKeyboardManager+Debug.swift */; };
C0121FAE2E9400DF002DBAF2 /* IQKeyboardManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = C0121F862E9400DF002DBAF2 /* IQKeyboardManager.swift */; };
C0121FAF2E9400DF002DBAF2 /* IQKeyboardManager+Deprecated.swift in Sources */ = {isa = PBXBuildFile; fileRef = C0121F792E9400DF002DBAF2 /* IQKeyboardManager+Deprecated.swift */; };
C0121FB02E9400DF002DBAF2 /* UIViewController+ParentContainer.swift in Sources */ = {isa = PBXBuildFile; fileRef = C0121F842E9400DF002DBAF2 /* UIViewController+ParentContainer.swift */; };
C0121FB12E9400DF002DBAF2 /* IQActiveConfiguration.swift in Sources */ = {isa = PBXBuildFile; fileRef = C0121F732E9400DF002DBAF2 /* IQActiveConfiguration.swift */; };
C0121FB22E9400DF002DBAF2 /* UIView+Resign.swift in Sources */ = {isa = PBXBuildFile; fileRef = C0121F8E2E9400DF002DBAF2 /* UIView+Resign.swift */; };
C0121FB32E9400DF002DBAF2 /* IQKeyboardManager+Resign_Deprecated.swift in Sources */ = {isa = PBXBuildFile; fileRef = C0121F922E9400DF002DBAF2 /* IQKeyboardManager+Resign_Deprecated.swift */; };
C0121FB42E9400DF002DBAF2 /* UIScrollView+IQKeyboardManagerExtension.swift in Sources */ = {isa = PBXBuildFile; fileRef = C0121F7B2E9400DF002DBAF2 /* UIScrollView+IQKeyboardManagerExtension.swift */; };
C0121FB52E9400DF002DBAF2 /* UIView+IQKeyboardManagerExtensionObjc.swift in Sources */ = {isa = PBXBuildFile; fileRef = C0121F7E2E9400DF002DBAF2 /* UIView+IQKeyboardManagerExtensionObjc.swift */; };
C0121FB62E9400DF002DBAF2 /* IQKeyboardManager+Resign.swift in Sources */ = {isa = PBXBuildFile; fileRef = C0121F912E9400DF002DBAF2 /* IQKeyboardManager+Resign.swift */; };
C0121FB72E9400DF002DBAF2 /* IQKeyboardManager+Position.swift in Sources */ = {isa = PBXBuildFile; fileRef = C0121F892E9400DF002DBAF2 /* IQKeyboardManager+Position.swift */; };
C0121FB82E9400DF002DBAF2 /* IQKeyboardManagerSwift.h in Headers */ = {isa = PBXBuildFile; fileRef = C0121F962E9400DF002DBAF2 /* IQKeyboardManagerSwift.h */; settings = {ATTRIBUTES = (Public, ); }; };
C0121FB92E9400DF002DBAF2 /* PrivacyInfo.xcprivacy in Resources */ = {isa = PBXBuildFile; fileRef = C0121F972E9400DF002DBAF2 /* PrivacyInfo.xcprivacy */; };
C0121FC12E9408E5002DBAF2 /* IQTextInputViewNotification.xcframework in Frameworks */ = {isa = PBXBuildFile; fileRef = C0121FBA2E9408E5002DBAF2 /* IQTextInputViewNotification.xcframework */; };
C0121FC22E9408E5002DBAF2 /* IQKeyboardCore.xcframework in Frameworks */ = {isa = PBXBuildFile; fileRef = C0121FBB2E9408E5002DBAF2 /* IQKeyboardCore.xcframework */; };
C0121FC32E9408E5002DBAF2 /* IQKeyboardToolbarManager.xcframework in Frameworks */ = {isa = PBXBuildFile; fileRef = C0121FBC2E9408E5002DBAF2 /* IQKeyboardToolbarManager.xcframework */; };
C0121FC42E9408E5002DBAF2 /* IQKeyboardReturnManager.xcframework in Frameworks */ = {isa = PBXBuildFile; fileRef = C0121FBD2E9408E5002DBAF2 /* IQKeyboardReturnManager.xcframework */; };
C0121FC52E9408E5002DBAF2 /* IQTextView.xcframework in Frameworks */ = {isa = PBXBuildFile; fileRef = C0121FBE2E9408E5002DBAF2 /* IQTextView.xcframework */; };
C0121FC62E9408E5002DBAF2 /* IQKeyboardNotification.xcframework in Frameworks */ = {isa = PBXBuildFile; fileRef = C0121FBF2E9408E5002DBAF2 /* IQKeyboardNotification.xcframework */; };
C0121FC72E9408E5002DBAF2 /* IQKeyboardToolbar.xcframework in Frameworks */ = {isa = PBXBuildFile; fileRef = C0121FC02E9408E5002DBAF2 /* IQKeyboardToolbar.xcframework */; };
C03C9479273CF3FF00AF66B5 /* IQKeyboardManagerSwiftExampleExtension.appex in Embed Foundation Extensions */ = {isa = PBXBuildFile; fileRef = C03C946D273CF3FF00AF66B5 /* IQKeyboardManagerSwiftExampleExtension.appex */; settings = {ATTRIBUTES = (RemoveHeadersOnCopy, ); }; };
/* End PBXBuildFile section */
/* Begin PBXContainerItemProxy section */
C03C9477273CF3FF00AF66B5 /* PBXContainerItemProxy */ = {
isa = PBXContainerItemProxy;
containerPortal = C0B63B921781FAB0008D3B64 /* Project object */;
proxyType = 1;
remoteGlobalIDString = C03C946C273CF3FF00AF66B5;
remoteInfo = DemoExtension;
};
/* End PBXContainerItemProxy section */
/* Begin PBXCopyFilesBuildPhase section */
C03C947B273CF3FF00AF66B5 /* Embed Foundation Extensions */ = {
isa = PBXCopyFilesBuildPhase;
buildActionMask = 2147483647;
dstPath = "";
dstSubfolderSpec = 13;
files = (
C03C9479273CF3FF00AF66B5 /* IQKeyboardManagerSwiftExampleExtension.appex in Embed Foundation Extensions */,
);
name = "Embed Foundation Extensions";
runOnlyForDeploymentPostprocessing = 0;
};
/* End PBXCopyFilesBuildPhase section */
/* Begin PBXFileReference section */
35E6DD2330A3AF7B8F2DF86F /* Pods-IQKeyboardManagerSwiftExample.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-IQKeyboardManagerSwiftExample.release.xcconfig"; path = "Pods/Target Support Files/Pods-IQKeyboardManagerSwiftExample/Pods-IQKeyboardManagerSwiftExample.release.xcconfig"; sourceTree = ""; };
55CF83944ADEC65E0AF10B2E /* Pods_DemoObjC.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_DemoObjC.framework; sourceTree = BUILT_PRODUCTS_DIR; };
56FCBF7824C36672007B0332 /* WebKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = WebKit.framework; path = System/Library/Frameworks/WebKit.framework; sourceTree = SDKROOT; };
7AC7BF348A3EBFE4CD9EA9BD /* Pods_IQKeyboardManagerSwiftExample.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_IQKeyboardManagerSwiftExample.framework; sourceTree = BUILT_PRODUCTS_DIR; };
9D0BB82F18BB1AE100667349 /* Foundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Foundation.framework; path = Library/Frameworks/Foundation.framework; sourceTree = SDKROOT; };
9D0BB83018BB1AE100667349 /* CoreData.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreData.framework; path = Library/Frameworks/CoreData.framework; sourceTree = SDKROOT; };
9D0BB83118BB1AE100667349 /* AppKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = AppKit.framework; path = Library/Frameworks/AppKit.framework; sourceTree = SDKROOT; };
9D0BB84118BB1AE100667349 /* XCTest.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = XCTest.framework; path = Library/Frameworks/XCTest.framework; sourceTree = DEVELOPER_DIR; };
9D9A0FC218C9DB5700585D3F /* Social.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Social.framework; path = System/Library/Frameworks/Social.framework; sourceTree = SDKROOT; };
C0121EDA2E94000A002DBAF2 /* ColorTableViewCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ColorTableViewCell.swift; sourceTree = ""; };
C0121EDB2E94000A002DBAF2 /* ImageSwitchTableViewCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ImageSwitchTableViewCell.swift; sourceTree = ""; };
C0121EDC2E94000A002DBAF2 /* NavigationTableViewCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NavigationTableViewCell.swift; sourceTree = ""; };
C0121EDD2E94000A002DBAF2 /* OptionTableViewCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = OptionTableViewCell.swift; sourceTree = ""; };
C0121EDE2E94000A002DBAF2 /* StepperTableViewCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = StepperTableViewCell.swift; sourceTree = ""; };
C0121EDF2E94000A002DBAF2 /* SwitchTableViewCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SwitchTableViewCell.swift; sourceTree = ""; };
C0121EE02E94000A002DBAF2 /* TextFieldTableViewCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TextFieldTableViewCell.swift; sourceTree = ""; };
C0121EE22E94000A002DBAF2 /* UITableView+Extension.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "UITableView+Extension.swift"; sourceTree = ""; };
C0121EE42E94000A002DBAF2 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; };
C0121EE52E94000A002DBAF2 /* Base */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = Base; path = Base.lproj/InfoPlist.strings; sourceTree = ""; };
C0121EE62E94000A002DBAF2 /* ar */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = ar; path = ar.lproj/InfoPlist.strings; sourceTree = ""; };
C0121EE82E94000A002DBAF2 /* IQKeyboardManger-Swift-Bridging-Header.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "IQKeyboardManger-Swift-Bridging-Header.h"; sourceTree = ""; };
C0121EEA2E94000A002DBAF2 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/FullScreenControllers.storyboard; sourceTree = ""; };
C0121EEB2E94000A002DBAF2 /* ar */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = ar; path = ar.lproj/FullScreenControllers.strings; sourceTree = ""; };
C0121EED2E94000A002DBAF2 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/General.storyboard; sourceTree = ""; };
C0121EEE2E94000A002DBAF2 /* ar */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = ar; path = ar.lproj/General.strings; sourceTree = ""; };
C0121EF02E94000A002DBAF2 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/Launch.storyboard; sourceTree = ""; };
C0121EF12E94000A002DBAF2 /* ar */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = ar; path = ar.lproj/Launch.strings; sourceTree = ""; };
C0121EF32E94000A002DBAF2 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/Main.storyboard; sourceTree = ""; };
C0121EF42E94000A002DBAF2 /* ar */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = ar; path = ar.lproj/Main.strings; sourceTree = ""; };
C0121EF62E94000A002DBAF2 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/ScrollView.storyboard; sourceTree = ""; };
C0121EF72E94000A002DBAF2 /* ar */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = ar; path = ar.lproj/ScrollView.strings; sourceTree = ""; };
C0121EF92E94000A002DBAF2 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/Settings.storyboard; sourceTree = ""; };
C0121EFA2E94000A002DBAF2 /* ar */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = ar; path = ar.lproj/Settings.strings; sourceTree = ""; };
C0121EFC2E94000A002DBAF2 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/SpecialCase.storyboard; sourceTree = ""; };
C0121EFD2E94000A002DBAF2 /* ar */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = ar; path = ar.lproj/SpecialCase.strings; sourceTree = ""; };
C0121EFF2E94000A002DBAF2 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/TestCases.storyboard; sourceTree = ""; };
C0121F022E94000A002DBAF2 /* AutofillPasswordViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AutofillPasswordViewController.swift; sourceTree = ""; };
C0121F032E94000A002DBAF2 /* BaseTableViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BaseTableViewController.swift; sourceTree = ""; };
C0121F042E94000A002DBAF2 /* BaseViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BaseViewController.swift; sourceTree = ""; };
C0121F052E94000A002DBAF2 /* CollectionViewDemoController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CollectionViewDemoController.swift; sourceTree = ""; };
C0121F062E94000A002DBAF2 /* CustomViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CustomViewController.swift; sourceTree = ""; };
C0121F072E94000A002DBAF2 /* EdgesForExtendedLayoutViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = EdgesForExtendedLayoutViewController.swift; sourceTree = ""; };
C0121F082E94000A002DBAF2 /* EnableMode2000ViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = EnableMode2000ViewController.swift; sourceTree = ""; };
C0121F092E94000A002DBAF2 /* ExampleTableViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ExampleTableViewController.swift; sourceTree = ""; };
C0121F0A2E94000A002DBAF2 /* ManualToolbarViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ManualToolbarViewController.swift; sourceTree = ""; };
C0121F0B2E94000A002DBAF2 /* NavigationBarViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NavigationBarViewController.swift; sourceTree = ""; };
C0121F0C2E94000A002DBAF2 /* NavigationController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NavigationController.swift; sourceTree = ""; };
C0121F0D2E94000A002DBAF2 /* NonScrollTextView1979ViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NonScrollTextView1979ViewController.swift; sourceTree = ""; };
C0121F0E2E94000A002DBAF2 /* OptionsViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = OptionsViewController.swift; sourceTree = ""; };
C0121F0F2E94000A002DBAF2 /* PageViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PageViewController.swift; sourceTree = ""; };
C0121F102E94000A002DBAF2 /* PopoverViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PopoverViewController.swift; sourceTree = ""; };
C0121F112E94000A002DBAF2 /* RefreshLayoutViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RefreshLayoutViewController.swift; sourceTree = ""; };
C0121F122E94000A002DBAF2 /* ReloadLayout1892ViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ReloadLayout1892ViewController.swift; sourceTree = ""; };
C0121F132E94000A002DBAF2 /* SafeAreaViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SafeAreaViewController.swift; sourceTree = ""; };
C0121F142E94000A002DBAF2 /* ScrollViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ScrollViewController.swift; sourceTree = ""; };
C0121F152E94000A002DBAF2 /* SearchViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SearchViewController.swift; sourceTree = ""; };
C0121F162E94000A002DBAF2 /* SettingsViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SettingsViewController.swift; sourceTree = ""; };
C0121F172E94000A002DBAF2 /* SettingsViewController+TableView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "SettingsViewController+TableView.swift"; sourceTree = ""; };
C0121F182E94000A002DBAF2 /* SpecialCaseViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SpecialCaseViewController.swift; sourceTree = ""; };
C0121F192E94000A002DBAF2 /* StackViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = StackViewController.swift; sourceTree = ""; };
C0121F1A2E94000A002DBAF2 /* TableViewContainerViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TableViewContainerViewController.swift; sourceTree = ""; };
C0121F1B2E94000A002DBAF2 /* TableViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TableViewController.swift; sourceTree = ""; };
C0121F1C2E94000A002DBAF2 /* TableViewInContainerViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TableViewInContainerViewController.swift; sourceTree = ""; };
C0121F1D2E94000A002DBAF2 /* TestViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TestViewController.swift; sourceTree = ""; };
C0121F1E2E94000A002DBAF2 /* TextFieldHostingViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TextFieldHostingViewController.swift; sourceTree = ""; };
C0121F1F2E94000A002DBAF2 /* TextFieldView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TextFieldView.swift; sourceTree = ""; };
C0121F202E94000A002DBAF2 /* TextFieldViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TextFieldViewController.swift; sourceTree = ""; };
C0121F212E94000A002DBAF2 /* TextSelectionViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TextSelectionViewController.swift; sourceTree = ""; };
C0121F222E94000A002DBAF2 /* TextViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TextViewController.swift; sourceTree = ""; };
C0121F232E94000A002DBAF2 /* TextViewSpecialCaseViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TextViewSpecialCaseViewController.swift; sourceTree = ""; };
C0121F242E94000A002DBAF2 /* ViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ViewController.swift; sourceTree = ""; };
C0121F252E94000A002DBAF2 /* WebViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = WebViewController.swift; sourceTree = ""; };
C0121F272E94000A002DBAF2 /* AppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; };
C0121F602E94003E002DBAF2 /* Images.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Images.xcassets; sourceTree = ""; };
C0121F622E9400C4002DBAF2 /* ActionViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ActionViewController.swift; sourceTree = ""; };
C0121F642E9400C4002DBAF2 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; };
C0121F652E9400C4002DBAF2 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/MainInterface.storyboard; sourceTree = ""; };
C0121F672E9400C4002DBAF2 /* Media.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Media.xcassets; sourceTree = ""; };
C0121F6D2E9400DF002DBAF2 /* IQKeyboardAppearanceConfiguration.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = IQKeyboardAppearanceConfiguration.swift; sourceTree = ""; };
C0121F6E2E9400DF002DBAF2 /* IQKeyboardAppearanceManager.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = IQKeyboardAppearanceManager.swift; sourceTree = ""; };
C0121F6F2E9400DF002DBAF2 /* IQKeyboardAppearanceManager+Internal.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "IQKeyboardAppearanceManager+Internal.swift"; sourceTree = ""; };
C0121F702E9400DF002DBAF2 /* IQKeyboardManager+Appearance.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "IQKeyboardManager+Appearance.swift"; sourceTree = ""; };
C0121F712E9400DF002DBAF2 /* IQKeyboardManager+Appearance_Deprecated.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "IQKeyboardManager+Appearance_Deprecated.swift"; sourceTree = ""; };
C0121F732E9400DF002DBAF2 /* IQActiveConfiguration.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = IQActiveConfiguration.swift; sourceTree = ""; };
C0121F742E9400DF002DBAF2 /* IQRootControllerConfiguration.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = IQRootControllerConfiguration.swift; sourceTree = ""; };
C0121F752E9400DF002DBAF2 /* IQScrollViewConfiguration.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = IQScrollViewConfiguration.swift; sourceTree = ""; };
C0121F772E9400DF002DBAF2 /* IQKeyboardManager+Debug.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "IQKeyboardManager+Debug.swift"; sourceTree = ""; };
C0121F792E9400DF002DBAF2 /* IQKeyboardManager+Deprecated.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "IQKeyboardManager+Deprecated.swift"; sourceTree = ""; };
C0121F7B2E9400DF002DBAF2 /* UIScrollView+IQKeyboardManagerExtension.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "UIScrollView+IQKeyboardManagerExtension.swift"; sourceTree = ""; };
C0121F7C2E9400DF002DBAF2 /* UIScrollView+IQKeyboardManagerExtensionObjc.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "UIScrollView+IQKeyboardManagerExtensionObjc.swift"; sourceTree = ""; };
C0121F7D2E9400DF002DBAF2 /* UIView+IQKeyboardManagerExtension.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "UIView+IQKeyboardManagerExtension.swift"; sourceTree = ""; };
C0121F7E2E9400DF002DBAF2 /* UIView+IQKeyboardManagerExtensionObjc.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "UIView+IQKeyboardManagerExtensionObjc.swift"; sourceTree = ""; };
C0121F802E9400DF002DBAF2 /* UICollectionView+IndexPaths.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "UICollectionView+IndexPaths.swift"; sourceTree = ""; };
C0121F812E9400DF002DBAF2 /* UITableView+IndexPaths.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "UITableView+IndexPaths.swift"; sourceTree = ""; };
C0121F822E9400DF002DBAF2 /* UIView+Parent.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "UIView+Parent.swift"; sourceTree = ""; };
C0121F832E9400DF002DBAF2 /* UIView+ParentObjc.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "UIView+ParentObjc.swift"; sourceTree = ""; };
C0121F842E9400DF002DBAF2 /* UIViewController+ParentContainer.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "UIViewController+ParentContainer.swift"; sourceTree = ""; };
C0121F862E9400DF002DBAF2 /* IQKeyboardManager.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = IQKeyboardManager.swift; sourceTree = ""; };
C0121F872E9400DF002DBAF2 /* IQKeyboardManager+ActiveConfiguration.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "IQKeyboardManager+ActiveConfiguration.swift"; sourceTree = ""; };
C0121F882E9400DF002DBAF2 /* IQKeyboardManager+Internal.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "IQKeyboardManager+Internal.swift"; sourceTree = ""; };
C0121F892E9400DF002DBAF2 /* IQKeyboardManager+Position.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "IQKeyboardManager+Position.swift"; sourceTree = ""; };
C0121F8B2E9400DF002DBAF2 /* IQKeyboardManager+ToolbarManager.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "IQKeyboardManager+ToolbarManager.swift"; sourceTree = ""; };
C0121F8C2E9400DF002DBAF2 /* IQKeyboardManager+ToolbarManagerDeprecated.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "IQKeyboardManager+ToolbarManagerDeprecated.swift"; sourceTree = ""; };
C0121F8E2E9400DF002DBAF2 /* UIView+Resign.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "UIView+Resign.swift"; sourceTree = ""; };
C0121F8F2E9400DF002DBAF2 /* UIView+ResignObjc.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "UIView+ResignObjc.swift"; sourceTree = ""; };
C0121F912E9400DF002DBAF2 /* IQKeyboardManager+Resign.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "IQKeyboardManager+Resign.swift"; sourceTree = ""; };
C0121F922E9400DF002DBAF2 /* IQKeyboardManager+Resign_Deprecated.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "IQKeyboardManager+Resign_Deprecated.swift"; sourceTree = ""; };
C0121F932E9400DF002DBAF2 /* IQKeyboardResignHandler.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = IQKeyboardResignHandler.swift; sourceTree = ""; };
C0121F942E9400DF002DBAF2 /* IQKeyboardResignHandler+Internal.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "IQKeyboardResignHandler+Internal.swift"; sourceTree = ""; };
C0121F962E9400DF002DBAF2 /* IQKeyboardManagerSwift.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = IQKeyboardManagerSwift.h; sourceTree = ""; };
C0121F972E9400DF002DBAF2 /* PrivacyInfo.xcprivacy */ = {isa = PBXFileReference; lastKnownFileType = text.xml; path = PrivacyInfo.xcprivacy; sourceTree = ""; };
C0121FBA2E9408E5002DBAF2 /* IQTextInputViewNotification.xcframework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.xcframework; name = IQTextInputViewNotification.xcframework; path = ../Carthage/Build/IQTextInputViewNotification.xcframework; sourceTree = ""; };
C0121FBB2E9408E5002DBAF2 /* IQKeyboardCore.xcframework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.xcframework; name = IQKeyboardCore.xcframework; path = ../Carthage/Build/IQKeyboardCore.xcframework; sourceTree = ""; };
C0121FBC2E9408E5002DBAF2 /* IQKeyboardToolbarManager.xcframework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.xcframework; name = IQKeyboardToolbarManager.xcframework; path = ../Carthage/Build/IQKeyboardToolbarManager.xcframework; sourceTree = ""; };
C0121FBD2E9408E5002DBAF2 /* IQKeyboardReturnManager.xcframework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.xcframework; name = IQKeyboardReturnManager.xcframework; path = ../Carthage/Build/IQKeyboardReturnManager.xcframework; sourceTree = ""; };
C0121FBE2E9408E5002DBAF2 /* IQTextView.xcframework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.xcframework; name = IQTextView.xcframework; path = ../Carthage/Build/IQTextView.xcframework; sourceTree = ""; };
C0121FBF2E9408E5002DBAF2 /* IQKeyboardNotification.xcframework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.xcframework; name = IQKeyboardNotification.xcframework; path = ../Carthage/Build/IQKeyboardNotification.xcframework; sourceTree = ""; };
C0121FC02E9408E5002DBAF2 /* IQKeyboardToolbar.xcframework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.xcframework; name = IQKeyboardToolbar.xcframework; path = ../Carthage/Build/IQKeyboardToolbar.xcframework; sourceTree = ""; };
C01ED1FB2C6A4E33004BA157 /* IQKeyboardManagerSwift_iOS.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = IQKeyboardManagerSwift_iOS.framework; sourceTree = BUILT_PRODUCTS_DIR; };
C01ED2982C6A4EA1004BA157 /* IQKeyboardCore.xcframework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.xcframework; name = IQKeyboardCore.xcframework; path = Carthage/Build/IQKeyboardCore.xcframework; sourceTree = ""; };
C01ED29A2C6A4EAE004BA157 /* IQKeyboardNotification.xcframework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.xcframework; name = IQKeyboardNotification.xcframework; path = Carthage/Build/IQKeyboardNotification.xcframework; sourceTree = ""; };
C01ED29B2C6A4EAE004BA157 /* IQTextInputViewNotification.xcframework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.xcframework; name = IQTextInputViewNotification.xcframework; path = Carthage/Build/IQTextInputViewNotification.xcframework; sourceTree = ""; };
C01ED2EE2C6A4F4A004BA157 /* UIKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = UIKit.framework; path = Platforms/MacOSX.platform/Developer/SDKs/MacOSX14.2.sdk/System/iOSSupport/System/Library/Frameworks/UIKit.framework; sourceTree = DEVELOPER_DIR; };
C01ED2F02C6A4F4F004BA157 /* Foundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Foundation.framework; path = Platforms/MacOSX.platform/Developer/SDKs/MacOSX14.2.sdk/System/Library/Frameworks/Foundation.framework; sourceTree = DEVELOPER_DIR; };
C01ED2F22C6A4F54004BA157 /* CoreGraphics.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreGraphics.framework; path = Platforms/MacOSX.platform/Developer/SDKs/MacOSX14.2.sdk/System/Library/Frameworks/CoreGraphics.framework; sourceTree = DEVELOPER_DIR; };
C01ED2F42C6A4F5B004BA157 /* QuartzCore.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = QuartzCore.framework; path = Platforms/MacOSX.platform/Developer/SDKs/MacOSX14.2.sdk/System/Library/Frameworks/QuartzCore.framework; sourceTree = DEVELOPER_DIR; };
C03C946D273CF3FF00AF66B5 /* IQKeyboardManagerSwiftExampleExtension.appex */ = {isa = PBXFileReference; explicitFileType = "wrapper.app-extension"; includeInIndex = 0; path = IQKeyboardManagerSwiftExampleExtension.appex; sourceTree = BUILT_PRODUCTS_DIR; };
C0849B652CD8B4FC004D0CEC /* IQKeyboardReturnManager.xcframework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.xcframework; name = IQKeyboardReturnManager.xcframework; path = Carthage/Build/IQKeyboardReturnManager.xcframework; sourceTree = ""; };
C0974E0D2CCF9108008164EC /* IQKeyboardToolbar.xcframework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.xcframework; name = IQKeyboardToolbar.xcframework; path = Carthage/Build/IQKeyboardToolbar.xcframework; sourceTree = ""; };
C0974E0E2CCF9108008164EC /* IQKeyboardToolbarManager.xcframework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.xcframework; name = IQKeyboardToolbarManager.xcframework; path = Carthage/Build/IQKeyboardToolbarManager.xcframework; sourceTree = ""; };
C0974E0F2CCF9108008164EC /* IQTextView.xcframework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.xcframework; name = IQTextView.xcframework; path = Carthage/Build/IQTextView.xcframework; sourceTree = ""; };
C0ACB0F519CF104B0057B571 /* IQKeyboardManagerSwiftExampleSwift.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = IQKeyboardManagerSwiftExampleSwift.app; sourceTree = BUILT_PRODUCTS_DIR; };
C0B63B9F1781FAB1008D3B64 /* UIKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = UIKit.framework; path = System/Library/Frameworks/UIKit.framework; sourceTree = SDKROOT; };
C0B63BA11781FAB1008D3B64 /* Foundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Foundation.framework; path = System/Library/Frameworks/Foundation.framework; sourceTree = SDKROOT; };
C0B63BA31781FAB1008D3B64 /* CoreGraphics.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreGraphics.framework; path = System/Library/Frameworks/CoreGraphics.framework; sourceTree = SDKROOT; };
C911334C09686FAD2A4352D3 /* Pods-IQKeyboardManagerSwiftExample.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-IQKeyboardManagerSwiftExample.debug.xcconfig"; path = "Pods/Target Support Files/Pods-IQKeyboardManagerSwiftExample/Pods-IQKeyboardManagerSwiftExample.debug.xcconfig"; sourceTree = ""; };
/* End PBXFileReference section */
/* Begin PBXFrameworksBuildPhase section */
C01ED1F82C6A4E33004BA157 /* Frameworks */ = {
isa = PBXFrameworksBuildPhase;
buildActionMask = 2147483647;
files = (
C0121FC12E9408E5002DBAF2 /* IQTextInputViewNotification.xcframework in Frameworks */,
C0121FC22E9408E5002DBAF2 /* IQKeyboardCore.xcframework in Frameworks */,
C0121FC32E9408E5002DBAF2 /* IQKeyboardToolbarManager.xcframework in Frameworks */,
C0121FC42E9408E5002DBAF2 /* IQKeyboardReturnManager.xcframework in Frameworks */,
C0121FC52E9408E5002DBAF2 /* IQTextView.xcframework in Frameworks */,
C0121FC62E9408E5002DBAF2 /* IQKeyboardNotification.xcframework in Frameworks */,
C0121FC72E9408E5002DBAF2 /* IQKeyboardToolbar.xcframework in Frameworks */,
);
runOnlyForDeploymentPostprocessing = 0;
};
C03C946A273CF3FF00AF66B5 /* Frameworks */ = {
isa = PBXFrameworksBuildPhase;
buildActionMask = 2147483647;
files = (
);
runOnlyForDeploymentPostprocessing = 0;
};
C0ACB0F219CF104B0057B571 /* Frameworks */ = {
isa = PBXFrameworksBuildPhase;
buildActionMask = 2147483647;
files = (
56FCBF7C24C3668A007B0332 /* Foundation.framework in Frameworks */,
56FCBF7D24C3668E007B0332 /* UIKit.framework in Frameworks */,
56FCBF7B24C36686007B0332 /* CoreGraphics.framework in Frameworks */,
4CF58EAD1D36BD910081FB08 /* Social.framework in Frameworks */,
56FCBF7A24C36678007B0332 /* WebKit.framework in Frameworks */,
03ADCF0447958F5BE7A48B6B /* Pods_IQKeyboardManagerSwiftExample.framework in Frameworks */,
);
runOnlyForDeploymentPostprocessing = 0;
};
/* End PBXFrameworksBuildPhase section */
/* Begin PBXGroup section */
9D0BB82E18BB1AE100667349 /* Other Frameworks */ = {
isa = PBXGroup;
children = (
9D0BB82F18BB1AE100667349 /* Foundation.framework */,
9D0BB83018BB1AE100667349 /* CoreData.framework */,
9D0BB83118BB1AE100667349 /* AppKit.framework */,
);
name = "Other Frameworks";
sourceTree = "";
};
C0121EE12E94000A002DBAF2 /* Cell */ = {
isa = PBXGroup;
children = (
C0121EDA2E94000A002DBAF2 /* ColorTableViewCell.swift */,
C0121EDB2E94000A002DBAF2 /* ImageSwitchTableViewCell.swift */,
C0121EDC2E94000A002DBAF2 /* NavigationTableViewCell.swift */,
C0121EDD2E94000A002DBAF2 /* OptionTableViewCell.swift */,
C0121EDE2E94000A002DBAF2 /* StepperTableViewCell.swift */,
C0121EDF2E94000A002DBAF2 /* SwitchTableViewCell.swift */,
C0121EE02E94000A002DBAF2 /* TextFieldTableViewCell.swift */,
);
path = Cell;
sourceTree = "";
};
C0121EE32E94000A002DBAF2 /* Extension */ = {
isa = PBXGroup;
children = (
C0121EE22E94000A002DBAF2 /* UITableView+Extension.swift */,
);
path = Extension;
sourceTree = "";
};
C0121EE92E94000A002DBAF2 /* Resources */ = {
isa = PBXGroup;
children = (
C0121F602E94003E002DBAF2 /* Images.xcassets */,
C0121EE42E94000A002DBAF2 /* Info.plist */,
C0121EE72E94000A002DBAF2 /* InfoPlist.strings */,
C0121EE82E94000A002DBAF2 /* IQKeyboardManger-Swift-Bridging-Header.h */,
);
path = Resources;
sourceTree = "";
};
C0121F012E94000A002DBAF2 /* Storyboard */ = {
isa = PBXGroup;
children = (
C0121EEC2E94000A002DBAF2 /* FullScreenControllers.storyboard */,
C0121EEF2E94000A002DBAF2 /* General.storyboard */,
C0121EF22E94000A002DBAF2 /* Launch.storyboard */,
C0121EF52E94000A002DBAF2 /* Main.storyboard */,
C0121EF82E94000A002DBAF2 /* ScrollView.storyboard */,
C0121EFB2E94000A002DBAF2 /* Settings.storyboard */,
C0121EFE2E94000A002DBAF2 /* SpecialCase.storyboard */,
C0121F002E94000A002DBAF2 /* TestCases.storyboard */,
);
path = Storyboard;
sourceTree = "";
};
C0121F262E94000A002DBAF2 /* ViewController */ = {
isa = PBXGroup;
children = (
C0121F022E94000A002DBAF2 /* AutofillPasswordViewController.swift */,
C0121F032E94000A002DBAF2 /* BaseTableViewController.swift */,
C0121F042E94000A002DBAF2 /* BaseViewController.swift */,
C0121F052E94000A002DBAF2 /* CollectionViewDemoController.swift */,
C0121F062E94000A002DBAF2 /* CustomViewController.swift */,
C0121F072E94000A002DBAF2 /* EdgesForExtendedLayoutViewController.swift */,
C0121F082E94000A002DBAF2 /* EnableMode2000ViewController.swift */,
C0121F092E94000A002DBAF2 /* ExampleTableViewController.swift */,
C0121F0A2E94000A002DBAF2 /* ManualToolbarViewController.swift */,
C0121F0B2E94000A002DBAF2 /* NavigationBarViewController.swift */,
C0121F0C2E94000A002DBAF2 /* NavigationController.swift */,
C0121F0D2E94000A002DBAF2 /* NonScrollTextView1979ViewController.swift */,
C0121F0E2E94000A002DBAF2 /* OptionsViewController.swift */,
C0121F0F2E94000A002DBAF2 /* PageViewController.swift */,
C0121F102E94000A002DBAF2 /* PopoverViewController.swift */,
C0121F112E94000A002DBAF2 /* RefreshLayoutViewController.swift */,
C0121F122E94000A002DBAF2 /* ReloadLayout1892ViewController.swift */,
C0121F132E94000A002DBAF2 /* SafeAreaViewController.swift */,
C0121F142E94000A002DBAF2 /* ScrollViewController.swift */,
C0121F152E94000A002DBAF2 /* SearchViewController.swift */,
C0121F162E94000A002DBAF2 /* SettingsViewController.swift */,
C0121F172E94000A002DBAF2 /* SettingsViewController+TableView.swift */,
C0121F182E94000A002DBAF2 /* SpecialCaseViewController.swift */,
C0121F192E94000A002DBAF2 /* StackViewController.swift */,
C0121F1A2E94000A002DBAF2 /* TableViewContainerViewController.swift */,
C0121F1B2E94000A002DBAF2 /* TableViewController.swift */,
C0121F1C2E94000A002DBAF2 /* TableViewInContainerViewController.swift */,
C0121F1D2E94000A002DBAF2 /* TestViewController.swift */,
C0121F1E2E94000A002DBAF2 /* TextFieldHostingViewController.swift */,
C0121F1F2E94000A002DBAF2 /* TextFieldView.swift */,
C0121F202E94000A002DBAF2 /* TextFieldViewController.swift */,
C0121F212E94000A002DBAF2 /* TextSelectionViewController.swift */,
C0121F222E94000A002DBAF2 /* TextViewController.swift */,
C0121F232E94000A002DBAF2 /* TextViewSpecialCaseViewController.swift */,
C0121F242E94000A002DBAF2 /* ViewController.swift */,
C0121F252E94000A002DBAF2 /* WebViewController.swift */,
);
path = ViewController;
sourceTree = "";
};
C0121F282E94000A002DBAF2 /* IQKeyboardManagerSwiftExample */ = {
isa = PBXGroup;
children = (
C0121EE12E94000A002DBAF2 /* Cell */,
C0121EE32E94000A002DBAF2 /* Extension */,
C0121EE92E94000A002DBAF2 /* Resources */,
C0121F012E94000A002DBAF2 /* Storyboard */,
C0121F262E94000A002DBAF2 /* ViewController */,
C0121F272E94000A002DBAF2 /* AppDelegate.swift */,
);
path = IQKeyboardManagerSwiftExample;
sourceTree = "";
};
C0121F682E9400C4002DBAF2 /* IQKeyboardManagerSwiftExampleExtension */ = {
isa = PBXGroup;
children = (
C0121F622E9400C4002DBAF2 /* ActionViewController.swift */,
C0121F642E9400C4002DBAF2 /* Info.plist */,
C0121F662E9400C4002DBAF2 /* MainInterface.storyboard */,
C0121F672E9400C4002DBAF2 /* Media.xcassets */,
);
path = IQKeyboardManagerSwiftExampleExtension;
sourceTree = "";
};
C0121F722E9400DF002DBAF2 /* Appearance */ = {
isa = PBXGroup;
children = (
C0121F6D2E9400DF002DBAF2 /* IQKeyboardAppearanceConfiguration.swift */,
C0121F6E2E9400DF002DBAF2 /* IQKeyboardAppearanceManager.swift */,
C0121F6F2E9400DF002DBAF2 /* IQKeyboardAppearanceManager+Internal.swift */,
C0121F702E9400DF002DBAF2 /* IQKeyboardManager+Appearance.swift */,
C0121F712E9400DF002DBAF2 /* IQKeyboardManager+Appearance_Deprecated.swift */,
);
path = Appearance;
sourceTree = "";
};
C0121F762E9400DF002DBAF2 /* Configuration */ = {
isa = PBXGroup;
children = (
C0121F732E9400DF002DBAF2 /* IQActiveConfiguration.swift */,
C0121F742E9400DF002DBAF2 /* IQRootControllerConfiguration.swift */,
C0121F752E9400DF002DBAF2 /* IQScrollViewConfiguration.swift */,
);
path = Configuration;
sourceTree = "";
};
C0121F782E9400DF002DBAF2 /* Debug */ = {
isa = PBXGroup;
children = (
C0121F772E9400DF002DBAF2 /* IQKeyboardManager+Debug.swift */,
);
path = Debug;
sourceTree = "";
};
C0121F7A2E9400DF002DBAF2 /* Deprecated */ = {
isa = PBXGroup;
children = (
C0121F792E9400DF002DBAF2 /* IQKeyboardManager+Deprecated.swift */,
);
path = Deprecated;
sourceTree = "";
};
C0121F7F2E9400DF002DBAF2 /* IQKeyboardManagerExtension */ = {
isa = PBXGroup;
children = (
C0121F7B2E9400DF002DBAF2 /* UIScrollView+IQKeyboardManagerExtension.swift */,
C0121F7C2E9400DF002DBAF2 /* UIScrollView+IQKeyboardManagerExtensionObjc.swift */,
C0121F7D2E9400DF002DBAF2 /* UIView+IQKeyboardManagerExtension.swift */,
C0121F7E2E9400DF002DBAF2 /* UIView+IQKeyboardManagerExtensionObjc.swift */,
);
path = IQKeyboardManagerExtension;
sourceTree = "";
};
C0121F852E9400DF002DBAF2 /* UIKitExtensions */ = {
isa = PBXGroup;
children = (
C0121F802E9400DF002DBAF2 /* UICollectionView+IndexPaths.swift */,
C0121F812E9400DF002DBAF2 /* UITableView+IndexPaths.swift */,
C0121F822E9400DF002DBAF2 /* UIView+Parent.swift */,
C0121F832E9400DF002DBAF2 /* UIView+ParentObjc.swift */,
C0121F842E9400DF002DBAF2 /* UIViewController+ParentContainer.swift */,
);
path = UIKitExtensions;
sourceTree = "";
};
C0121F8A2E9400DF002DBAF2 /* IQKeyboardManager */ = {
isa = PBXGroup;
children = (
C0121F762E9400DF002DBAF2 /* Configuration */,
C0121F782E9400DF002DBAF2 /* Debug */,
C0121F7A2E9400DF002DBAF2 /* Deprecated */,
C0121F7F2E9400DF002DBAF2 /* IQKeyboardManagerExtension */,
C0121F852E9400DF002DBAF2 /* UIKitExtensions */,
C0121F862E9400DF002DBAF2 /* IQKeyboardManager.swift */,
C0121F872E9400DF002DBAF2 /* IQKeyboardManager+ActiveConfiguration.swift */,
C0121F882E9400DF002DBAF2 /* IQKeyboardManager+Internal.swift */,
C0121F892E9400DF002DBAF2 /* IQKeyboardManager+Position.swift */,
);
path = IQKeyboardManager;
sourceTree = "";
};
C0121F8D2E9400DF002DBAF2 /* IQKeyboardToolbarManager */ = {
isa = PBXGroup;
children = (
C0121F8B2E9400DF002DBAF2 /* IQKeyboardManager+ToolbarManager.swift */,
C0121F8C2E9400DF002DBAF2 /* IQKeyboardManager+ToolbarManagerDeprecated.swift */,
);
path = IQKeyboardToolbarManager;
sourceTree = "";
};
C0121F902E9400DF002DBAF2 /* UIKItExtensions */ = {
isa = PBXGroup;
children = (
C0121F8E2E9400DF002DBAF2 /* UIView+Resign.swift */,
C0121F8F2E9400DF002DBAF2 /* UIView+ResignObjc.swift */,
);
path = UIKItExtensions;
sourceTree = "";
};
C0121F952E9400DF002DBAF2 /* Resign */ = {
isa = PBXGroup;
children = (
C0121F902E9400DF002DBAF2 /* UIKItExtensions */,
C0121F912E9400DF002DBAF2 /* IQKeyboardManager+Resign.swift */,
C0121F922E9400DF002DBAF2 /* IQKeyboardManager+Resign_Deprecated.swift */,
C0121F932E9400DF002DBAF2 /* IQKeyboardResignHandler.swift */,
C0121F942E9400DF002DBAF2 /* IQKeyboardResignHandler+Internal.swift */,
);
path = Resign;
sourceTree = "";
};
C0121F982E9400DF002DBAF2 /* IQKeyboardManagerSwift */ = {
isa = PBXGroup;
children = (
C0121F722E9400DF002DBAF2 /* Appearance */,
C0121F8A2E9400DF002DBAF2 /* IQKeyboardManager */,
C0121F8D2E9400DF002DBAF2 /* IQKeyboardToolbarManager */,
C0121F952E9400DF002DBAF2 /* Resign */,
C0121F962E9400DF002DBAF2 /* IQKeyboardManagerSwift.h */,
C0121F972E9400DF002DBAF2 /* PrivacyInfo.xcprivacy */,
);
name = IQKeyboardManagerSwift;
path = ../IQKeyboardManagerSwift;
sourceTree = SOURCE_ROOT;
};
C0B63B901781FAB0008D3B64 = {
isa = PBXGroup;
children = (
C0121F282E94000A002DBAF2 /* IQKeyboardManagerSwiftExample */,
C0121F682E9400C4002DBAF2 /* IQKeyboardManagerSwiftExampleExtension */,
C0121F982E9400DF002DBAF2 /* IQKeyboardManagerSwift */,
C0B63B9E1781FAB1008D3B64 /* Frameworks */,
C0B63B9C1781FAB1008D3B64 /* Products */,
EFA5AFEC00910B83E6A41257 /* Pods */,
);
sourceTree = "";
};
C0B63B9C1781FAB1008D3B64 /* Products */ = {
isa = PBXGroup;
children = (
C0ACB0F519CF104B0057B571 /* IQKeyboardManagerSwiftExampleSwift.app */,
C03C946D273CF3FF00AF66B5 /* IQKeyboardManagerSwiftExampleExtension.appex */,
C01ED1FB2C6A4E33004BA157 /* IQKeyboardManagerSwift_iOS.framework */,
);
name = Products;
sourceTree = "";
};
C0B63B9E1781FAB1008D3B64 /* Frameworks */ = {
isa = PBXGroup;
children = (
C0121FBF2E9408E5002DBAF2 /* IQKeyboardNotification.xcframework */,
C0849B652CD8B4FC004D0CEC /* IQKeyboardReturnManager.xcframework */,
C0974E0D2CCF9108008164EC /* IQKeyboardToolbar.xcframework */,
C0121FBD2E9408E5002DBAF2 /* IQKeyboardReturnManager.xcframework */,
C0121FC02E9408E5002DBAF2 /* IQKeyboardToolbar.xcframework */,
C0974E0E2CCF9108008164EC /* IQKeyboardToolbarManager.xcframework */,
C0974E0F2CCF9108008164EC /* IQTextView.xcframework */,
C0121FBB2E9408E5002DBAF2 /* IQKeyboardCore.xcframework */,
C0121FBC2E9408E5002DBAF2 /* IQKeyboardToolbarManager.xcframework */,
C0121FBA2E9408E5002DBAF2 /* IQTextInputViewNotification.xcframework */,
C0121FBE2E9408E5002DBAF2 /* IQTextView.xcframework */,
C01ED2F42C6A4F5B004BA157 /* QuartzCore.framework */,
C01ED2F22C6A4F54004BA157 /* CoreGraphics.framework */,
C01ED2F02C6A4F4F004BA157 /* Foundation.framework */,
C01ED2EE2C6A4F4A004BA157 /* UIKit.framework */,
C01ED29A2C6A4EAE004BA157 /* IQKeyboardNotification.xcframework */,
C01ED29B2C6A4EAE004BA157 /* IQTextInputViewNotification.xcframework */,
C01ED2982C6A4EA1004BA157 /* IQKeyboardCore.xcframework */,
56FCBF7824C36672007B0332 /* WebKit.framework */,
9D9A0FC218C9DB5700585D3F /* Social.framework */,
C0B63B9F1781FAB1008D3B64 /* UIKit.framework */,
C0B63BA11781FAB1008D3B64 /* Foundation.framework */,
C0B63BA31781FAB1008D3B64 /* CoreGraphics.framework */,
9D0BB84118BB1AE100667349 /* XCTest.framework */,
9D0BB82E18BB1AE100667349 /* Other Frameworks */,
55CF83944ADEC65E0AF10B2E /* Pods_DemoObjC.framework */,
7AC7BF348A3EBFE4CD9EA9BD /* Pods_IQKeyboardManagerSwiftExample.framework */,
);
name = Frameworks;
sourceTree = "";
};
EFA5AFEC00910B83E6A41257 /* Pods */ = {
isa = PBXGroup;
children = (
C911334C09686FAD2A4352D3 /* Pods-IQKeyboardManagerSwiftExample.debug.xcconfig */,
35E6DD2330A3AF7B8F2DF86F /* Pods-IQKeyboardManagerSwiftExample.release.xcconfig */,
);
name = Pods;
sourceTree = "";
};
/* End PBXGroup section */
/* Begin PBXHeadersBuildPhase section */
C01ED1F62C6A4E33004BA157 /* Headers */ = {
isa = PBXHeadersBuildPhase;
buildActionMask = 2147483647;
files = (
C0121FB82E9400DF002DBAF2 /* IQKeyboardManagerSwift.h in Headers */,
);
runOnlyForDeploymentPostprocessing = 0;
};
/* End PBXHeadersBuildPhase section */
/* Begin PBXNativeTarget section */
C01ED1FA2C6A4E33004BA157 /* IQKeyboardManagerSwift-iOS */ = {
isa = PBXNativeTarget;
buildConfigurationList = C01ED2012C6A4E34004BA157 /* Build configuration list for PBXNativeTarget "IQKeyboardManagerSwift-iOS" */;
buildPhases = (
C01ED1F62C6A4E33004BA157 /* Headers */,
C01ED1F72C6A4E33004BA157 /* Sources */,
C01ED1F82C6A4E33004BA157 /* Frameworks */,
C01ED1F92C6A4E33004BA157 /* Resources */,
);
buildRules = (
);
dependencies = (
);
name = "IQKeyboardManagerSwift-iOS";
productName = IQKeyboardManagerSwift;
productReference = C01ED1FB2C6A4E33004BA157 /* IQKeyboardManagerSwift_iOS.framework */;
productType = "com.apple.product-type.framework";
};
C03C946C273CF3FF00AF66B5 /* IQKeyboardManagerSwiftExampleExtension */ = {
isa = PBXNativeTarget;
buildConfigurationList = C03C947E273CF3FF00AF66B5 /* Build configuration list for PBXNativeTarget "IQKeyboardManagerSwiftExampleExtension" */;
buildPhases = (
C03C9469273CF3FF00AF66B5 /* Sources */,
C03C946A273CF3FF00AF66B5 /* Frameworks */,
C03C946B273CF3FF00AF66B5 /* Resources */,
);
buildRules = (
);
dependencies = (
);
name = IQKeyboardManagerSwiftExampleExtension;
productName = DemoExtension;
productReference = C03C946D273CF3FF00AF66B5 /* IQKeyboardManagerSwiftExampleExtension.appex */;
productType = "com.apple.product-type.app-extension";
};
C0ACB0F419CF104B0057B571 /* IQKeyboardManagerSwiftExample */ = {
isa = PBXNativeTarget;
buildConfigurationList = C0ACB11119CF10510057B571 /* Build configuration list for PBXNativeTarget "IQKeyboardManagerSwiftExample" */;
buildPhases = (
D85D78F460B5CF0FF9536757 /* [CP] Check Pods Manifest.lock */,
C0ACB0F119CF104B0057B571 /* Sources */,
C0ACB0F219CF104B0057B571 /* Frameworks */,
C0ACB0F319CF104B0057B571 /* Resources */,
C0B6F1C124F668D6009A24B2 /* SwiftLint */,
17B2CF02857B50C3053DFA79 /* [CP] Embed Pods Frameworks */,
C03C947B273CF3FF00AF66B5 /* Embed Foundation Extensions */,
);
buildRules = (
);
dependencies = (
C03C9478273CF3FF00AF66B5 /* PBXTargetDependency */,
);
name = IQKeyboardManagerSwiftExample;
productName = "IQKeyboardManager Swift";
productReference = C0ACB0F519CF104B0057B571 /* IQKeyboardManagerSwiftExampleSwift.app */;
productType = "com.apple.product-type.application";
};
/* End PBXNativeTarget section */
/* Begin PBXProject section */
C0B63B921781FAB0008D3B64 /* Project object */ = {
isa = PBXProject;
attributes = {
BuildIndependentTargetsInParallel = YES;
DefaultBuildSystemTypeForWorkspace = Latest;
LastSwiftMigration = 0700;
LastSwiftUpdateCheck = 1250;
LastUpgradeCheck = 1520;
ORGANIZATIONNAME = Iftekhar;
TargetAttributes = {
C01ED1FA2C6A4E33004BA157 = {
CreatedOnToolsVersion = 15.2;
};
C03C946C273CF3FF00AF66B5 = {
CreatedOnToolsVersion = 12.5;
};
C0ACB0F419CF104B0057B571 = {
CreatedOnToolsVersion = 6.0.1;
LastSwiftMigration = 1020;
};
};
};
buildConfigurationList = C0B63B951781FAB0008D3B64 /* Build configuration list for PBXProject "IQKeyboardManagerSwiftExample" */;
compatibilityVersion = "Xcode 3.2";
developmentRegion = en;
hasScannedForEncodings = 0;
knownRegions = (
en,
es,
Base,
ar,
);
mainGroup = C0B63B901781FAB0008D3B64;
productRefGroup = C0B63B9C1781FAB1008D3B64 /* Products */;
projectDirPath = "";
projectRoot = "";
targets = (
C0ACB0F419CF104B0057B571 /* IQKeyboardManagerSwiftExample */,
C03C946C273CF3FF00AF66B5 /* IQKeyboardManagerSwiftExampleExtension */,
C01ED1FA2C6A4E33004BA157 /* IQKeyboardManagerSwift-iOS */,
);
};
/* End PBXProject section */
/* Begin PBXResourcesBuildPhase section */
C01ED1F92C6A4E33004BA157 /* Resources */ = {
isa = PBXResourcesBuildPhase;
buildActionMask = 2147483647;
files = (
C0121FB92E9400DF002DBAF2 /* PrivacyInfo.xcprivacy in Resources */,
);
runOnlyForDeploymentPostprocessing = 0;
};
C03C946B273CF3FF00AF66B5 /* Resources */ = {
isa = PBXResourcesBuildPhase;
buildActionMask = 2147483647;
files = (
C0121F6A2E9400C4002DBAF2 /* MainInterface.storyboard in Resources */,
C0121F6B2E9400C4002DBAF2 /* Media.xcassets in Resources */,
);
runOnlyForDeploymentPostprocessing = 0;
};
C0ACB0F319CF104B0057B571 /* Resources */ = {
isa = PBXResourcesBuildPhase;
buildActionMask = 2147483647;
files = (
C0121F292E94000A002DBAF2 /* General.storyboard in Resources */,
C0121F2A2E94000A002DBAF2 /* TestCases.storyboard in Resources */,
C0121F2B2E94000A002DBAF2 /* Settings.storyboard in Resources */,
C0121F2C2E94000A002DBAF2 /* Launch.storyboard in Resources */,
C0121F612E94003E002DBAF2 /* Images.xcassets in Resources */,
C0121F2D2E94000A002DBAF2 /* ScrollView.storyboard in Resources */,
C0121F2E2E94000A002DBAF2 /* InfoPlist.strings in Resources */,
C0121F302E94000A002DBAF2 /* Main.storyboard in Resources */,
C0121F312E94000A002DBAF2 /* SpecialCase.storyboard in Resources */,
C0121F322E94000A002DBAF2 /* FullScreenControllers.storyboard in Resources */,
);
runOnlyForDeploymentPostprocessing = 0;
};
/* End PBXResourcesBuildPhase section */
/* Begin PBXShellScriptBuildPhase section */
17B2CF02857B50C3053DFA79 /* [CP] Embed Pods Frameworks */ = {
isa = PBXShellScriptBuildPhase;
buildActionMask = 2147483647;
files = (
);
inputPaths = (
"${PODS_ROOT}/Target Support Files/Pods-IQKeyboardManagerSwiftExample/Pods-IQKeyboardManagerSwiftExample-frameworks.sh",
"${BUILT_PRODUCTS_DIR}/IQDropDownTextFieldSwift/IQDropDownTextFieldSwift.framework",
"${BUILT_PRODUCTS_DIR}/IQKeyboardCore/IQKeyboardCore.framework",
"${BUILT_PRODUCTS_DIR}/IQKeyboardManagerSwift/IQKeyboardManagerSwift.framework",
"${BUILT_PRODUCTS_DIR}/IQKeyboardNotification/IQKeyboardNotification.framework",
"${BUILT_PRODUCTS_DIR}/IQKeyboardReturnManager/IQKeyboardReturnManager.framework",
"${BUILT_PRODUCTS_DIR}/IQKeyboardToolbar/IQKeyboardToolbar.framework",
"${BUILT_PRODUCTS_DIR}/IQKeyboardToolbarManager/IQKeyboardToolbarManager.framework",
"${BUILT_PRODUCTS_DIR}/IQTextInputViewNotification/IQTextInputViewNotification.framework",
"${BUILT_PRODUCTS_DIR}/IQTextView/IQTextView.framework",
"${BUILT_PRODUCTS_DIR}/RSKPlaceholderTextView/RSKPlaceholderTextView.framework",
);
name = "[CP] Embed Pods Frameworks";
outputPaths = (
"${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/IQDropDownTextFieldSwift.framework",
"${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/IQKeyboardCore.framework",
"${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/IQKeyboardManagerSwift.framework",
"${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/IQKeyboardNotification.framework",
"${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/IQKeyboardReturnManager.framework",
"${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/IQKeyboardToolbar.framework",
"${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/IQKeyboardToolbarManager.framework",
"${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/IQTextInputViewNotification.framework",
"${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/IQTextView.framework",
"${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/RSKPlaceholderTextView.framework",
);
runOnlyForDeploymentPostprocessing = 0;
shellPath = /bin/sh;
shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-IQKeyboardManagerSwiftExample/Pods-IQKeyboardManagerSwiftExample-frameworks.sh\"\n";
showEnvVarsInLog = 0;
};
C0B6F1C124F668D6009A24B2 /* SwiftLint */ = {
isa = PBXShellScriptBuildPhase;
alwaysOutOfDate = 1;
buildActionMask = 2147483647;
files = (
);
inputFileListPaths = (
);
inputPaths = (
);
name = SwiftLint;
outputFileListPaths = (
);
outputPaths = (
);
runOnlyForDeploymentPostprocessing = 0;
shellPath = /bin/sh;
shellScript = "\"${PODS_ROOT}/SwiftLint/swiftlint\"\n";
};
D85D78F460B5CF0FF9536757 /* [CP] Check Pods Manifest.lock */ = {
isa = PBXShellScriptBuildPhase;
buildActionMask = 2147483647;
files = (
);
inputPaths = (
"${PODS_PODFILE_DIR_PATH}/Podfile.lock",
"${PODS_ROOT}/Manifest.lock",
);
name = "[CP] Check Pods Manifest.lock";
outputPaths = (
"$(DERIVED_FILE_DIR)/Pods-IQKeyboardManagerSwiftExample-checkManifestLockResult.txt",
);
runOnlyForDeploymentPostprocessing = 0;
shellPath = /bin/sh;
shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n";
showEnvVarsInLog = 0;
};
/* End PBXShellScriptBuildPhase section */
/* Begin PBXSourcesBuildPhase section */
C01ED1F72C6A4E33004BA157 /* Sources */ = {
isa = PBXSourcesBuildPhase;
buildActionMask = 2147483647;
files = (
C0121F992E9400DF002DBAF2 /* UITableView+IndexPaths.swift in Sources */,
C0121F9A2E9400DF002DBAF2 /* IQKeyboardAppearanceManager.swift in Sources */,
C0121F9B2E9400DF002DBAF2 /* IQRootControllerConfiguration.swift in Sources */,
C0121F9C2E9400DF002DBAF2 /* UIView+Parent.swift in Sources */,
C0121F9D2E9400DF002DBAF2 /* IQKeyboardManager+Appearance_Deprecated.swift in Sources */,
C0121F9E2E9400DF002DBAF2 /* IQKeyboardManager+ToolbarManager.swift in Sources */,
C0121F9F2E9400DF002DBAF2 /* UIView+IQKeyboardManagerExtension.swift in Sources */,
C0121FA02E9400DF002DBAF2 /* UIScrollView+IQKeyboardManagerExtensionObjc.swift in Sources */,
C0121FA12E9400DF002DBAF2 /* IQKeyboardManager+ActiveConfiguration.swift in Sources */,
C0121FA22E9400DF002DBAF2 /* IQKeyboardResignHandler+Internal.swift in Sources */,
C0121FA32E9400DF002DBAF2 /* IQKeyboardAppearanceManager+Internal.swift in Sources */,
C0121FA42E9400DF002DBAF2 /* UICollectionView+IndexPaths.swift in Sources */,
C0121FA52E9400DF002DBAF2 /* UIView+ParentObjc.swift in Sources */,
C0121FA62E9400DF002DBAF2 /* IQKeyboardManager+Appearance.swift in Sources */,
C0121FA72E9400DF002DBAF2 /* IQScrollViewConfiguration.swift in Sources */,
C0121FA82E9400DF002DBAF2 /* IQKeyboardAppearanceConfiguration.swift in Sources */,
C0121FA92E9400DF002DBAF2 /* UIView+ResignObjc.swift in Sources */,
C0121FAA2E9400DF002DBAF2 /* IQKeyboardManager+Internal.swift in Sources */,
C0121FAB2E9400DF002DBAF2 /* IQKeyboardResignHandler.swift in Sources */,
C0121FAC2E9400DF002DBAF2 /* IQKeyboardManager+ToolbarManagerDeprecated.swift in Sources */,
C0121FAD2E9400DF002DBAF2 /* IQKeyboardManager+Debug.swift in Sources */,
C0121FAE2E9400DF002DBAF2 /* IQKeyboardManager.swift in Sources */,
C0121FAF2E9400DF002DBAF2 /* IQKeyboardManager+Deprecated.swift in Sources */,
C0121FB02E9400DF002DBAF2 /* UIViewController+ParentContainer.swift in Sources */,
C0121FB12E9400DF002DBAF2 /* IQActiveConfiguration.swift in Sources */,
C0121FB22E9400DF002DBAF2 /* UIView+Resign.swift in Sources */,
C0121FB32E9400DF002DBAF2 /* IQKeyboardManager+Resign_Deprecated.swift in Sources */,
C0121FB42E9400DF002DBAF2 /* UIScrollView+IQKeyboardManagerExtension.swift in Sources */,
C0121FB52E9400DF002DBAF2 /* UIView+IQKeyboardManagerExtensionObjc.swift in Sources */,
C0121FB62E9400DF002DBAF2 /* IQKeyboardManager+Resign.swift in Sources */,
C0121FB72E9400DF002DBAF2 /* IQKeyboardManager+Position.swift in Sources */,
);
runOnlyForDeploymentPostprocessing = 0;
};
C03C9469273CF3FF00AF66B5 /* Sources */ = {
isa = PBXSourcesBuildPhase;
buildActionMask = 2147483647;
files = (
C0121F692E9400C4002DBAF2 /* ActionViewController.swift in Sources */,
);
runOnlyForDeploymentPostprocessing = 0;
};
C0ACB0F119CF104B0057B571 /* Sources */ = {
isa = PBXSourcesBuildPhase;
buildActionMask = 2147483647;
files = (
C0121F332E94000A002DBAF2 /* NonScrollTextView1979ViewController.swift in Sources */,
C0121F342E94000A002DBAF2 /* SettingsViewController.swift in Sources */,
C0121F352E94000A002DBAF2 /* TableViewController.swift in Sources */,
C0121F362E94000A002DBAF2 /* PageViewController.swift in Sources */,
C0121F372E94000A002DBAF2 /* BaseTableViewController.swift in Sources */,
C0121F382E94000A002DBAF2 /* TextFieldView.swift in Sources */,
C0121F392E94000A002DBAF2 /* NavigationController.swift in Sources */,
C0121F3A2E94000A002DBAF2 /* NavigationBarViewController.swift in Sources */,
C0121F3B2E94000A002DBAF2 /* ReloadLayout1892ViewController.swift in Sources */,
C0121F3C2E94000A002DBAF2 /* TextFieldHostingViewController.swift in Sources */,
C0121F3D2E94000A002DBAF2 /* EdgesForExtendedLayoutViewController.swift in Sources */,
C0121F3E2E94000A002DBAF2 /* StackViewController.swift in Sources */,
C0121F3F2E94000A002DBAF2 /* TextSelectionViewController.swift in Sources */,
C0121F402E94000A002DBAF2 /* TableViewInContainerViewController.swift in Sources */,
C0121F412E94000A002DBAF2 /* ScrollViewController.swift in Sources */,
C0121F422E94000A002DBAF2 /* TextViewSpecialCaseViewController.swift in Sources */,
C0121F432E94000A002DBAF2 /* AutofillPasswordViewController.swift in Sources */,
C0121F442E94000A002DBAF2 /* ViewController.swift in Sources */,
C0121F452E94000A002DBAF2 /* ManualToolbarViewController.swift in Sources */,
C0121F462E94000A002DBAF2 /* SwitchTableViewCell.swift in Sources */,
C0121F472E94000A002DBAF2 /* TestViewController.swift in Sources */,
C0121F482E94000A002DBAF2 /* AppDelegate.swift in Sources */,
C0121F492E94000A002DBAF2 /* TextViewController.swift in Sources */,
C0121F4A2E94000A002DBAF2 /* ImageSwitchTableViewCell.swift in Sources */,
C0121F4B2E94000A002DBAF2 /* TextFieldTableViewCell.swift in Sources */,
C0121F4C2E94000A002DBAF2 /* SpecialCaseViewController.swift in Sources */,
C0121F4D2E94000A002DBAF2 /* NavigationTableViewCell.swift in Sources */,
C0121F4E2E94000A002DBAF2 /* UITableView+Extension.swift in Sources */,
C0121F4F2E94000A002DBAF2 /* TableViewContainerViewController.swift in Sources */,
C0121F502E94000A002DBAF2 /* SearchViewController.swift in Sources */,
C0121F512E94000A002DBAF2 /* OptionTableViewCell.swift in Sources */,
C0121F522E94000A002DBAF2 /* CollectionViewDemoController.swift in Sources */,
C0121F532E94000A002DBAF2 /* TextFieldViewController.swift in Sources */,
C0121F542E94000A002DBAF2 /* OptionsViewController.swift in Sources */,
C0121F552E94000A002DBAF2 /* BaseViewController.swift in Sources */,
C0121F562E94000A002DBAF2 /* ExampleTableViewController.swift in Sources */,
C0121F572E94000A002DBAF2 /* WebViewController.swift in Sources */,
C0121F582E94000A002DBAF2 /* PopoverViewController.swift in Sources */,
C0121F592E94000A002DBAF2 /* EnableMode2000ViewController.swift in Sources */,
C0121F5A2E94000A002DBAF2 /* CustomViewController.swift in Sources */,
C0121F5B2E94000A002DBAF2 /* RefreshLayoutViewController.swift in Sources */,
C0121F5C2E94000A002DBAF2 /* ColorTableViewCell.swift in Sources */,
C0121F5D2E94000A002DBAF2 /* SettingsViewController+TableView.swift in Sources */,
C0121F5E2E94000A002DBAF2 /* StepperTableViewCell.swift in Sources */,
C0121F5F2E94000A002DBAF2 /* SafeAreaViewController.swift in Sources */,
);
runOnlyForDeploymentPostprocessing = 0;
};
/* End PBXSourcesBuildPhase section */
/* Begin PBXTargetDependency section */
C03C9478273CF3FF00AF66B5 /* PBXTargetDependency */ = {
isa = PBXTargetDependency;
target = C03C946C273CF3FF00AF66B5 /* IQKeyboardManagerSwiftExampleExtension */;
targetProxy = C03C9477273CF3FF00AF66B5 /* PBXContainerItemProxy */;
};
/* End PBXTargetDependency section */
/* Begin PBXVariantGroup section */
C0121EE72E94000A002DBAF2 /* InfoPlist.strings */ = {
isa = PBXVariantGroup;
children = (
C0121EE52E94000A002DBAF2 /* Base */,
C0121EE62E94000A002DBAF2 /* ar */,
);
name = InfoPlist.strings;
sourceTree = "";
};
C0121EEC2E94000A002DBAF2 /* FullScreenControllers.storyboard */ = {
isa = PBXVariantGroup;
children = (
C0121EEA2E94000A002DBAF2 /* Base */,
C0121EEB2E94000A002DBAF2 /* ar */,
);
name = FullScreenControllers.storyboard;
sourceTree = "";
};
C0121EEF2E94000A002DBAF2 /* General.storyboard */ = {
isa = PBXVariantGroup;
children = (
C0121EED2E94000A002DBAF2 /* Base */,
C0121EEE2E94000A002DBAF2 /* ar */,
);
name = General.storyboard;
sourceTree = "";
};
C0121EF22E94000A002DBAF2 /* Launch.storyboard */ = {
isa = PBXVariantGroup;
children = (
C0121EF02E94000A002DBAF2 /* Base */,
C0121EF12E94000A002DBAF2 /* ar */,
);
name = Launch.storyboard;
sourceTree = "";
};
C0121EF52E94000A002DBAF2 /* Main.storyboard */ = {
isa = PBXVariantGroup;
children = (
C0121EF32E94000A002DBAF2 /* Base */,
C0121EF42E94000A002DBAF2 /* ar */,
);
name = Main.storyboard;
sourceTree = "";
};
C0121EF82E94000A002DBAF2 /* ScrollView.storyboard */ = {
isa = PBXVariantGroup;
children = (
C0121EF62E94000A002DBAF2 /* Base */,
C0121EF72E94000A002DBAF2 /* ar */,
);
name = ScrollView.storyboard;
sourceTree = "";
};
C0121EFB2E94000A002DBAF2 /* Settings.storyboard */ = {
isa = PBXVariantGroup;
children = (
C0121EF92E94000A002DBAF2 /* Base */,
C0121EFA2E94000A002DBAF2 /* ar */,
);
name = Settings.storyboard;
sourceTree = "";
};
C0121EFE2E94000A002DBAF2 /* SpecialCase.storyboard */ = {
isa = PBXVariantGroup;
children = (
C0121EFC2E94000A002DBAF2 /* Base */,
C0121EFD2E94000A002DBAF2 /* ar */,
);
name = SpecialCase.storyboard;
sourceTree = "";
};
C0121F002E94000A002DBAF2 /* TestCases.storyboard */ = {
isa = PBXVariantGroup;
children = (
C0121EFF2E94000A002DBAF2 /* Base */,
);
name = TestCases.storyboard;
sourceTree = "";
};
C0121F662E9400C4002DBAF2 /* MainInterface.storyboard */ = {
isa = PBXVariantGroup;
children = (
C0121F652E9400C4002DBAF2 /* Base */,
);
name = MainInterface.storyboard;
sourceTree = "";
};
/* End PBXVariantGroup section */
/* Begin XCBuildConfiguration section */
C01ED1FF2C6A4E34004BA157 /* Debug */ = {
isa = XCBuildConfiguration;
buildSettings = {
CLANG_ANALYZER_NONNULL = YES;
CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE;
CLANG_CXX_LANGUAGE_STANDARD = "gnu++20";
CLANG_ENABLE_MODULES = YES;
CLANG_ENABLE_OBJC_WEAK = YES;
CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
CLANG_WARN_OBJC_LITERAL_CONVERSION = YES;
CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES;
CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE;
CODE_SIGN_STYLE = Automatic;
CURRENT_PROJECT_VERSION = 1;
DEBUG_INFORMATION_FORMAT = dwarf;
DEFINES_MODULE = YES;
DEVELOPMENT_TEAM = 7UUTF6T5P9;
DYLIB_COMPATIBILITY_VERSION = 1;
DYLIB_CURRENT_VERSION = 1;
DYLIB_INSTALL_NAME_BASE = "@rpath";
ENABLE_MODULE_VERIFIER = YES;
ENABLE_USER_SCRIPT_SANDBOXING = YES;
GCC_C_LANGUAGE_STANDARD = gnu17;
GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;
GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
GENERATE_INFOPLIST_FILE = YES;
INFOPLIST_KEY_NSHumanReadableCopyright = "Copyright © 2024 Iftekhar. All rights reserved.";
INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks";
IPHONEOS_DEPLOYMENT_TARGET = 13.0;
LD_RUNPATH_SEARCH_PATHS = (
"$(inherited)",
"@executable_path/Frameworks",
"@loader_path/Frameworks",
);
LOCALIZATION_PREFERS_STRING_CATALOGS = YES;
MARKETING_VERSION = 1.0;
MODULE_VERIFIER_SUPPORTED_LANGUAGES = "objective-c objective-c++";
MODULE_VERIFIER_SUPPORTED_LANGUAGE_STANDARDS = "gnu17 gnu++20";
MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE;
MTL_FAST_MATH = YES;
PRODUCT_BUNDLE_IDENTIFIER = com.infoenum.IQKeyboardManagerSwift;
PRODUCT_NAME = "$(TARGET_NAME:c99extidentifier)";
SKIP_INSTALL = YES;
SWIFT_ACTIVE_COMPILATION_CONDITIONS = "DEBUG $(inherited)";
SWIFT_EMIT_LOC_STRINGS = YES;
SWIFT_OPTIMIZATION_LEVEL = "-Onone";
SWIFT_VERSION = 5.0;
TARGETED_DEVICE_FAMILY = "1,2";
VERSIONING_SYSTEM = "apple-generic";
VERSION_INFO_PREFIX = "";
};
name = Debug;
};
C01ED2002C6A4E34004BA157 /* Release */ = {
isa = XCBuildConfiguration;
buildSettings = {
CLANG_ANALYZER_NONNULL = YES;
CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE;
CLANG_CXX_LANGUAGE_STANDARD = "gnu++20";
CLANG_ENABLE_MODULES = YES;
CLANG_ENABLE_OBJC_WEAK = YES;
CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
CLANG_WARN_OBJC_LITERAL_CONVERSION = YES;
CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES;
CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE;
CODE_SIGN_STYLE = Automatic;
COPY_PHASE_STRIP = NO;
CURRENT_PROJECT_VERSION = 1;
DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
DEFINES_MODULE = YES;
DEVELOPMENT_TEAM = 7UUTF6T5P9;
DYLIB_COMPATIBILITY_VERSION = 1;
DYLIB_CURRENT_VERSION = 1;
DYLIB_INSTALL_NAME_BASE = "@rpath";
ENABLE_MODULE_VERIFIER = YES;
ENABLE_NS_ASSERTIONS = NO;
ENABLE_USER_SCRIPT_SANDBOXING = YES;
GCC_C_LANGUAGE_STANDARD = gnu17;
GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;
GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
GENERATE_INFOPLIST_FILE = YES;
INFOPLIST_KEY_NSHumanReadableCopyright = "Copyright © 2024 Iftekhar. All rights reserved.";
INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks";
IPHONEOS_DEPLOYMENT_TARGET = 13.0;
LD_RUNPATH_SEARCH_PATHS = (
"$(inherited)",
"@executable_path/Frameworks",
"@loader_path/Frameworks",
);
LOCALIZATION_PREFERS_STRING_CATALOGS = YES;
MARKETING_VERSION = 1.0;
MODULE_VERIFIER_SUPPORTED_LANGUAGES = "objective-c objective-c++";
MODULE_VERIFIER_SUPPORTED_LANGUAGE_STANDARDS = "gnu17 gnu++20";
MTL_ENABLE_DEBUG_INFO = NO;
MTL_FAST_MATH = YES;
PRODUCT_BUNDLE_IDENTIFIER = com.infoenum.IQKeyboardManagerSwift;
PRODUCT_NAME = "$(TARGET_NAME:c99extidentifier)";
SKIP_INSTALL = YES;
SWIFT_EMIT_LOC_STRINGS = YES;
SWIFT_VERSION = 5.0;
TARGETED_DEVICE_FAMILY = "1,2";
VERSIONING_SYSTEM = "apple-generic";
VERSION_INFO_PREFIX = "";
};
name = Release;
};
C03C947C273CF3FF00AF66B5 /* Debug */ = {
isa = XCBuildConfiguration;
buildSettings = {
CLANG_ANALYZER_NONNULL = YES;
CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE;
CLANG_CXX_LANGUAGE_STANDARD = "gnu++14";
CLANG_CXX_LIBRARY = "libc++";
CLANG_ENABLE_MODULES = YES;
CLANG_ENABLE_OBJC_WEAK = YES;
CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
CLANG_WARN_OBJC_LITERAL_CONVERSION = YES;
CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE;
CODE_SIGN_ENTITLEMENTS = IQKeyboardManagerSwiftExampleExtension/IQKeyboardManagerSwiftExampleExtension.entitlements;
CODE_SIGN_IDENTITY = "Apple Development";
CODE_SIGN_STYLE = Automatic;
DEBUG_INFORMATION_FORMAT = dwarf;
DEVELOPMENT_TEAM = 7UUTF6T5P9;
GCC_C_LANGUAGE_STANDARD = gnu11;
GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;
GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
INFOPLIST_FILE = IQKeyboardManagerSwiftExampleExtension/Info.plist;
IPHONEOS_DEPLOYMENT_TARGET = 13.0;
LD_RUNPATH_SEARCH_PATHS = (
"$(inherited)",
"@executable_path/Frameworks",
"@executable_path/../../Frameworks",
);
MACOSX_DEPLOYMENT_TARGET = "$(RECOMMENDED_MACOSX_DEPLOYMENT_TARGET)";
MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE;
MTL_FAST_MATH = YES;
PRODUCT_BUNDLE_IDENTIFIER = com.iftekhar.IQKeyboardManagerSwiftExample.extension;
PRODUCT_NAME = "$(TARGET_NAME)";
PROVISIONING_PROFILE_SPECIFIER = "";
SKIP_INSTALL = YES;
SUPPORTS_MACCATALYST = YES;
SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG;
SWIFT_OPTIMIZATION_LEVEL = "-Onone";
SWIFT_VERSION = 5.0;
TARGETED_DEVICE_FAMILY = "1,2";
};
name = Debug;
};
C03C947D273CF3FF00AF66B5 /* Release */ = {
isa = XCBuildConfiguration;
buildSettings = {
CLANG_ANALYZER_NONNULL = YES;
CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE;
CLANG_CXX_LANGUAGE_STANDARD = "gnu++14";
CLANG_CXX_LIBRARY = "libc++";
CLANG_ENABLE_MODULES = YES;
CLANG_ENABLE_OBJC_WEAK = YES;
CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
CLANG_WARN_OBJC_LITERAL_CONVERSION = YES;
CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE;
CODE_SIGN_ENTITLEMENTS = IQKeyboardManagerSwiftExampleExtension/IQKeyboardManagerSwiftExampleExtension.entitlements;
CODE_SIGN_IDENTITY = "Apple Development";
CODE_SIGN_STYLE = Automatic;
COPY_PHASE_STRIP = NO;
DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
DEVELOPMENT_TEAM = 7UUTF6T5P9;
ENABLE_NS_ASSERTIONS = NO;
GCC_C_LANGUAGE_STANDARD = gnu11;
GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;
GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
INFOPLIST_FILE = IQKeyboardManagerSwiftExampleExtension/Info.plist;
IPHONEOS_DEPLOYMENT_TARGET = 13.0;
LD_RUNPATH_SEARCH_PATHS = (
"$(inherited)",
"@executable_path/Frameworks",
"@executable_path/../../Frameworks",
);
MACOSX_DEPLOYMENT_TARGET = "$(RECOMMENDED_MACOSX_DEPLOYMENT_TARGET)";
MTL_ENABLE_DEBUG_INFO = NO;
MTL_FAST_MATH = YES;
PRODUCT_BUNDLE_IDENTIFIER = com.iftekhar.IQKeyboardManagerSwiftExample.extension;
PRODUCT_NAME = "$(TARGET_NAME)";
PROVISIONING_PROFILE_SPECIFIER = "";
SKIP_INSTALL = YES;
SUPPORTS_MACCATALYST = YES;
SWIFT_VERSION = 5.0;
TARGETED_DEVICE_FAMILY = "1,2";
};
name = Release;
};
C0ACB11219CF10510057B571 /* Debug */ = {
isa = XCBuildConfiguration;
baseConfigurationReference = C911334C09686FAD2A4352D3 /* Pods-IQKeyboardManagerSwiftExample.debug.xcconfig */;
buildSettings = {
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
ASSETCATALOG_COMPILER_LAUNCHIMAGE_NAME = "";
CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x";
CLANG_CXX_LIBRARY = "libc++";
CLANG_ENABLE_MODULES = YES;
CLANG_MODULES_AUTOLINK = NO;
CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
CLANG_WARN_OBJC_LITERAL_CONVERSION = NO;
CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = "$(inherited)";
CLANG_WARN_SUSPICIOUS_IMPLICIT_CONVERSION = NO;
CLANG_WARN_UNREACHABLE_CODE = YES;
CODE_SIGN_ENTITLEMENTS = IQKeyboardManagerSwiftExample/Resources/IQKeyboardManagerSwiftExample.entitlements;
CODE_SIGN_IDENTITY = "Apple Development";
CODE_SIGN_STYLE = Automatic;
DEVELOPMENT_TEAM = 7UUTF6T5P9;
ENABLE_STRICT_OBJC_MSGSEND = YES;
GCC_PREPROCESSOR_DEFINITIONS = "$(inherited)";
GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;
GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
INFOPLIST_FILE = IQKeyboardManagerSwiftExample/Resources/Info.plist;
IPHONEOS_DEPLOYMENT_TARGET = 15.0;
LD_RUNPATH_SEARCH_PATHS = (
"$(inherited)",
"@executable_path/Frameworks",
);
MACOSX_DEPLOYMENT_TARGET = "$(RECOMMENDED_MACOSX_DEPLOYMENT_TARGET)";
MTL_ENABLE_DEBUG_INFO = YES;
OTHER_SWIFT_FLAGS = "$(inherited)";
PRODUCT_BUNDLE_IDENTIFIER = com.iftekhar.IQKeyboardManagerSwiftExample;
PRODUCT_NAME = IQKeyboardManagerSwiftExampleSwift;
PROVISIONING_PROFILE_SPECIFIER = "";
SUPPORTED_PLATFORMS = "iphoneos iphonesimulator";
SUPPORTS_MACCATALYST = NO;
SUPPORTS_MAC_DESIGNED_FOR_IPHONE_IPAD = NO;
SWIFT_OBJC_BRIDGING_HEADER = "IQKeyboardManagerSwiftExample/Resources/IQKeyboardManger-Swift-Bridging-Header.h";
SWIFT_OPTIMIZATION_LEVEL = "-Onone";
SWIFT_STRICT_CONCURRENCY = complete;
SWIFT_VERSION = 5.0;
TARGETED_DEVICE_FAMILY = "1,2,6";
};
name = Debug;
};
C0ACB11319CF10510057B571 /* Release */ = {
isa = XCBuildConfiguration;
baseConfigurationReference = 35E6DD2330A3AF7B8F2DF86F /* Pods-IQKeyboardManagerSwiftExample.release.xcconfig */;
buildSettings = {
ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
ASSETCATALOG_COMPILER_LAUNCHIMAGE_NAME = "";
CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x";
CLANG_CXX_LIBRARY = "libc++";
CLANG_ENABLE_MODULES = YES;
CLANG_MODULES_AUTOLINK = NO;
CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
CLANG_WARN_OBJC_LITERAL_CONVERSION = NO;
CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = "$(inherited)";
CLANG_WARN_SUSPICIOUS_IMPLICIT_CONVERSION = NO;
CLANG_WARN_UNREACHABLE_CODE = YES;
CODE_SIGN_ENTITLEMENTS = IQKeyboardManagerSwiftExample/Resources/IQKeyboardManagerSwiftExample.entitlements;
CODE_SIGN_IDENTITY = "Apple Development";
CODE_SIGN_STYLE = Automatic;
DEVELOPMENT_TEAM = 7UUTF6T5P9;
ENABLE_NS_ASSERTIONS = NO;
ENABLE_STRICT_OBJC_MSGSEND = YES;
GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;
GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
INFOPLIST_FILE = IQKeyboardManagerSwiftExample/Resources/Info.plist;
IPHONEOS_DEPLOYMENT_TARGET = 15.0;
LD_RUNPATH_SEARCH_PATHS = (
"$(inherited)",
"@executable_path/Frameworks",
);
MACOSX_DEPLOYMENT_TARGET = "$(RECOMMENDED_MACOSX_DEPLOYMENT_TARGET)";
MTL_ENABLE_DEBUG_INFO = NO;
OTHER_SWIFT_FLAGS = "$(inherited)";
PRODUCT_BUNDLE_IDENTIFIER = com.iftekhar.IQKeyboardManagerSwiftExample;
PRODUCT_NAME = IQKeyboardManagerSwiftExampleSwift;
PROVISIONING_PROFILE_SPECIFIER = "";
SUPPORTED_PLATFORMS = "iphoneos iphonesimulator";
SUPPORTS_MACCATALYST = NO;
SUPPORTS_MAC_DESIGNED_FOR_IPHONE_IPAD = NO;
SWIFT_OBJC_BRIDGING_HEADER = "IQKeyboardManagerSwiftExample/Resources/IQKeyboardManger-Swift-Bridging-Header.h";
SWIFT_STRICT_CONCURRENCY = complete;
SWIFT_VERSION = 5.0;
TARGETED_DEVICE_FAMILY = "1,2,6";
};
name = Release;
};
C0B63BB71781FAB1008D3B64 /* Debug */ = {
isa = XCBuildConfiguration;
buildSettings = {
ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = "$(inherited)";
ALWAYS_SEARCH_USER_PATHS = NO;
ASSETCATALOG_COMPILER_GENERATE_SWIFT_ASSET_SYMBOL_EXTENSIONS = YES;
CLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = YES;
CLANG_ENABLE_OBJC_ARC = YES;
CLANG_WARN_ASSIGN_ENUM = YES;
CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;
CLANG_WARN_BOOL_CONVERSION = YES;
CLANG_WARN_COMMA = YES;
CLANG_WARN_CONSTANT_CONVERSION = YES;
CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;
CLANG_WARN_DOCUMENTATION_COMMENTS = YES;
CLANG_WARN_EMPTY_BODY = YES;
CLANG_WARN_ENUM_CONVERSION = YES;
CLANG_WARN_IMPLICIT_SIGN_CONVERSION = NO;
CLANG_WARN_INFINITE_RECURSION = YES;
CLANG_WARN_INT_CONVERSION = YES;
CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;
CLANG_WARN_OBJC_EXPLICIT_OWNERSHIP_TYPE = YES;
CLANG_WARN_OBJC_IMPLICIT_ATOMIC_PROPERTIES = YES;
CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;
CLANG_WARN_OBJC_LITERAL_CONVERSION = NO;
CLANG_WARN_OBJC_MISSING_PROPERTY_SYNTHESIS = NO;
CLANG_WARN_OBJC_REPEATED_USE_OF_WEAK = YES;
CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = NO;
CLANG_WARN_RANGE_LOOP_ANALYSIS = YES;
CLANG_WARN_STRICT_PROTOTYPES = YES;
CLANG_WARN_SUSPICIOUS_IMPLICIT_CONVERSION = NO;
CLANG_WARN_SUSPICIOUS_MOVE = YES;
CLANG_WARN_UNREACHABLE_CODE = YES;
CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
COPY_PHASE_STRIP = NO;
CURRENT_PROJECT_VERSION = 1;
ENABLE_STRICT_OBJC_MSGSEND = YES;
ENABLE_TESTABILITY = YES;
GCC_C_LANGUAGE_STANDARD = gnu99;
GCC_DYNAMIC_NO_PIC = NO;
GCC_NO_COMMON_BLOCKS = YES;
GCC_OPTIMIZATION_LEVEL = 0;
GCC_PREPROCESSOR_DEFINITIONS = (
"DEBUG=1",
"$(inherited)",
);
GCC_SYMBOLS_PRIVATE_EXTERN = NO;
GCC_TREAT_IMPLICIT_FUNCTION_DECLARATIONS_AS_ERRORS = YES;
GCC_TREAT_INCOMPATIBLE_POINTER_TYPE_WARNINGS_AS_ERRORS = YES;
GCC_VERSION = com.apple.compilers.llvm.clang.1_0;
GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
GCC_WARN_ABOUT_MISSING_FIELD_INITIALIZERS = YES;
GCC_WARN_ABOUT_MISSING_PROTOTYPES = YES;
GCC_WARN_ABOUT_RETURN_TYPE = YES;
GCC_WARN_INITIALIZER_NOT_FULLY_BRACKETED = YES;
GCC_WARN_SHADOW = YES;
GCC_WARN_SIGN_COMPARE = NO;
GCC_WARN_STRICT_SELECTOR_MATCH = YES;
GCC_WARN_UNDECLARED_SELECTOR = YES;
GCC_WARN_UNINITIALIZED_AUTOS = YES;
GCC_WARN_UNKNOWN_PRAGMAS = YES;
GCC_WARN_UNUSED_FUNCTION = YES;
GCC_WARN_UNUSED_LABEL = YES;
GCC_WARN_UNUSED_PARAMETER = NO;
GCC_WARN_UNUSED_VARIABLE = YES;
IPHONEOS_DEPLOYMENT_TARGET = 17.0;
MACOSX_DEPLOYMENT_TARGET = 10.10;
MARKETING_VERSION = 6.5.13;
ONLY_ACTIVE_ARCH = YES;
OTHER_SWIFT_FLAGS = "$(inherited)";
SDKROOT = iphoneos;
SWIFT_VERSION = 5.0;
};
name = Debug;
};
C0B63BB81781FAB1008D3B64 /* Release */ = {
isa = XCBuildConfiguration;
buildSettings = {
ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = "$(inherited)";
ALWAYS_SEARCH_USER_PATHS = NO;
ASSETCATALOG_COMPILER_GENERATE_SWIFT_ASSET_SYMBOL_EXTENSIONS = YES;
CLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = YES;
CLANG_ENABLE_OBJC_ARC = YES;
CLANG_WARN_ASSIGN_ENUM = YES;
CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;
CLANG_WARN_BOOL_CONVERSION = YES;
CLANG_WARN_COMMA = YES;
CLANG_WARN_CONSTANT_CONVERSION = YES;
CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;
CLANG_WARN_DOCUMENTATION_COMMENTS = YES;
CLANG_WARN_EMPTY_BODY = YES;
CLANG_WARN_ENUM_CONVERSION = YES;
CLANG_WARN_IMPLICIT_SIGN_CONVERSION = NO;
CLANG_WARN_INFINITE_RECURSION = YES;
CLANG_WARN_INT_CONVERSION = YES;
CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;
CLANG_WARN_OBJC_EXPLICIT_OWNERSHIP_TYPE = YES;
CLANG_WARN_OBJC_IMPLICIT_ATOMIC_PROPERTIES = YES;
CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;
CLANG_WARN_OBJC_LITERAL_CONVERSION = NO;
CLANG_WARN_OBJC_MISSING_PROPERTY_SYNTHESIS = NO;
CLANG_WARN_OBJC_REPEATED_USE_OF_WEAK = YES;
CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = NO;
CLANG_WARN_RANGE_LOOP_ANALYSIS = YES;
CLANG_WARN_STRICT_PROTOTYPES = YES;
CLANG_WARN_SUSPICIOUS_IMPLICIT_CONVERSION = NO;
CLANG_WARN_SUSPICIOUS_MOVE = YES;
CLANG_WARN_UNREACHABLE_CODE = YES;
CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
COPY_PHASE_STRIP = YES;
CURRENT_PROJECT_VERSION = 1;
ENABLE_STRICT_OBJC_MSGSEND = YES;
GCC_C_LANGUAGE_STANDARD = gnu99;
GCC_NO_COMMON_BLOCKS = YES;
GCC_PREPROCESSOR_DEFINITIONS = "$(inherited)";
GCC_TREAT_IMPLICIT_FUNCTION_DECLARATIONS_AS_ERRORS = YES;
GCC_TREAT_INCOMPATIBLE_POINTER_TYPE_WARNINGS_AS_ERRORS = YES;
GCC_VERSION = com.apple.compilers.llvm.clang.1_0;
GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
GCC_WARN_ABOUT_MISSING_FIELD_INITIALIZERS = YES;
GCC_WARN_ABOUT_MISSING_PROTOTYPES = YES;
GCC_WARN_ABOUT_RETURN_TYPE = YES;
GCC_WARN_INITIALIZER_NOT_FULLY_BRACKETED = YES;
GCC_WARN_SHADOW = YES;
GCC_WARN_SIGN_COMPARE = NO;
GCC_WARN_STRICT_SELECTOR_MATCH = YES;
GCC_WARN_UNDECLARED_SELECTOR = YES;
GCC_WARN_UNINITIALIZED_AUTOS = YES;
GCC_WARN_UNKNOWN_PRAGMAS = YES;
GCC_WARN_UNUSED_FUNCTION = YES;
GCC_WARN_UNUSED_LABEL = YES;
GCC_WARN_UNUSED_PARAMETER = NO;
GCC_WARN_UNUSED_VARIABLE = YES;
IPHONEOS_DEPLOYMENT_TARGET = 17.0;
MACOSX_DEPLOYMENT_TARGET = 10.10;
MARKETING_VERSION = 6.5.13;
OTHER_CFLAGS = "-DNS_BLOCK_ASSERTIONS=1";
OTHER_SWIFT_FLAGS = "$(inherited)";
SDKROOT = iphoneos;
SWIFT_COMPILATION_MODE = wholemodule;
SWIFT_OPTIMIZATION_LEVEL = "-O";
SWIFT_VERSION = 5.0;
VALIDATE_PRODUCT = YES;
};
name = Release;
};
/* End XCBuildConfiguration section */
/* Begin XCConfigurationList section */
C01ED2012C6A4E34004BA157 /* Build configuration list for PBXNativeTarget "IQKeyboardManagerSwift-iOS" */ = {
isa = XCConfigurationList;
buildConfigurations = (
C01ED1FF2C6A4E34004BA157 /* Debug */,
C01ED2002C6A4E34004BA157 /* Release */,
);
defaultConfigurationIsVisible = 0;
defaultConfigurationName = Release;
};
C03C947E273CF3FF00AF66B5 /* Build configuration list for PBXNativeTarget "IQKeyboardManagerSwiftExampleExtension" */ = {
isa = XCConfigurationList;
buildConfigurations = (
C03C947C273CF3FF00AF66B5 /* Debug */,
C03C947D273CF3FF00AF66B5 /* Release */,
);
defaultConfigurationIsVisible = 0;
defaultConfigurationName = Release;
};
C0ACB11119CF10510057B571 /* Build configuration list for PBXNativeTarget "IQKeyboardManagerSwiftExample" */ = {
isa = XCConfigurationList;
buildConfigurations = (
C0ACB11219CF10510057B571 /* Debug */,
C0ACB11319CF10510057B571 /* Release */,
);
defaultConfigurationIsVisible = 0;
defaultConfigurationName = Release;
};
C0B63B951781FAB0008D3B64 /* Build configuration list for PBXProject "IQKeyboardManagerSwiftExample" */ = {
isa = XCConfigurationList;
buildConfigurations = (
C0B63BB71781FAB1008D3B64 /* Debug */,
C0B63BB81781FAB1008D3B64 /* Release */,
);
defaultConfigurationIsVisible = 0;
defaultConfigurationName = Release;
};
/* End XCConfigurationList section */
};
rootObject = C0B63B921781FAB0008D3B64 /* Project object */;
}
================================================
FILE: Example/IQKeyboardManagerSwiftExample.xcodeproj/project.xcworkspace/contents.xcworkspacedata
================================================
================================================
FILE: Example/IQKeyboardManagerSwiftExample.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist
================================================
IDEDidComputeMac32BitWarning
================================================
FILE: Example/IQKeyboardManagerSwiftExample.xcodeproj/xcshareddata/xcschemes/IQKeyboardManagerSwift.xcscheme
================================================
================================================
FILE: Example/IQKeyboardManagerSwiftExample.xcodeproj/xcshareddata/xcschemes/IQKeyboardManagerSwiftExample.xcscheme
================================================
================================================
FILE: Example/IQKeyboardManagerSwiftExample.xcodeproj/xcshareddata/xcschemes/IQKeyboardManagerSwiftExampleExtension.xcscheme
================================================
================================================
FILE: Example/IQKeyboardManagerSwiftExample.xcworkspace/contents.xcworkspacedata
================================================
================================================
FILE: Example/IQKeyboardManagerSwiftExampleExtension/ActionViewController.swift
================================================
//
// ActionViewController.swift
// https://github.com/hackiftekhar/IQKeyboardManager
// Copyright (c) 2013-24 Iftekhar Qurashi.
//
// Permission is hereby granted, free of charge, to any person obtaining a copy
// of this software and associated documentation files (the "Software"), to deal
// in the Software without restriction, including without limitation the rights
// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
// copies of the Software, and to permit persons to whom the Software is
// furnished to do so, subject to the following conditions:
//
// The above copyright notice and this permission notice shall be included in
// all copies or substantial portions of the Software.
//
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
// THE SOFTWARE.
import UIKit
import MobileCoreServices
class ActionViewController: UIViewController {
@IBOutlet weak var imageView: UIImageView!
override func viewDidLoad() {
super.viewDidLoad()
// Get the item[s] we're handling from the extension context.
// For example, look for an image and place it into an image view.
// Replace this with something appropriate for the type[s] your extension supports.
var imageFound = false
let inputItems = self.extensionContext?.inputItems as? [NSExtensionItem]
for item in inputItems ?? [] {
let attachements = item.attachments ?? []
for provider in attachements where provider.hasItemConformingToTypeIdentifier(kUTTypeImage as String) {
// This is an image. We'll load it, then place it in our image view.
weak var weakImageView = self.imageView
let identifier = kUTTypeImage as String
provider.loadItem(forTypeIdentifier: identifier, options: nil, completionHandler: { (imageURL, _) in
OperationQueue.main.addOperation {
if let strongImageView = weakImageView {
if let imageURL = imageURL as? URL, let data = try? Data(contentsOf: imageURL) {
strongImageView.image = UIImage(data: data)
}
}
}
})
imageFound = true
break
}
if imageFound {
// We only handle one image, so stop looking for more.
break
}
}
}
@IBAction func done() {
// Return any edited content to the host app.
// This template doesn't do anything, so we just echo the passed in items.
self.extensionContext!.completeRequest(returningItems: self.extensionContext!.inputItems,
completionHandler: nil)
}
}
================================================
FILE: Example/IQKeyboardManagerSwiftExampleExtension/Base.lproj/MainInterface.storyboard
================================================
================================================
FILE: Example/IQKeyboardManagerSwiftExampleExtension/IQKeyboardManagerSwiftExampleExtension.entitlements
================================================
com.apple.security.app-sandbox
com.apple.security.network.client
================================================
FILE: Example/IQKeyboardManagerSwiftExampleExtension/Info.plist
================================================
CFBundleDevelopmentRegion
$(DEVELOPMENT_LANGUAGE)
CFBundleDisplayName
IQKeyboardManagerSwiftExample Extension
CFBundleExecutable
$(EXECUTABLE_NAME)
CFBundleIdentifier
$(PRODUCT_BUNDLE_IDENTIFIER)
CFBundleInfoDictionaryVersion
6.0
CFBundleName
$(PRODUCT_NAME)
CFBundlePackageType
$(PRODUCT_BUNDLE_PACKAGE_TYPE)
CFBundleShortVersionString
$(MARKETING_VERSION)
CFBundleVersion
1
NSExtension
NSExtensionAttributes
NSExtensionActivationRule
NSExtensionActivationSupportsImageWithMaxCount
1
NSExtensionActivationSupportsMovieWithMaxCount
1
NSExtensionActivationSupportsWebURLWithMaxCount
1
NSExtensionServiceAllowsFinderPreviewItem
NSExtensionServiceAllowsTouchBarItem
NSExtensionServiceFinderPreviewIconName
NSActionTemplate
NSExtensionServiceTouchBarBezelColorName
TouchBarBezel
NSExtensionServiceTouchBarIconName
NSActionTemplate
NSExtensionMainStoryboard
MainInterface
NSExtensionPointIdentifier
com.apple.ui-services
================================================
FILE: Example/IQKeyboardManagerSwiftExampleExtension/Media.xcassets/Contents.json
================================================
{
"info" : {
"author" : "xcode",
"version" : 1
}
}
================================================
FILE: Example/IQKeyboardManagerSwiftExampleExtension/Media.xcassets/TouchBarBezel.colorset/Contents.json
================================================
{
"info" : {
"version" : 1,
"author" : "xcode"
},
"colors" : [
{
"idiom" : "mac",
"color" : {
"reference" : "systemPurpleColor"
}
}
]
}
================================================
FILE: Example/Podfile
================================================
project "IQKeyboardManagerSwiftExample.xcodeproj"
target "IQKeyboardManagerSwiftExample" do
use_frameworks!
platform :ios, "15.0"
pod "SwiftLint"
pod "IQDropDownTextFieldSwift"
pod "IQKeyboardManagerSwift", :path => "../"
pod "RSKPlaceholderTextView"
end
#target "IQKeyboardManagerSwiftExampleExtension" do
# platform :ios, "13.0"
#
# pod "SwiftLint"
# pod "IQKeyboardManagerSwift", :path => "../"
#
#end
================================================
FILE: IQKeyboardManagerSwift/Appearance/IQKeyboardAppearanceConfiguration.swift
================================================
//
// IQKeyboardAppearanceConfiguration.swift
// https://github.com/hackiftekhar/IQKeyboardManager
// Copyright (c) 2013-24 Iftekhar Qurashi.
//
// Permission is hereby granted, free of charge, to any person obtaining a copy
// of this software and associated documentation files (the "Software"), to deal
// in the Software without restriction, including without limitation the rights
// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
// copies of the Software, and to permit persons to whom the Software is
// furnished to do so, subject to the following conditions:
//
// The above copyright notice and this permission notice shall be included in
// all copies or substantial portions of the Software.
//
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
// THE SOFTWARE.
import UIKit
@available(iOSApplicationExtension, unavailable)
@MainActor
@objcMembers public final class IQKeyboardAppearanceConfiguration: NSObject {
/**
Override the keyboardAppearance for all textInputView. Default is NO.
*/
public var overrideAppearance: Bool = false
/**
If overrideKeyboardAppearance is YES, then all the textInputView keyboardAppearance is set using this property.
*/
public var appearance: UIKeyboardAppearance = .default
}
@available(*, unavailable, renamed: "IQKeyboardAppearanceConfiguration")
@MainActor
@objcMembers public final class IQKeyboardConfiguration: NSObject {}
================================================
FILE: IQKeyboardManagerSwift/Appearance/IQKeyboardAppearanceManager+Internal.swift
================================================
//
// IQKeyboardAppearanceManager+Internal.swift
// https://github.com/hackiftekhar/IQKeyboardManager
// Copyright (c) 2013-24 Iftekhar Qurashi.
//
// Permission is hereby granted, free of charge, to any person obtaining a copy
// of this software and associated documentation files (the "Software"), to deal
// in the Software without restriction, including without limitation the rights
// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
// copies of the Software, and to permit persons to whom the Software is
// furnished to do so, subject to the following conditions:
//
// The above copyright notice and this permission notice shall be included in
// all copies or substantial portions of the Software.
//
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
// THE SOFTWARE.
import UIKit
@available(iOSApplicationExtension, unavailable)
@MainActor
internal extension IQKeyboardAppearanceManager {
func removeTextInputViewObserver() {
textInputViewObserver.unsubscribe(identifier: "IQKeyboardAppearanceManager")
}
func addTextInputViewObserver() {
textInputViewObserver.subscribe(identifier: "IQKeyboardAppearanceManager",
changeHandler: { [weak self] event, textInputView in
guard let self = self else { return }
switch event {
case .beginEditing:
guard self.keyboardConfiguration.overrideAppearance,
textInputView.keyboardAppearance != self.keyboardConfiguration.appearance else { return }
textInputView.keyboardAppearance = self.keyboardConfiguration.appearance
textInputView.reloadInputViews()
case .endEditing:
break
}
})
}
}
================================================
FILE: IQKeyboardManagerSwift/Appearance/IQKeyboardAppearanceManager.swift
================================================
//
// IQKeyboardAppearanceManager.swift
// https://github.com/hackiftekhar/IQKeyboardManager
// Copyright (c) 2013-24 Iftekhar Qurashi.
//
// Permission is hereby granted, free of charge, to any person obtaining a copy
// of this software and associated documentation files (the "Software"), to deal
// in the Software without restriction, including without limitation the rights
// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
// copies of the Software, and to permit persons to whom the Software is
// furnished to do so, subject to the following conditions:
//
// The above copyright notice and this permission notice shall be included in
// all copies or substantial portions of the Software.
//
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
// THE SOFTWARE.
import UIKit
import IQTextInputViewNotification
@available(iOSApplicationExtension, unavailable)
@MainActor
@objcMembers internal final class IQKeyboardAppearanceManager: NSObject {
let textInputViewObserver: IQTextInputViewNotification = .init()
/**
Configuration related to keyboard appearance
*/
var keyboardConfiguration: IQKeyboardAppearanceConfiguration = .init()
public override init() {
super.init()
// Registering one time only
addTextInputViewObserver()
}
}
================================================
FILE: IQKeyboardManagerSwift/Appearance/IQKeyboardManager+Appearance.swift
================================================
//
// IQKeyboardManager+Appearance.swift
// https://github.com/hackiftekhar/IQKeyboardManager
// Copyright (c) 2013-24 Iftekhar Qurashi.
//
// Permission is hereby granted, free of charge, to any person obtaining a copy
// of this software and associated documentation files (the "Software"), to deal
// in the Software without restriction, including without limitation the rights
// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
// copies of the Software, and to permit persons to whom the Software is
// furnished to do so, subject to the following conditions:
//
// The above copyright notice and this permission notice shall be included in
// all copies or substantial portions of the Software.
//
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
// THE SOFTWARE.
import UIKit
@available(iOSApplicationExtension, unavailable)
@MainActor
@objc public extension IQKeyboardManager {
@MainActor
private struct AssociatedKeys {
static var appearanceManager: Int = 0
}
internal var appearanceManager: IQKeyboardAppearanceManager {
if let object = objc_getAssociatedObject(self, &AssociatedKeys.appearanceManager)
as? IQKeyboardAppearanceManager {
return object
}
let object: IQKeyboardAppearanceManager = .init()
objc_setAssociatedObject(self, &AssociatedKeys.appearanceManager,
object, .OBJC_ASSOCIATION_RETAIN_NONATOMIC)
return object
}
/**
Configuration related to keyboard appearance
*/
var keyboardConfiguration: IQKeyboardAppearanceConfiguration {
get { appearanceManager.keyboardConfiguration }
set { appearanceManager.keyboardConfiguration = newValue }
}
}
================================================
FILE: IQKeyboardManagerSwift/Appearance/IQKeyboardManager+Appearance_Deprecated.swift
================================================
//
// IQKeyboardManager+Appearance_Deprecated.swift
// https://github.com/hackiftekhar/IQKeyboardManager
// Copyright (c) 2013-24 Iftekhar Qurashi.
//
// Permission is hereby granted, free of charge, to any person obtaining a copy
// of this software and associated documentation files (the "Software"), to deal
// in the Software without restriction, including without limitation the rights
// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
// copies of the Software, and to permit persons to whom the Software is
// furnished to do so, subject to the following conditions:
//
// The above copyright notice and this permission notice shall be included in
// all copies or substantial portions of the Software.
//
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
// THE SOFTWARE.
import UIKit
// swiftlint:disable unused_setter_value
@available(iOSApplicationExtension, unavailable)
@MainActor
@objc public extension IQKeyboardManager {
@available(*, unavailable, renamed: "keyboardConfiguration.overrideAppearance")
var overrideKeyboardAppearance: Bool {
get { false }
set { }
}
@available(*, unavailable, renamed: "keyboardConfiguration.appearance")
var keyboardAppearance: UIKeyboardAppearance {
get { .default }
set { }
}
}
// swiftlint:enable unused_setter_value
================================================
FILE: IQKeyboardManagerSwift/IQKeyboardManager/Configuration/IQActiveConfiguration.swift
================================================
//
// IQActiveConfiguration.swift
// https://github.com/hackiftekhar/IQKeyboardManager
// Copyright (c) 2013-24 Iftekhar Qurashi.
//
// Permission is hereby granted, free of charge, to any person obtaining a copy
// of this software and associated documentation files (the "Software"), to deal
// in the Software without restriction, including without limitation the rights
// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
// copies of the Software, and to permit persons to whom the Software is
// furnished to do so, subject to the following conditions:
//
// The above copyright notice and this permission notice shall be included in
// all copies or substantial portions of the Software.
//
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
// THE SOFTWARE.
import UIKit
import IQKeyboardCore
import IQKeyboardNotification
import IQTextInputViewNotification
import Combine
@available(iOSApplicationExtension, unavailable)
@MainActor
internal final class IQActiveConfiguration: NSObject {
private let keyboardObserver: IQKeyboardNotification = .init()
private let textInputViewObserver: IQTextInputViewNotification = .init()
private var changeObservers: [AnyHashable: ConfigurationCompletion] = [:]
var cancellable: Set = []
enum Event: Int {
case hide
case show
case change
var name: String {
switch self {
case .hide:
return "hide"
case .show:
return "show"
case .change:
return "change"
}
}
}
private var lastEvent: Event = .hide
var rootConfiguration: IQRootControllerConfiguration?
var isReady: Bool {
if textInputViewInfo != nil,
let rootConfiguration = rootConfiguration {
return rootConfiguration.isReady
}
return false
}
override init() {
super.init()
addKeyboardObserver()
addTextInputViewObserver()
}
private func sendEvent() {
guard let rootConfiguration = rootConfiguration,
rootConfiguration.isReady else { return }
if keyboardInfo.isVisible {
if lastEvent == .hide {
self.notify(event: .show, keyboardInfo: keyboardInfo, textInputViewInfo: textInputViewInfo)
} else {
self.notify(event: .change, keyboardInfo: keyboardInfo, textInputViewInfo: textInputViewInfo)
}
} else if lastEvent != .hide {
if rootConfiguration.beginOrientation == rootConfiguration.currentOrientation {
// If interactive pop gesture is active then it manipulate viewController.view's frame
// To overcome with this, we have to do this workaround.
if rootConfiguration.isInteractiveGestureActive,
let rootController: UIViewController = rootConfiguration.rootController {
self.cancellable.forEach { $0.cancel() }
self.cancellable.removeAll()
// Saving current keyboard info and textInputView
let keyboardInfo = keyboardObserver.keyboardInfo
let textInputViewInfo = textInputViewObserver.textInputViewInfo
// Start observing frame changes.
// If pop successful, then we'll not get callbacks here again
// If user cancels the pop, then we'll get frame as .zero at some time
// Also the interactiveGesture becomes inactive (genuinely it's state is .possible)
// At this moment.
rootController.view.publisher(for: \.frame)
.removeDuplicates()
.sink(receiveValue: { [weak self] frame in
guard let self = self else { return }
guard frame.origin == .zero,
!rootConfiguration.isInteractiveGestureActive else { return }
self.cancellable.forEach { $0.cancel() }
self.cancellable.removeAll()
// Restore keyboard info and textInputViewInfo
self.notify(event: .change, keyboardInfo: keyboardInfo, textInputViewInfo: textInputViewInfo)
}).store(in: &cancellable)
} else {
self.notify(event: .hide, keyboardInfo: keyboardInfo, textInputViewInfo: textInputViewInfo)
self.rootConfiguration = nil
}
} else if rootConfiguration.hasChanged {
animate(alongsideTransition: {
rootConfiguration.restore()
}, completion: nil)
}
}
}
private func updateRootController(textInputView: IQTextInputView?) {
guard let textInputView: UIView = textInputView,
let controller: UIViewController = textInputView.iq.parentContainerViewController() else {
if let rootConfiguration = rootConfiguration,
rootConfiguration.hasChanged {
animate(alongsideTransition: {
rootConfiguration.restore()
}, completion: nil)
}
rootConfiguration = nil
return
}
let newConfiguration = IQRootControllerConfiguration(rootController: controller)
guard newConfiguration.rootController?.view.window != rootConfiguration?.rootController?.view.window ||
newConfiguration.beginOrientation != rootConfiguration?.beginOrientation else { return }
if rootConfiguration?.rootController != newConfiguration.rootController {
// If there was an old configuration but things are changed
if let rootConfiguration = rootConfiguration,
rootConfiguration.hasChanged {
animate(alongsideTransition: {
rootConfiguration.restore()
}, completion: nil)
}
}
rootConfiguration = newConfiguration
}
}
@available(iOSApplicationExtension, unavailable)
@MainActor
extension IQActiveConfiguration {
var keyboardInfo: IQKeyboardInfo {
return keyboardObserver.keyboardInfo
}
private func addKeyboardObserver() {
keyboardObserver.subscribe(identifier: "IQActiveConfiguration", changeHandler: { [weak self] _, endFrame in
guard let self = self else { return }
guard self.keyboardObserver.oldKeyboardInfo.endFrame.height != endFrame.height else { return }
if let info = self.textInputViewInfo, self.keyboardInfo.isVisible {
if let rootConfiguration = self.rootConfiguration {
let beginIsPortrait: Bool = rootConfiguration.beginOrientation.isPortrait
let currentIsPortrait: Bool = rootConfiguration.currentOrientation.isPortrait
if beginIsPortrait != currentIsPortrait {
self.updateRootController(textInputView: info.textInputView)
}
} else {
self.updateRootController(textInputView: info.textInputView)
}
}
self.sendEvent()
// If interactive pop gesture is active then we don't want to remove this textField
if endFrame.height == 0,
!(self.rootConfiguration?.isInteractiveGestureActive ?? false) {
self.updateRootController(textInputView: nil)
}
})
}
public func animate(alongsideTransition transition: @escaping () -> Void, completion: (() -> Void)? = nil) {
keyboardObserver.animate(alongsideTransition: transition, completion: completion)
}
}
@available(iOSApplicationExtension, unavailable)
@MainActor
extension IQActiveConfiguration {
var textInputView: (any IQTextInputView)? {
guard let textInputView: UIView = textInputViewObserver.textInputView,
textInputView.iq.isAlertViewTextField() == false else {
return nil
}
return textInputViewObserver.textInputView
}
var textInputViewInfo: IQTextInputViewInfo? {
guard let textInputView: UIView = textInputView,
textInputView.iq.isAlertViewTextField() == false else {
return nil
}
return textInputViewObserver.textInputViewInfo
}
private func addTextInputViewObserver() {
textInputViewObserver.subscribe(identifier: "IQActiveConfiguration",
changeHandler: { [weak self] event, textInputView in
guard let self = self else { return }
guard (textInputView as UIView).iq.isAlertViewTextField() == false else {
return
}
if event == .beginEditing {
self.updateRootController(textInputView: textInputView)
self.sendEvent()
}
})
}
}
@available(iOSApplicationExtension, unavailable)
@MainActor
extension IQActiveConfiguration {
typealias ConfigurationCompletion = (_ event: Event,
_ keyboardInfo: IQKeyboardInfo,
_ textInputViewInfo: IQTextInputViewInfo?) -> Void
func subscribe(identifier: AnyHashable, changeHandler: @escaping ConfigurationCompletion) {
changeObservers[identifier] = changeHandler
}
func unsubscribe(identifier: AnyHashable) {
changeObservers[identifier] = nil
}
private func notify(event: Event, keyboardInfo: IQKeyboardInfo, textInputViewInfo: IQTextInputViewInfo?) {
lastEvent = event
for block in changeObservers.values {
block(event, keyboardInfo, textInputViewInfo)
}
}
}
================================================
FILE: IQKeyboardManagerSwift/IQKeyboardManager/Configuration/IQRootControllerConfiguration.swift
================================================
//
// IQRootControllerConfiguration.swift
// https://github.com/hackiftekhar/IQKeyboardManager
// Copyright (c) 2013-24 Iftekhar Qurashi.
//
// Permission is hereby granted, free of charge, to any person obtaining a copy
// of this software and associated documentation files (the "Software"), to deal
// in the Software without restriction, including without limitation the rights
// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
// copies of the Software, and to permit persons to whom the Software is
// furnished to do so, subject to the following conditions:
//
// The above copyright notice and this permission notice shall be included in
// all copies or substantial portions of the Software.
//
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
// THE SOFTWARE.
import UIKit
@available(iOSApplicationExtension, unavailable)
@MainActor
internal struct IQRootControllerConfiguration {
weak var rootController: UIViewController?
let beginOrigin: CGPoint
let beginSafeAreaInsets: UIEdgeInsets
let beginOrientation: UIInterfaceOrientation
init(rootController: UIViewController) {
self.rootController = rootController
beginOrigin = rootController.view.frame.origin
beginSafeAreaInsets = rootController.view.safeAreaInsets
let interfaceOrientation: UIInterfaceOrientation
if let scene = rootController.view.window?.windowScene {
interfaceOrientation = scene.interfaceOrientation
} else {
interfaceOrientation = .unknown
}
beginOrientation = interfaceOrientation
}
var currentOrientation: UIInterfaceOrientation {
let interfaceOrientation: UIInterfaceOrientation
if let scene = rootController?.view.window?.windowScene {
interfaceOrientation = scene.interfaceOrientation
} else {
interfaceOrientation = .unknown
}
return interfaceOrientation
}
var isReady: Bool {
return rootController?.view.window != nil
}
var hasChanged: Bool {
let origin: CGPoint = rootController?.view.frame.origin ?? .zero
return !origin.equalTo(beginOrigin)
}
var isInteractiveGestureActive: Bool {
guard let rootController: UIViewController = rootController,
let navigationController: UINavigationController = rootController.navigationController,
let interactiveGestureRecognizer = navigationController.interactivePopGestureRecognizer else {
return false
}
switch interactiveGestureRecognizer.state {
case .began, .changed:
return true
case .possible, .ended, .cancelled, .failed, .recognized:
// swiftlint:disable:next no_fallthrough_only
fallthrough
default:
return false
}
}
@discardableResult
func restore() -> Bool {
guard let rootController: UIViewController = rootController,
!rootController.view.frame.origin.equalTo(beginOrigin) else { return false }
// Setting it's new frame
var rect: CGRect = rootController.view.frame
rect.origin = beginOrigin
rootController.view.frame = rect
return true
}
}
================================================
FILE: IQKeyboardManagerSwift/IQKeyboardManager/Configuration/IQScrollViewConfiguration.swift
================================================
//
// IQScrollViewConfiguration.swift
// https://github.com/hackiftekhar/IQKeyboardManager
// Copyright (c) 2013-24 Iftekhar Qurashi.
//
// Permission is hereby granted, free of charge, to any person obtaining a copy
// of this software and associated documentation files (the "Software"), to deal
// in the Software without restriction, including without limitation the rights
// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
// copies of the Software, and to permit persons to whom the Software is
// furnished to do so, subject to the following conditions:
//
// The above copyright notice and this permission notice shall be included in
// all copies or substantial portions of the Software.
//
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
// THE SOFTWARE.
import UIKit
import IQKeyboardCore
@available(iOSApplicationExtension, unavailable)
@MainActor
internal struct IQScrollViewConfiguration {
let scrollView: UIScrollView
let startingContentOffset: CGPoint
let startingScrollIndicatorInsets: UIEdgeInsets
let startingContentInset: UIEdgeInsets
private let canRestoreContentOffset: Bool
init(scrollView: UIScrollView, canRestoreContentOffset: Bool) {
self.scrollView = scrollView
self.canRestoreContentOffset = canRestoreContentOffset
startingContentOffset = scrollView.contentOffset
startingContentInset = scrollView.contentInset
startingScrollIndicatorInsets = scrollView.verticalScrollIndicatorInsets
}
var hasChanged: Bool {
if scrollView.contentInset != self.startingContentInset {
return true
}
if canRestoreContentOffset,
scrollView.iq.restoreContentOffset,
!scrollView.contentOffset.equalTo(startingContentOffset) {
return true
}
return false
}
@discardableResult
func restore(for textInputView: (some IQTextInputView)?) -> Bool {
var success: Bool = false
if scrollView.contentInset != self.startingContentInset {
scrollView.contentInset = self.startingContentInset
scrollView.layoutIfNeeded() // (Bug ID: #1996)
success = true
}
if scrollView.verticalScrollIndicatorInsets != self.startingScrollIndicatorInsets {
scrollView.verticalScrollIndicatorInsets = self.startingScrollIndicatorInsets
}
if canRestoreContentOffset,
scrollView.iq.restoreContentOffset,
!scrollView.contentOffset.equalTo(startingContentOffset) {
// (Bug ID: #1365, #1508, #1541)
let stackView: UIStackView?
if let textInputView: UIView = textInputView {
stackView = textInputView.iq.superviewOf(type: UIStackView.self,
belowView: scrollView)
} else {
stackView = nil
}
// (Bug ID: #1901, #1996)
let animatedContentOffset: Bool = stackView != nil ||
scrollView is UICollectionView ||
scrollView is UITableView
if animatedContentOffset {
scrollView.setContentOffset(startingContentOffset, animated: UIView.areAnimationsEnabled)
} else {
scrollView.contentOffset = startingContentOffset
}
success = true
}
return success
}
}
================================================
FILE: IQKeyboardManagerSwift/IQKeyboardManager/Debug/IQKeyboardManager+Debug.swift
================================================
//
// IQKeyboardManager+Debug.swift
// https://github.com/hackiftekhar/IQKeyboardManager
// Copyright (c) 2013-24 Iftekhar Qurashi.
//
// Permission is hereby granted, free of charge, to any person obtaining a copy
// of this software and associated documentation files (the "Software"), to deal
// in the Software without restriction, including without limitation the rights
// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
// copies of the Software, and to permit persons to whom the Software is
// furnished to do so, subject to the following conditions:
//
// The above copyright notice and this permission notice shall be included in
// all copies or substantial portions of the Software.
//
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
// THE SOFTWARE.
import UIKit
// MARK: Debugging & Developer options
@available(iOSApplicationExtension, unavailable)
@MainActor
@objc public extension IQKeyboardManager {
@MainActor
private struct AssociatedKeys {
static var isDebuggingEnabled: Int = 0
static var logIndentation: Int = 0
}
var isDebuggingEnabled: Bool {
get {
return objc_getAssociatedObject(self, &AssociatedKeys.isDebuggingEnabled) as? Bool ?? false
}
set(newValue) {
objc_setAssociatedObject(self, &AssociatedKeys.isDebuggingEnabled,
newValue, .OBJC_ASSOCIATION_RETAIN_NONATOMIC)
}
}
private var logIndentation: Int {
get {
return objc_getAssociatedObject(self, &AssociatedKeys.logIndentation) as? Int ?? 0
}
set(newValue) {
objc_setAssociatedObject(self, &AssociatedKeys.logIndentation,
newValue, .OBJC_ASSOCIATION_RETAIN_NONATOMIC)
}
}
internal func showLog(_ logString: String, indentation: Int = 0) {
guard isDebuggingEnabled else {
return
}
if indentation < 0 {
logIndentation = max(0, logIndentation + indentation)
}
var preLog: String = "IQKeyboardManager"
for _ in 0 ... logIndentation {
preLog += "|\t"
}
print(preLog + logString)
if indentation > 0 {
logIndentation += indentation
}
}
}
================================================
FILE: IQKeyboardManagerSwift/IQKeyboardManager/Deprecated/IQKeyboardManager+Deprecated.swift
================================================
//
// IQKeyboardManager+Deprecated.swift
// https://github.com/hackiftekhar/IQKeyboardManager
// Copyright (c) 2013-24 Iftekhar Qurashi.
//
// Permission is hereby granted, free of charge, to any person obtaining a copy
// of this software and associated documentation files (the "Software"), to deal
// in the Software without restriction, including without limitation the rights
// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
// copies of the Software, and to permit persons to whom the Software is
// furnished to do so, subject to the following conditions:
//
// The above copyright notice and this permission notice shall be included in
// all copies or substantial portions of the Software.
//
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
// THE SOFTWARE.
import UIKit
// swiftlint:disable unused_setter_value
// swiftlint:disable line_length
// swiftlint:disable type_name
@available(iOSApplicationExtension, unavailable)
@MainActor
@objc public extension IQKeyboardManager {
@available(*, unavailable, renamed: "keyboardDistance")
var keyboardDistanceFromTextField: CGFloat {
get { fatalError() }
set { }
}
}
@available(iOSApplicationExtension, unavailable)
@MainActor
@objc public extension IQKeyboardManager {
@available(*, unavailable, message: "This feature has been removed due to few compatibility problems")
func registerTextFieldViewClass(_ aClass: UIView.Type,
didBeginEditingNotificationName: String,
didEndEditingNotificationName: String) {
}
@available(*, unavailable, message: "This feature has been removed due to few compatibility problems")
func unregisterTextFieldViewClass(_ aClass: UIView.Type,
didBeginEditingNotificationName: String,
didEndEditingNotificationName: String) {
}
}
@available(iOSApplicationExtension, unavailable)
@MainActor
@objc public extension IQKeyboardManager {
typealias SizeBlock = (_ size: CGSize) -> Void
@available(*, unavailable, message: "Please use `IQKeyboardNotification` independently from https://github.com/hackiftekhar/IQKeyboardNotification")
func registerKeyboardSizeChange(identifier: AnyHashable, sizeHandler: @escaping SizeBlock) {}
@available(*, unavailable, message: "Please use `IQKeyboardNotification` independently from https://github.com/hackiftekhar/IQKeyboardNotification")
func unregisterKeyboardSizeChange(identifier: AnyHashable) {}
@available(*, unavailable, message: "Please use `IQKeyboardNotification` independently from https://github.com/hackiftekhar/IQKeyboardNotification")
var keyboardShowing: Bool { false }
@available(*, unavailable, message: "Please use `IQKeyboardNotification` independently from https://github.com/hackiftekhar/IQKeyboardNotification")
var keyboardFrame: CGRect { .zero }
}
@available(*, unavailable, renamed: "IQKeyboardReturnManager", message: "Please use `IQKeyboardReturnManager` independently from https://github.com/hackiftekhar/IQKeyboardReturnManager")
@MainActor
@objcMembers public final class IQKeyboardReturnKeyHandler: NSObject {}
@available(*, unavailable, renamed: "IQKeyboardNotification", message: "Please use `IQKeyboardNotification` independently from https://github.com/hackiftekhar/IQKeyboardNotification")
@MainActor
@objcMembers public final class IQKeyboardListener: NSObject {}
@available(*, unavailable, renamed: "IQTextInputViewNotification", message: "Please use `IQTextInputViewNotification` independently from https://github.com/hackiftekhar/IQTextInputViewNotification")
@MainActor
@objcMembers public final class IQTextFieldViewListener: NSObject {}
@available(*, unavailable, renamed: "IQDeepResponderContainerView", message: "Please use `IQDeepResponderContainerView` class which is now part of `IQKeyboardToolbarManager` from https://github.com/hackiftekhar/IQKeyboardToolbarManager.")
@MainActor
@objcMembers open class IQPreviousNextView: UIView {}
@available(*, unavailable, message: "Please use `IQKeyboardToolbar` independently https://github.com/hackiftekhar/IQKeyboardToolbar or through `IQKeyboardToolbarManager` from https://github.com/hackiftekhar/IQKeyboardToolbarManager")
@MainActor
@objcMembers public final class IQToolbarPlaceholderConfigurationDeprecated: NSObject {
public var showPlaceholder: Bool = true
public var font: UIFont?
public var color: UIColor?
public var buttonColor: UIColor?
public override var accessibilityLabel: String? { didSet { } }
}
@available(iOSApplicationExtension, unavailable)
@available(*, unavailable, message: "Please use `IQKeyboardToolbar` independently https://github.com/hackiftekhar/IQKeyboardToolbar or through `IQKeyboardToolbarManager` from https://github.com/hackiftekhar/IQKeyboardToolbarManager")
@MainActor
@objcMembers public final class IQBarButtonItemConfigurationDeprecated: NSObject {
public init(systemItem: UIBarButtonItem.SystemItem, action: Selector? = nil) {
self.systemItem = systemItem
self.image = nil
self.title = nil
self.action = action
super.init()
}
public init(image: UIImage, action: Selector? = nil) {
self.systemItem = nil
self.image = image
self.title = nil
self.action = action
super.init()
}
public init(title: String, action: Selector? = nil) {
self.systemItem = nil
self.image = nil
self.title = title
self.action = action
super.init()
}
public let systemItem: UIBarButtonItem.SystemItem?
public let image: UIImage?
public let title: String?
public var action: Selector?
public override var accessibilityLabel: String? { didSet { } }
}
@available(*, unavailable, message: "Please use `IQKeyboardToolbarManager` independently from https://github.com/hackiftekhar/IQKeyboardToolbarManager")
@objc public enum IQAutoToolbarManageBehaviorDeprecated: Int {
case bySubviews
case byTag
case byPosition
}
@available(*, unavailable, message: "Please use `IQKeyboardToolbarManager` independently from https://github.com/hackiftekhar/IQKeyboardToolbarManager")
@objc public enum IQPreviousNextDisplayModeDeprecated: Int {
case `default`
case alwaysHide
case alwaysShow
}
@available(*, unavailable, message: "Please use `IQKeyboardToolbarManager` independently from https://github.com/hackiftekhar/IQKeyboardToolbarManager")
@MainActor
@objcMembers public final class IQToolbarConfiguration: NSObject {
public var useTextInputViewTintColor: Bool = false
public var tintColor: UIColor?
public var barTintColor: UIColor?
public var previousNextDisplayMode: IQPreviousNextDisplayModeDeprecated = .default
public var manageBehavior: IQAutoToolbarManageBehaviorDeprecated = .bySubviews
public var previousBarButtonConfiguration: IQBarButtonItemConfigurationDeprecated?
public var nextBarButtonConfiguration: IQBarButtonItemConfigurationDeprecated?
public var doneBarButtonConfiguration: IQBarButtonItemConfigurationDeprecated?
public let placeholderConfiguration: IQToolbarPlaceholderConfigurationDeprecated = .init()
}
// swiftlint:enable line_length
// swiftlint:enable unused_setter_value
// swiftlint:enable type_name
================================================
FILE: IQKeyboardManagerSwift/IQKeyboardManager/IQKeyboardManager+ActiveConfiguration.swift
================================================
//
// IQKeyboardManager+ActiveConfiguration.swift
// https://github.com/hackiftekhar/IQKeyboardManager
// Copyright (c) 2013-24 Iftekhar Qurashi.
//
// Permission is hereby granted, free of charge, to any person obtaining a copy
// of this software and associated documentation files (the "Software"), to deal
// in the Software without restriction, including without limitation the rights
// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
// copies of the Software, and to permit persons to whom the Software is
// furnished to do so, subject to the following conditions:
//
// The above copyright notice and this permission notice shall be included in
// all copies or substantial portions of the Software.
//
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
// THE SOFTWARE.
import UIKit
import IQKeyboardCore
import Combine
// MARK: UIKeyboard Notifications
@available(iOSApplicationExtension, unavailable)
@MainActor
internal extension IQKeyboardManager {
func addActiveConfigurationObserver() {
activeConfiguration.subscribe(identifier: "IQKeyboardManager", changeHandler: { [weak self] event, _, _ in
guard let self = self else { return }
switch event {
case .show:
self.handleKeyboardTextInputViewVisible()
case .change:
self.handleKeyboardTextInputViewChanged()
case .hide:
self.handleKeyboardTextInputViewHide()
}
})
}
private func handleKeyboardTextInputViewVisible() {
setupTextInputView()
if privateIsEnabled() {
adjustPosition()
} else {
restorePosition()
}
}
private func handleKeyboardTextInputViewChanged() {
setupTextInputView()
if privateIsEnabled() {
adjustPosition()
} else {
restorePosition()
}
}
private func handleKeyboardTextInputViewHide() {
self.restorePosition()
self.banishTextInputViewSetup()
self.lastScrollViewConfiguration = nil
}
}
@available(iOSApplicationExtension, unavailable)
@MainActor
internal extension IQKeyboardManager {
func setupTextInputView() {
guard let textInputView = activeConfiguration.textInputView else {
return
}
if let startingConfiguration = startingTextViewConfiguration,
startingConfiguration.hasChanged {
if startingConfiguration.scrollView.contentInset != startingConfiguration.startingContentInset {
showLog("""
Restoring textView.contentInset to: \(startingConfiguration.startingContentInset)
""")
}
activeConfiguration.animate(alongsideTransition: {
startingConfiguration.restore(for: textInputView)
})
}
startingTextViewConfiguration = nil
}
func banishTextInputViewSetup() {
guard let textInputView = activeConfiguration.textInputView else {
return
}
if let startingConfiguration = startingTextViewConfiguration,
startingConfiguration.hasChanged {
if startingConfiguration.scrollView.contentInset != startingConfiguration.startingContentInset {
showLog("""
Restoring textView.contentInset to: \(startingConfiguration.startingContentInset)
""")
}
activeConfiguration.animate(alongsideTransition: {
startingConfiguration.restore(for: textInputView)
})
}
startingTextViewConfiguration = nil
}
}
================================================
FILE: IQKeyboardManagerSwift/IQKeyboardManager/IQKeyboardManager+Internal.swift
================================================
//
// IQKeyboardManager+Internal.swift
// https://github.com/hackiftekhar/IQKeyboardManager
// Copyright (c) 2013-24 Iftekhar Qurashi.
//
// Permission is hereby granted, free of charge, to any person obtaining a copy
// of this software and associated documentation files (the "Software"), to deal
// in the Software without restriction, including without limitation the rights
// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
// copies of the Software, and to permit persons to whom the Software is
// furnished to do so, subject to the following conditions:
//
// The above copyright notice and this permission notice shall be included in
// all copies or substantial portions of the Software.
//
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
// THE SOFTWARE.
import UIKit
import IQKeyboardCore
@available(iOSApplicationExtension, unavailable)
@MainActor
internal extension IQKeyboardManager {
func privateIsEnabled() -> Bool {
guard let textInputView: any IQTextInputView = activeConfiguration.textInputView else {
return isEnabled
}
switch textInputView.internalEnableMode {
case .default:
guard var controller = (textInputView as UIView).iq.viewContainingController() else {
return isEnabled
}
if textInputView is UISearchTextField {
if let navController: UINavigationController = controller as? UINavigationController,
let topController: UIViewController = navController.topViewController {
controller = topController
}
// Not adjusting for searchTextField inside searchController.
if controller.navigationItem.searchController?.searchBar.searchTextField == textInputView {
return false
}
}
// If viewController is in enabledDistanceHandlingClasses, then assuming it's enabled.
let isWithEnabledClass: Bool = enabledDistanceHandlingClasses.contains(where: { controller.isKind(of: $0) })
var isEnabled: Bool = isEnabled || isWithEnabledClass
if isEnabled {
// If viewController is in disabledDistanceHandlingClasses,
// then assuming it's disabled.
if disabledDistanceHandlingClasses.contains(where: { controller.isKind(of: $0) }) {
isEnabled = false
} else {
// Special Controllers
let classNameString: String = "\(type(of: controller.self))"
// _UIAlertControllerTextFieldViewController
if classNameString.contains("UIAlertController"),
classNameString.hasSuffix("TextFieldViewController") {
isEnabled = false
}
}
}
return isEnabled
case .enabled:
return true
case .disabled:
return false
@unknown default:
return false
}
}
}
@available(iOSApplicationExtension, unavailable)
@MainActor
fileprivate extension IQTextInputView {
var internalEnableMode: IQEnableMode {
return iq.enableMode
}
}
================================================
FILE: IQKeyboardManagerSwift/IQKeyboardManager/IQKeyboardManager+Position.swift
================================================
//
// IQKeyboardManager+Position.swift
// https://github.com/hackiftekhar/IQKeyboardManager
// Copyright (c) 2013-24 Iftekhar Qurashi.
//
// Permission is hereby granted, free of charge, to any person obtaining a copy
// of this software and associated documentation files (the "Software"), to deal
// in the Software without restriction, including without limitation the rights
// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
// copies of the Software, and to permit persons to whom the Software is
// furnished to do so, subject to the following conditions:
//
// The above copyright notice and this permission notice shall be included in
// all copies or substantial portions of the Software.
//
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
// THE SOFTWARE.
import UIKit
import IQKeyboardCore
// swiftlint:disable file_length
@available(iOSApplicationExtension, unavailable)
@MainActor
@objc public extension IQKeyboardManager {
private typealias IQLayoutGuide = (top: CGFloat, bottom: CGFloat)
@MainActor
private struct AssociatedKeys {
static var movedDistance: Int = 0
static var movedDistanceChanged: Int = 0
static var lastScrollViewConfiguration: Int = 0
static var startingTextViewConfiguration: Int = 0
static var activeConfiguration: Int = 0
}
/**
moved distance to the top used to maintain distance between keyboard and textInputView.
Most of the time this will be a positive value.
*/
private(set) var movedDistance: CGFloat {
get {
return objc_getAssociatedObject(self, &AssociatedKeys.movedDistance) as? CGFloat ?? 0.0
}
set(newValue) {
objc_setAssociatedObject(self, &AssociatedKeys.movedDistance, newValue, .OBJC_ASSOCIATION_RETAIN_NONATOMIC)
movedDistanceChanged?(movedDistance)
}
}
/**
Will be called then movedDistance will be changed
*/
var movedDistanceChanged: ((CGFloat) -> Void)? {
get {
return objc_getAssociatedObject(self, &AssociatedKeys.movedDistanceChanged) as? ((CGFloat) -> Void)
}
set(newValue) {
objc_setAssociatedObject(self, &AssociatedKeys.movedDistanceChanged,
newValue, .OBJC_ASSOCIATION_RETAIN_NONATOMIC)
movedDistanceChanged?(movedDistance)
}
}
/** Variable to save lastScrollView that was scrolled. */
@nonobjc
internal var lastScrollViewConfiguration: IQScrollViewConfiguration? {
get {
return objc_getAssociatedObject(self,
&AssociatedKeys.lastScrollViewConfiguration) as? IQScrollViewConfiguration
}
set(newValue) {
objc_setAssociatedObject(self, &AssociatedKeys.lastScrollViewConfiguration,
newValue, .OBJC_ASSOCIATION_RETAIN_NONATOMIC)
}
}
/** used to adjust contentInset of UITextView. */
@nonobjc
internal var startingTextViewConfiguration: IQScrollViewConfiguration? {
get {
return objc_getAssociatedObject(self,
&AssociatedKeys.startingTextViewConfiguration) as? IQScrollViewConfiguration
}
set(newValue) {
objc_setAssociatedObject(self, &AssociatedKeys.startingTextViewConfiguration,
newValue, .OBJC_ASSOCIATION_RETAIN_NONATOMIC)
}
}
internal func applicationDidBecomeActive(_ notification: Notification) {
guard privateIsEnabled(),
activeConfiguration.keyboardInfo.isVisible,
activeConfiguration.isReady else {
return
}
adjustPosition()
}
/* Adjusting RootViewController's frame according to interface orientation. */
// swiftlint:disable function_body_length
internal func adjustPosition() {
guard UIApplication.shared.applicationState == .active,
let textInputView: any IQTextInputView = activeConfiguration.textInputView,
let superview: UIView = textInputView.superview,
let rootConfiguration = activeConfiguration.rootConfiguration,
let rootController: UIViewController = rootConfiguration.rootController,
let window: UIWindow = rootController.view.window else {
return
}
showLog(">>>>> \(#function) started >>>>>", indentation: 1)
defer {
showLog("<<<<< \(#function) ended <<<<<", indentation: -1)
}
let textInputViewRectInWindow: CGRect = superview.convert(textInputView.frame, to: window)
let textInputViewRectInRootSuperview: CGRect = superview.convert(textInputView.frame,
to: rootController.view.superview)
// Getting RootViewOrigin.
let rootViewOrigin: CGPoint = rootController.view.frame.origin
let keyboardDistance: CGFloat = getSpecialTextInputViewDistance(textInputView: textInputView)
let kbSize: CGSize = Self.getKeyboardSize(keyboardDistance: keyboardDistance,
keyboardFrame: activeConfiguration.keyboardInfo.endFrame,
safeAreaInsets: rootConfiguration.beginSafeAreaInsets,
windowFrame: window.frame)
let originalKbSize: CGSize = activeConfiguration.keyboardInfo.endFrame.size
let isScrollableTextInputView: Bool
if let textInputView: UIScrollView = textInputView as? UITextView {
isScrollableTextInputView = textInputView.isScrollEnabled
} else {
isScrollableTextInputView = false
}
let layoutGuide: IQLayoutGuide = Self.getLayoutGuides(rootController: rootController, window: window,
isScrollableTextInputView: isScrollableTextInputView)
var superScrollView: UIScrollView?
var superView: UIScrollView? = (textInputView as UIView).iq.superviewOf(type: UIScrollView.self)
// Getting UIScrollView whose scrolling is enabled. // (Bug ID: #285)
while let view: UIScrollView = superView {
if view.isScrollEnabled, !view.iq.ignoreScrollingAdjustment {
superScrollView = view
break
} else {
// Getting it's superScrollView. // (Enhancement ID: #21, #24)
superView = view.iq.superviewOf(type: UIScrollView.self)
}
}
// Move positive = textInputView is hidden.
// Move negative = textInputView is showing.
// Calculating move position.
var moveUp: CGFloat = Self.getMoveUpDistance(keyboardSize: kbSize,
layoutGuide: layoutGuide,
textInputViewRectInRootSuperview: textInputViewRectInRootSuperview,
textInputViewRectInWindow: textInputViewRectInWindow,
windowFrame: window.frame)
showLog("Need to move: \(moveUp), will be moving \(moveUp < 0 ? "down" : "up")")
setupActiveScrollViewConfiguration(superScrollView: superScrollView, textInputView: textInputView)
// Special case for ScrollView.
// If we found lastScrollView then setting it's contentOffset to show textInputView.
if let lastScrollViewConfiguration: IQScrollViewConfiguration = lastScrollViewConfiguration {
adjustScrollViewContentOffsets(moveUp: &moveUp, textInputView: textInputView,
lastScrollViewConfiguration: lastScrollViewConfiguration,
rootSuperview: rootController.view.superview, layoutGuide: layoutGuide,
textInputViewRectInRootSuperview: textInputViewRectInRootSuperview,
isScrollableTextInputView: isScrollableTextInputView, window: window,
kbSize: kbSize, keyboardDistance: keyboardDistance,
rootBeginSafeAreaInsets: rootConfiguration.beginSafeAreaInsets)
}
// Special case for UITextView
// (Readjusting textInputView.contentInset when textInputView hight is too big to fit on screen)
// _lastScrollView If not having inside any scrollView, now contentInset manages the full screen textInputView.
// If is a UITextView type
if isScrollableTextInputView, let textInputView = textInputView as? UITextView {
adjustTextInputViewContentInset(window: window, originalKbSize: originalKbSize,
rootSuperview: rootController.view.superview,
layoutGuide: layoutGuide,
textInputView: textInputView)
}
adjustRootController(moveUp: moveUp, rootViewOrigin: rootViewOrigin, originalKbSize: originalKbSize,
rootController: rootController, rootBeginOrigin: rootConfiguration.beginOrigin)
}
// swiftlint:enable function_body_length
internal func restorePosition() {
// Setting rootViewController frame to it's original position. // (Bug ID: #18)
guard let configuration: IQRootControllerConfiguration = activeConfiguration.rootConfiguration else {
return
}
showLog(">>>>> \(#function) started >>>>>", indentation: 1)
defer {
showLog("<<<<< \(#function) ended <<<<<", indentation: -1)
}
activeConfiguration.animate(alongsideTransition: {
if configuration.hasChanged {
let classNameString: String = "\(type(of: configuration.rootController.self))"
self.showLog("Restoring \(classNameString) origin to: \(configuration.beginOrigin)")
}
configuration.restore()
// Animating content if needed (Bug ID: #204)
if self.layoutIfNeededOnUpdate {
// Animating content (Bug ID: #160)
configuration.rootController?.view.setNeedsLayout()
configuration.rootController?.view.layoutIfNeeded()
}
})
// Restoring the contentOffset of the lastScrollView
if let lastConfiguration: IQScrollViewConfiguration = lastScrollViewConfiguration {
let textInputView: (any IQTextInputView)? = activeConfiguration.textInputView
restoreScrollViewConfigurationIfChanged(configuration: lastConfiguration, textInputView: textInputView)
activeConfiguration.animate(alongsideTransition: {
// This is temporary solution. Have to implement the save and restore scrollView state
self.restoreScrollViewContentOffset(superScrollView: lastConfiguration.scrollView,
textInputView: textInputView)
})
}
self.movedDistance = 0
}
}
// swiftlint:disable function_parameter_count
@available(iOSApplicationExtension, unavailable)
@MainActor
private extension IQKeyboardManager {
func getSpecialTextInputViewDistance(textInputView: some IQTextInputView) -> CGFloat {
// Maintain keyboardDistance
let specialKeyboardDistance: CGFloat
if let searchBar: UISearchBar = textInputView.iq.textFieldSearchBar() {
specialKeyboardDistance = searchBar.iq.distanceFromKeyboard
} else {
specialKeyboardDistance = textInputView.iq.distanceFromKeyboard
}
if specialKeyboardDistance == UIView.defaultKeyboardDistance {
return keyboardDistance
} else {
return specialKeyboardDistance
}
}
static func getKeyboardSize(keyboardDistance: CGFloat, keyboardFrame: CGRect,
safeAreaInsets: UIEdgeInsets, windowFrame: CGRect) -> CGSize {
let kbSize: CGSize
var kbFrame: CGRect = keyboardFrame
kbFrame.origin.y -= keyboardDistance
kbFrame.size.height += keyboardDistance
kbFrame.origin.y -= safeAreaInsets.bottom
kbFrame.size.height += safeAreaInsets.bottom
// (Bug ID: #469) (Bug ID: #381) (Bug ID: #1506)
// Calculating actual keyboard covered size respect to window,
// keyboard frame may be different when hardware keyboard is attached
let intersectRect: CGRect = kbFrame.intersection(windowFrame)
if intersectRect.isNull {
kbSize = CGSize(width: kbFrame.size.width, height: 0)
} else {
kbSize = intersectRect.size
}
return kbSize
}
static private func getLayoutGuides(rootController: UIViewController, window: UIWindow,
isScrollableTextInputView: Bool) -> IQLayoutGuide {
let navigationBarAreaHeight: CGFloat
if let navigationController: UINavigationController = rootController.navigationController {
navigationBarAreaHeight = navigationController.navigationBar.frame.maxY
} else {
let statusBarHeight: CGFloat = window.windowScene?.statusBarManager?.statusBarFrame.height ?? 0
navigationBarAreaHeight = statusBarHeight
}
let directionalLayoutMargin: NSDirectionalEdgeInsets = rootController.view.directionalLayoutMargins
let topLayoutGuide: CGFloat = CGFloat.maximum(navigationBarAreaHeight, directionalLayoutMargin.top)
// Validation of textInputView for case where there is a tab bar
// at the bottom or running on iPhone X and textInputView is at the bottom.
let bottomLayoutGuide: CGFloat = isScrollableTextInputView ? 0 : directionalLayoutMargin.bottom
return (topLayoutGuide, bottomLayoutGuide)
}
static private func getMoveUpDistance(keyboardSize: CGSize,
layoutGuide: IQLayoutGuide,
textInputViewRectInRootSuperview: CGRect,
textInputViewRectInWindow: CGRect,
windowFrame: CGRect) -> CGFloat {
// Move positive = textInputView is hidden.
// Move negative = textInputView is showing.
// Calculating move position.
let visibleHeight: CGFloat = windowFrame.height-keyboardSize.height
let topMovement: CGFloat = textInputViewRectInRootSuperview.minY-layoutGuide.top
let bottomMovement: CGFloat = textInputViewRectInWindow.maxY - visibleHeight + layoutGuide.bottom
var moveUp: CGFloat = CGFloat.minimum(topMovement, bottomMovement)
moveUp = CGFloat(Int(moveUp))
return moveUp
}
func setupActiveScrollViewConfiguration(superScrollView: UIScrollView?, textInputView: some IQTextInputView) {
// If there was a lastScrollView. // (Bug ID: #34)
guard let lastConfiguration: IQScrollViewConfiguration = lastScrollViewConfiguration else {
if let superScrollView: UIScrollView = superScrollView {
// If there was no lastScrollView and we found a current scrollView. then setting it as lastScrollView.
let configuration = IQScrollViewConfiguration(scrollView: superScrollView,
canRestoreContentOffset: true)
self.lastScrollViewConfiguration = configuration
showLog("""
Saving ScrollView New contentInset: \(configuration.startingContentInset)
and contentOffset: \(configuration.startingContentOffset)
""")
}
return
}
// If we can't find current superScrollView, then setting lastScrollView to it's original form.
if superScrollView == nil {
restoreScrollViewConfigurationIfChanged(configuration: lastConfiguration,
textInputView: textInputView)
self.lastScrollViewConfiguration = nil
} else if superScrollView != lastConfiguration.scrollView {
// If both scrollView's are different,
// then reset lastScrollView to it's original frame and setting current scrollView as last scrollView.
restoreScrollViewConfigurationIfChanged(configuration: lastConfiguration,
textInputView: textInputView)
if let superScrollView = superScrollView {
let configuration = IQScrollViewConfiguration(scrollView: superScrollView,
canRestoreContentOffset: true)
self.lastScrollViewConfiguration = configuration
showLog("""
Saving ScrollView New contentInset: \(configuration.startingContentInset)
and contentOffset: \(configuration.startingContentOffset)
""")
} else {
self.lastScrollViewConfiguration = nil
}
}
// Else the case where superScrollView == lastScrollView means we are on same scrollView
// after switching to different textInputView. So doing nothing, going ahead
}
func restoreScrollViewConfigurationIfChanged(configuration: IQScrollViewConfiguration,
textInputView: (some IQTextInputView)?) {
guard configuration.hasChanged else { return }
if configuration.scrollView.contentInset != configuration.startingContentInset {
showLog("Restoring contentInset to: \(configuration.startingContentInset)")
}
if configuration.scrollView.iq.restoreContentOffset,
!configuration.scrollView.contentOffset.equalTo(configuration.startingContentOffset) {
showLog("Restoring contentOffset to: \(configuration.startingContentOffset)")
}
activeConfiguration.animate(alongsideTransition: {
configuration.restore(for: textInputView)
})
}
// swiftlint:disable function_body_length
private func adjustScrollViewContentOffsets(moveUp: inout CGFloat, textInputView: some IQTextInputView,
lastScrollViewConfiguration: IQScrollViewConfiguration,
rootSuperview: UIView?,
layoutGuide: IQLayoutGuide,
textInputViewRectInRootSuperview: CGRect,
isScrollableTextInputView: Bool, window: UIWindow,
kbSize: CGSize, keyboardDistance: CGFloat,
rootBeginSafeAreaInsets: UIEdgeInsets) {
// Saving
var lastView: UIView = textInputView
var superScrollView: UIScrollView? = lastScrollViewConfiguration.scrollView
while let scrollView: UIScrollView = superScrollView {
var isContinue: Bool = false
if moveUp > 0 {
isContinue = moveUp > (-scrollView.contentOffset.y - scrollView.contentInset.top)
} else if let tableView: UITableView = scrollView.iq.superviewOf(type: UITableView.self) {
// Special treatment for UITableView due to their cell reusing logic
isContinue = scrollView.contentOffset.y > 0
Self.handleTableViewCase(moveUp: &moveUp, isContinue: isContinue, textInputView: textInputView,
tableView: tableView, rootSuperview: rootSuperview, layoutGuide: layoutGuide)
} else if let collectionView = scrollView.iq.superviewOf(type: UICollectionView.self) {
// Special treatment for UICollectionView due to their cell reusing logic
isContinue = scrollView.contentOffset.y > 0
Self.handleCollectionViewCase(moveUp: &moveUp, isContinue: isContinue,
textInputView: textInputView, collectionView: collectionView,
rootSuperview: rootSuperview, layoutGuide: layoutGuide)
} else {
isContinue = textInputViewRectInRootSuperview.minY < layoutGuide.top
if isContinue {
moveUp = CGFloat.minimum(0, textInputViewRectInRootSuperview.minY - layoutGuide.top)
}
}
// Looping in upper hierarchy until we don't found any scrollView
// in it's upper hierarchy till UIWindow object.
if isContinue {
var tempScrollView: UIScrollView? = scrollView.iq.superviewOf(type: UIScrollView.self)
var nextScrollView: UIScrollView?
while let view: UIScrollView = tempScrollView {
if view.isScrollEnabled, !view.iq.ignoreScrollingAdjustment {
nextScrollView = view
break
} else {
tempScrollView = view.iq.superviewOf(type: UIScrollView.self)
}
}
// Getting lastViewRect.
if let lastViewRect: CGRect = lastView.superview?.convert(lastView.frame, to: scrollView) {
// Calculating the expected Y offset from move and scrollView's contentOffset.
let minimumMovement: CGFloat = CGFloat.minimum(scrollView.contentOffset.y, -moveUp)
var suggestedOffsetY: CGFloat = scrollView.contentOffset.y - minimumMovement
// Rearranging the expected Y offset according to the view.
suggestedOffsetY = CGFloat.minimum(suggestedOffsetY, lastViewRect.minY)
updateSuggestedOffsetYAndMoveUp(suggestedOffsetY: &suggestedOffsetY, moveUp: &moveUp,
isScrollableTextInputView: isScrollableTextInputView,
nextScrollView: nextScrollView, textInputView: textInputView,
window: window, layoutGuide: layoutGuide,
scrollViewContentOffset: scrollView.contentOffset)
let newContentOffset: CGPoint = CGPoint(x: scrollView.contentOffset.x, y: suggestedOffsetY)
if !scrollView.contentOffset.equalTo(newContentOffset) {
updateScrollViewContentOffset(scrollView: scrollView, newContentOffset: newContentOffset,
moveUp: moveUp, textInputView: textInputView)
}
}
// Getting next lastView & superScrollView.
lastView = scrollView
superScrollView = nextScrollView
} else {
moveUp = 0
break
}
}
adjustScrollViewContentInset(lastScrollViewConfiguration: lastScrollViewConfiguration, window: window,
kbSize: kbSize, keyboardDistance: keyboardDistance,
rootBeginSafeAreaInsets: rootBeginSafeAreaInsets)
}
// swiftlint:enable function_body_length
private static func handleTableViewCase(moveUp: inout CGFloat, isContinue: Bool,
textInputView: some IQTextInputView, tableView: UITableView,
rootSuperview: UIView?, layoutGuide: IQLayoutGuide) {
guard isContinue,
let tableCell: UITableViewCell = textInputView.iq.superviewOf(type: UITableViewCell.self),
let indexPath: IndexPath = tableView.indexPath(for: tableCell),
let previousIndexPath: IndexPath = tableView.previousIndexPath(of: indexPath) else { return }
let previousCellRect: CGRect = tableView.rectForRow(at: previousIndexPath)
guard !previousCellRect.isEmpty else { return }
let previousCellRectInRootSuperview: CGRect = tableView.convert(previousCellRect,
to: rootSuperview)
moveUp = CGFloat.minimum(0, previousCellRectInRootSuperview.maxY - layoutGuide.top)
}
private static func handleCollectionViewCase(moveUp: inout CGFloat, isContinue: Bool,
textInputView: some IQTextInputView, collectionView: UICollectionView,
rootSuperview: UIView?,
layoutGuide: IQLayoutGuide) {
guard isContinue,
let collectionCell = textInputView.iq.superviewOf(type: UICollectionViewCell.self),
let indexPath: IndexPath = collectionView.indexPath(for: collectionCell),
let previousIndexPath: IndexPath = collectionView.previousIndexPath(of: indexPath),
let attributes = collectionView.layoutAttributesForItem(at: previousIndexPath) else { return }
let previousCellRect: CGRect = attributes.frame
guard !previousCellRect.isEmpty else { return }
let previousCellRectInRootSuperview: CGRect = collectionView.convert(previousCellRect,
to: rootSuperview)
moveUp = CGFloat.minimum(0, previousCellRectInRootSuperview.maxY - layoutGuide.top)
}
private func updateSuggestedOffsetYAndMoveUp(suggestedOffsetY: inout CGFloat, moveUp: inout CGFloat,
isScrollableTextInputView: Bool, nextScrollView: UIScrollView?,
textInputView: some IQTextInputView, window: UIWindow,
layoutGuide: IQLayoutGuide,
scrollViewContentOffset: CGPoint) {
// If is a UITextView type
// nextScrollView == nil
// If processing scrollView is last scrollView in upper hierarchy
// (there is no other scrollView in upper hierarchy.)
//
// suggestedOffsetY >= 0
// suggestedOffsetY must be >= 0 in order to keep distance from navigationBar (Bug ID: #92)
guard isScrollableTextInputView,
nextScrollView == nil,
suggestedOffsetY >= 0,
let superview: UIView = textInputView.superview else {
// Subtracting the Y offset from the move variable,
// because we are going to change scrollView's contentOffset.y to suggestedOffsetY.
moveUp -= (suggestedOffsetY-scrollViewContentOffset.y)
return
}
let currentTextInputViewRect: CGRect = superview.convert(textInputView.frame,
to: window)
// Calculating expected fix distance which needs to be managed from navigation bar
let expectedFixDistance: CGFloat = currentTextInputViewRect.minY - layoutGuide.top
// Now if expectedOffsetY (scrollView.contentOffset.y + expectedFixDistance)
// is lower than current suggestedOffsetY, which means we're in a position where
// navigationBar up and hide, then reducing suggestedOffsetY with expectedOffsetY
// (scrollView.contentOffset.y + expectedFixDistance)
let expectedOffsetY: CGFloat = scrollViewContentOffset.y + expectedFixDistance
suggestedOffsetY = CGFloat.minimum(suggestedOffsetY, expectedOffsetY)
// Setting move to 0 because now we don't want to move any view anymore
// (All will be managed by our contentInset logic.
moveUp = 0
}
func updateScrollViewContentOffset(scrollView: UIScrollView, newContentOffset: CGPoint,
moveUp: CGFloat, textInputView: some IQTextInputView) {
showLog("""
old contentOffset: \(scrollView.contentOffset)
new contentOffset: \(newContentOffset)
""")
showLog("Remaining Move: \(moveUp)")
// Getting problem while using `setContentOffset:animated:`, So I used animation API.
activeConfiguration.animate(alongsideTransition: {
// (Bug ID: #1365, #1508, #1541)
let stackView: UIStackView? = textInputView.iq.superviewOf(type: UIStackView.self,
belowView: scrollView)
// (Bug ID: #1901, #1996)
let animatedContentOffset: Bool = stackView != nil ||
scrollView is UICollectionView ||
scrollView is UITableView
if animatedContentOffset {
scrollView.setContentOffset(newContentOffset, animated: UIView.areAnimationsEnabled)
} else {
scrollView.contentOffset = newContentOffset
}
}, completion: {
if scrollView is UITableView || scrollView is UICollectionView {
// Skip reloading input views during interactive navigation gesture to prevent toolbar flash (Issue #2102)
if self.activeConfiguration.rootConfiguration?.isInteractiveGestureActive == false {
// This will update the next/previous states
textInputView.reloadInputViews()
}
}
})
}
func adjustScrollViewContentInset(lastScrollViewConfiguration: IQScrollViewConfiguration,
window: UIWindow, kbSize: CGSize, keyboardDistance: CGFloat,
rootBeginSafeAreaInsets: UIEdgeInsets) {
let lastScrollView = lastScrollViewConfiguration.scrollView
guard let lastScrollViewRect: CGRect = lastScrollView.superview?.convert(lastScrollView.frame, to: window),
!lastScrollView.iq.ignoreContentInsetAdjustment else { return }
// Updating contentInset
var bottomInset: CGFloat = (kbSize.height)-(window.frame.height-lastScrollViewRect.maxY)
let keyboardAndSafeArea: CGFloat = keyboardDistance + rootBeginSafeAreaInsets.bottom
var bottomScrollIndicatorInset: CGFloat = bottomInset - keyboardAndSafeArea
// Update the insets so that the scrollView doesn't shift incorrectly
// when the offset is near the bottom of the scroll view.
bottomInset = CGFloat.maximum(lastScrollViewConfiguration.startingContentInset.bottom, bottomInset)
let startingScrollInset: UIEdgeInsets = lastScrollViewConfiguration.startingScrollIndicatorInsets
bottomScrollIndicatorInset = CGFloat.maximum(startingScrollInset.bottom,
bottomScrollIndicatorInset)
bottomInset -= lastScrollView.safeAreaInsets.bottom
bottomScrollIndicatorInset -= lastScrollView.safeAreaInsets.bottom
var movedInsets: UIEdgeInsets = lastScrollView.contentInset
movedInsets.bottom = bottomInset
guard lastScrollView.contentInset != movedInsets else { return }
showLog("""
old ContentInset: \(lastScrollView.contentInset) new ContentInset: \(movedInsets)
""")
activeConfiguration.animate(alongsideTransition: {
lastScrollView.contentInset = movedInsets
lastScrollView.layoutIfNeeded() // (Bug ID: #1996)
var newScrollIndicatorInset: UIEdgeInsets = lastScrollView.verticalScrollIndicatorInsets
newScrollIndicatorInset.bottom = bottomScrollIndicatorInset
lastScrollView.scrollIndicatorInsets = newScrollIndicatorInset
})
}
private func adjustTextInputViewContentInset(window: UIWindow, originalKbSize: CGSize,
rootSuperview: UIView?,
layoutGuide: IQLayoutGuide,
textInputView: UIScrollView) {
let keyboardYPosition: CGFloat = window.frame.height - originalKbSize.height
var rootSuperViewFrameInWindow: CGRect = window.frame
if let rootSuperview: UIView = rootSuperview {
rootSuperViewFrameInWindow = rootSuperview.convert(rootSuperview.bounds, to: window)
}
let keyboardOverlapping: CGFloat = rootSuperViewFrameInWindow.maxY - keyboardYPosition
let availableHeight: CGFloat = rootSuperViewFrameInWindow.height-layoutGuide.top-keyboardOverlapping
let textInputViewHeight: CGFloat = CGFloat.minimum(textInputView.frame.height, availableHeight)
guard textInputView.frame.size.height-textInputView.contentInset.bottom>textInputViewHeight else { return }
// If frame is not change by library in past, then saving user textInputView properties (Bug ID: #92)
if startingTextViewConfiguration == nil {
startingTextViewConfiguration = IQScrollViewConfiguration(scrollView: textInputView,
canRestoreContentOffset: false)
}
var newContentInset: UIEdgeInsets = textInputView.contentInset
newContentInset.bottom = textInputView.frame.size.height-textInputViewHeight
newContentInset.bottom -= textInputView.safeAreaInsets.bottom
guard textInputView.contentInset != newContentInset else { return }
showLog("""
\(textInputView) Old textInputView.contentInset: \(textInputView.contentInset)
New textInputView.contentInset: \(newContentInset)
""")
activeConfiguration.animate(alongsideTransition: {
textInputView.contentInset = newContentInset
textInputView.layoutIfNeeded() // (Bug ID: #1996)
textInputView.scrollIndicatorInsets = newContentInset
})
}
func adjustRootController(moveUp: CGFloat, rootViewOrigin: CGPoint, originalKbSize: CGSize,
rootController: UIViewController, rootBeginOrigin: CGPoint) {
// +Positive or zero.
var rootViewOrigin: CGPoint = rootViewOrigin
if moveUp >= 0 {
rootViewOrigin.y = CGFloat.maximum(rootViewOrigin.y - moveUp, CGFloat.minimum(0, -originalKbSize.height))
if !rootController.view.frame.origin.equalTo(rootViewOrigin) {
showLog("Moving Upward")
activeConfiguration.animate(alongsideTransition: {
var rect: CGRect = rootController.view.frame
rect.origin = rootViewOrigin
rootController.view.frame = rect
// Animating content if needed (Bug ID: #204)
if self.layoutIfNeededOnUpdate {
// Animating content (Bug ID: #160)
rootController.view.setNeedsLayout()
rootController.view.layoutIfNeeded()
}
let classNameString: String = "\(type(of: rootController.self))"
self.showLog("Set \(classNameString) origin to: \(rootViewOrigin)")
})
}
movedDistance = rootBeginOrigin.y-rootViewOrigin.y
} else { // -Negative
let disturbDistance: CGFloat = rootViewOrigin.y-rootBeginOrigin.y
// disturbDistance Negative = frame disturbed.
// disturbDistance positive = frame not disturbed.
if disturbDistance <= 0 {
rootViewOrigin.y -= CGFloat.maximum(moveUp, disturbDistance)
if !rootController.view.frame.origin.equalTo(rootViewOrigin) {
showLog("Moving Downward")
// Setting adjusted rootViewRect
activeConfiguration.animate(alongsideTransition: {
var rect: CGRect = rootController.view.frame
rect.origin = rootViewOrigin
rootController.view.frame = rect
// Animating content if needed (Bug ID: #204)
if self.layoutIfNeededOnUpdate {
// Animating content (Bug ID: #160)
rootController.view.setNeedsLayout()
rootController.view.layoutIfNeeded()
}
let classNameString: String = "\(type(of: rootController.self))"
self.showLog("Set \(classNameString) origin to: \(rootViewOrigin)")
})
}
movedDistance = rootBeginOrigin.y-rootViewOrigin.y
}
}
}
func restoreScrollViewContentOffset(superScrollView: UIScrollView, textInputView: (some IQTextInputView)?) {
var superScrollView: UIScrollView? = superScrollView
while let scrollView: UIScrollView = superScrollView {
let width: CGFloat = CGFloat.maximum(scrollView.contentSize.width, scrollView.frame.width)
let height: CGFloat = CGFloat.maximum(scrollView.contentSize.height, scrollView.frame.height)
let contentSize: CGSize = CGSize(width: width, height: height)
let minimumY: CGFloat = contentSize.height - scrollView.frame.height
if minimumY < scrollView.contentOffset.y {
let newContentOffset: CGPoint = CGPoint(x: scrollView.contentOffset.x, y: minimumY)
if !scrollView.contentOffset.equalTo(newContentOffset) {
// (Bug ID: #1365, #1508, #1541)
let stackView: UIStackView?
if let textInputView: UIView = textInputView {
stackView = textInputView.iq.superviewOf(type: UIStackView.self,
belowView: scrollView)
} else {
stackView = nil
}
// (Bug ID: #1901, #1996)
let animatedContentOffset: Bool = stackView != nil ||
scrollView is UICollectionView ||
scrollView is UITableView
if animatedContentOffset {
scrollView.setContentOffset(newContentOffset, animated: UIView.areAnimationsEnabled)
} else {
scrollView.contentOffset = newContentOffset
}
showLog("Restoring contentOffset to: \(newContentOffset)")
}
}
superScrollView = scrollView.iq.superviewOf(type: UIScrollView.self)
}
}
}
// swiftlint:enable function_parameter_count
================================================
FILE: IQKeyboardManagerSwift/IQKeyboardManager/IQKeyboardManager.swift
================================================
//
// IQKeyboardManager.swift
// https://github.com/hackiftekhar/IQKeyboardManager
// Copyright (c) 2013-24 Iftekhar Qurashi.
//
// Permission is hereby granted, free of charge, to any person obtaining a copy
// of this software and associated documentation files (the "Software"), to deal
// in the Software without restriction, including without limitation the rights
// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
// copies of the Software, and to permit persons to whom the Software is
// furnished to do so, subject to the following conditions:
//
// The above copyright notice and this permission notice shall be included in
// all copies or substantial portions of the Software.
//
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
// THE SOFTWARE.
import UIKit
/**
IQKeyboardManager is a code-less drop-in universal library that automatically prevents issues
of the keyboard sliding up and covering UITextField/UITextView.
## Usage
Simply enable the manager in your AppDelegate:
```swift
IQKeyboardManager.shared.isEnabled = true
```
## Thread Safety
All public APIs must be called from the main thread. The class is marked with @MainActor
to enforce this at compile time.
## Example
```swift
import IQKeyboardManagerSwift
@main
class AppDelegate: UIResponder, UIApplicationDelegate {
func application(_ application: UIApplication,
didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
IQKeyboardManager.shared.isEnabled = true
return true
}
}
```
*/
@available(iOSApplicationExtension, unavailable)
@MainActor
@objcMembers public final class IQKeyboardManager: NSObject {
/**
Returns the default singleton instance.
*/
@MainActor
public static let shared: IQKeyboardManager = .init()
internal var activeConfiguration: IQActiveConfiguration = .init()
// MARK: UIKeyboard handling
/**
Enable/disable managing distance between keyboard and textInputView.
Default is YES(Enabled when class loads in `+(void)load` method).
*/
public var isEnabled: Bool = false {
didSet {
guard isEnabled != oldValue else { return }
// If not enable, enable it.
if isEnabled {
// If keyboard is currently showing.
if activeConfiguration.keyboardInfo.isVisible {
adjustPosition()
} else {
restorePosition()
}
showLog("Enabled")
} else { // If not disable, disable it.
restorePosition()
showLog("Disabled")
}
}
}
/**
Sets the default distance between the keyboard and the active text input view.
This distance is applied to all text inputs unless overridden by setting
`view.iq.distanceFromKeyboard` for specific views.
- Precondition: Value must be non-negative. Negative values will be logged as warnings.
- Default: `10.0` points
- Note: This is a global setting. Use `view.iq.distanceFromKeyboard` for per-view customization.
## Example
```swift
// Set global distance
IQKeyboardManager.shared.keyboardDistance = 20.0
// Override for specific text field
myTextField.iq.distanceFromKeyboard = 30.0
```
- SeeAlso: `UIView.iq.distanceFromKeyboard` for per-view customization
*/
public var keyboardDistance: CGFloat = 10.0 {
didSet {
if keyboardDistance < 0 {
showLog("⚠️ keyboardDistance shouldn't be negative.")
}
}
}
/*******************************************/
// MARK: UIAnimation handling
/**
If YES, then calls 'setNeedsLayout' and 'layoutIfNeeded' on any frame update of to viewController's view.
*/
public var layoutIfNeededOnUpdate: Bool = false
// MARK: Class Level disabling methods
/**
Classes that should have keyboard distance handling disabled.
When a view controller is of one of these types, keyboard distance handling
is disabled regardless of the `isEnabled` property.
- Precondition: All classes must be subclasses of `UIViewController`
- Default: `[UITableViewController.self, UIInputViewController.self, UIAlertController.self]`
- Note: This takes precedence over `enabledDistanceHandlingClasses`. If a class appears
in both arrays, it will be disabled.
## Example
```swift
// Disable for custom view controller
IQKeyboardManager.shared.disabledDistanceHandlingClasses.append(MyCustomViewController.self)
// Disable for multiple controllers
IQKeyboardManager.shared.disabledDistanceHandlingClasses += [
LoginViewController.self,
SignupViewController.self
]
```
- SeeAlso: `enabledDistanceHandlingClasses` for force-enabling specific classes
*/
public var disabledDistanceHandlingClasses: [UIViewController.Type] = [
UITableViewController.self,
UIInputViewController.self,
UIAlertController.self
]
/**
Enable distance handling within the scope of enabled distance handling viewControllers classes.
Within this scope, 'enabled' property is ignored. Class should be kind of UIViewController.
If same Class is added in disabledDistanceHandlingClasses list,
then enabledDistanceHandlingClasses will be ignored.
*/
public var enabledDistanceHandlingClasses: [UIViewController.Type] = []
/**************************************************************************************/
// MARK: Initialization/De-initialization
/* Singleton Object Initialization. */
private override init() {
super.init()
self.addActiveConfigurationObserver()
NotificationCenter.default.addObserver(self, selector: #selector(applicationDidBecomeActive(_:)),
name: UIApplication.didBecomeActiveNotification, object: nil)
}
deinit {
// Disable the keyboard manager.
isEnabled = false
NotificationCenter.default.removeObserver(self)
}
// MARK: Public Methods
/**
Manually triggers a position adjustment for the active text input view.
Call this method when you've made external changes to the view hierarchy that
might affect keyboard positioning (e.g., programmatically changing view frames,
adding/removing views, changing constraints).
This method is safe to call even when no text input is active or the keyboard
is hidden - it will simply return early.
## When to Call
- After programmatically modifying view frames
- After adding or removing views from the hierarchy
- After changing Auto Layout constraints that affect the active text field's position
- When orientation changes occur outside the normal notification flow
## Example
```swift
// After programmatic layout changes
myView.frame = newFrame
IQKeyboardManager.shared.reloadLayoutIfNeeded()
// After constraint updates
NSLayoutConstraint.activate(newConstraints)
view.layoutIfNeeded()
IQKeyboardManager.shared.reloadLayoutIfNeeded()
```
- Note: This method only has an effect when:
- `isEnabled` is `true`
- A text input view is currently active
- The keyboard is visible
- The root configuration is ready
- SeeAlso: `isEnabled` for enabling/disabling the manager
*/
public func reloadLayoutIfNeeded() {
guard privateIsEnabled(),
activeConfiguration.keyboardInfo.isVisible,
activeConfiguration.isReady else {
return
}
adjustPosition()
}
}
================================================
FILE: IQKeyboardManagerSwift/IQKeyboardManager/IQKeyboardManagerExtension/UIScrollView+IQKeyboardManagerExtension.swift
================================================
//
// UIScrollView+IQKeyboardManagerExtension.swift
// https://github.com/hackiftekhar/IQKeyboardManager
// Copyright (c) 2013-24 Iftekhar Qurashi.
//
// Permission is hereby granted, free of charge, to any person obtaining a copy
// of this software and associated documentation files (the "Software"), to deal
// in the Software without restriction, including without limitation the rights
// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
// copies of the Software, and to permit persons to whom the Software is
// furnished to do so, subject to the following conditions:
//
// The above copyright notice and this permission notice shall be included in
// all copies or substantial portions of the Software.
//
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
// THE SOFTWARE.
import UIKit
import IQKeyboardCore
@available(iOSApplicationExtension, unavailable)
@MainActor
private struct AssociatedKeys {
static var ignoreScrollingAdjustment: Int = 0
static var ignoreContentInsetAdjustment: Int = 0
static var restoreContentOffset: Int = 0
}
@available(iOSApplicationExtension, unavailable)
@MainActor
public extension IQKeyboardExtension where Base: UIScrollView {
/**
If YES, then scrollview will ignore scrolling (simply not scroll it) for adjusting textInputView position.
Default is NO.
*/
var ignoreScrollingAdjustment: Bool {
get {
if let base = base {
return objc_getAssociatedObject(base, &AssociatedKeys.ignoreScrollingAdjustment) as? Bool ?? false
}
return false
}
set(newValue) {
if let base = base {
objc_setAssociatedObject(base, &AssociatedKeys.ignoreScrollingAdjustment,
newValue, .OBJC_ASSOCIATION_RETAIN_NONATOMIC)
}
}
}
/**
If YES, then scrollview will ignore content inset adjustment (simply not updating it) when keyboard is shown.
Default is NO.
*/
var ignoreContentInsetAdjustment: Bool {
get {
if let base = base {
return objc_getAssociatedObject(base, &AssociatedKeys.ignoreContentInsetAdjustment) as? Bool ?? false
}
return false
}
set(newValue) {
if let base = base {
objc_setAssociatedObject(base, &AssociatedKeys.ignoreContentInsetAdjustment,
newValue, .OBJC_ASSOCIATION_RETAIN_NONATOMIC)
}
}
}
/**
If we should restore scrollView contentOffset to it's initial position
*/
var restoreContentOffset: Bool {
get {
if let base = base {
return objc_getAssociatedObject(base, &AssociatedKeys.restoreContentOffset) as? Bool ?? false
}
return false
}
set(newValue) {
if let base = base {
objc_setAssociatedObject(base, &AssociatedKeys.restoreContentOffset,
newValue, .OBJC_ASSOCIATION_RETAIN_NONATOMIC)
}
}
}
}
// swiftlint:disable unused_setter_value
@available(iOSApplicationExtension, unavailable)
@MainActor
@objc public extension UIScrollView {
@available(*, unavailable, renamed: "iq.ignoreScrollingAdjustment")
var shouldIgnoreScrollingAdjustment: Bool {
get { false }
set { }
}
@available(*, unavailable, renamed: "iq.ignoreContentInsetAdjustment")
var shouldIgnoreContentInsetAdjustment: Bool {
get { false }
set { }
}
@available(*, unavailable, renamed: "iq.restoreContentOffset")
var shouldRestoreScrollViewContentOffset: Bool {
get { false }
set { }
}
}
// swiftlint:enable unused_setter_value
================================================
FILE: IQKeyboardManagerSwift/IQKeyboardManager/IQKeyboardManagerExtension/UIScrollView+IQKeyboardManagerExtensionObjc.swift
================================================
//
// UIScrollView+IQKeyboardManagerExtensionObjc.swift
// https://github.com/hackiftekhar/IQKeyboardManager
// Copyright (c) 2013-24 Iftekhar Qurashi.
//
// Permission is hereby granted, free of charge, to any person obtaining a copy
// of this software and associated documentation files (the "Software"), to deal
// in the Software without restriction, including without limitation the rights
// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
// copies of the Software, and to permit persons to whom the Software is
// furnished to do so, subject to the following conditions:
//
// The above copyright notice and this permission notice shall be included in
// all copies or substantial portions of the Software.
//
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
// THE SOFTWARE.
import UIKit
// MARK: For ObjectiveC Compatibility
// swiftlint:disable identifier_name
@objc public extension UIScrollView {
var iq_ignoreScrollingAdjustment: Bool {
get { iq.ignoreScrollingAdjustment }
set { iq.ignoreScrollingAdjustment = newValue }
}
var iq_ignoreContentInsetAdjustment: Bool {
get { iq.ignoreContentInsetAdjustment }
set { iq.ignoreContentInsetAdjustment = newValue }
}
var iq_restoreContentOffset: Bool {
get { iq.restoreContentOffset }
set { iq.restoreContentOffset = newValue }
}
}
// swiftlint:enable identifier_name
================================================
FILE: IQKeyboardManagerSwift/IQKeyboardManager/IQKeyboardManagerExtension/UIView+IQKeyboardManagerExtension.swift
================================================
//
// UIView+IQKeyboardManagerExtension.swift
// https://github.com/hackiftekhar/IQKeyboardManager
// Copyright (c) 2013-24 Iftekhar Qurashi.
//
// Permission is hereby granted, free of charge, to any person obtaining a copy
// of this software and associated documentation files (the "Software"), to deal
// in the Software without restriction, including without limitation the rights
// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
// copies of the Software, and to permit persons to whom the Software is
// furnished to do so, subject to the following conditions:
//
// The above copyright notice and this permission notice shall be included in
// all copies or substantial portions of the Software.
//
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
// THE SOFTWARE.
import UIKit
import IQKeyboardCore
@available(iOSApplicationExtension, unavailable)
@MainActor
private struct AssociatedKeys {
static var distanceFromKeyboard: Int = 0
static var enableMode: Int = 0
}
@available(iOSApplicationExtension, unavailable)
@MainActor
@objc public extension UIView {
nonisolated static let defaultKeyboardDistance: CGFloat = .greatestFiniteMagnitude
}
@available(iOSApplicationExtension, unavailable)
@available(*, unavailable, renamed: "UIView.defaultKeyboardDistance")
nonisolated public let kIQUseDefaultKeyboardDistance: CGFloat = .greatestFiniteMagnitude
/**
Extension providing keyboard management functionality to UIView instances.
This extension allows per-view configuration of keyboard behavior, including
custom distance and enable/disable modes.
## Usage
```swift
// Set custom distance for a text field
textField.iq.distanceFromKeyboard = 30.0
// Disable keyboard management for a specific text field
textField.iq.enableMode = .disabled
```
*/
@available(iOSApplicationExtension, unavailable)
@MainActor
public extension IQKeyboardExtension where Base: IQTextInputView {
/**
Custom distance from keyboard for this specific text input view.
If set to `UIView.defaultKeyboardDistance`, the global `keyboardDistance`
value from `IQKeyboardManager.shared.keyboardDistance` will be used.
Otherwise, this value takes precedence.
- Default: `UIView.defaultKeyboardDistance` (uses global setting)
- Note: Value cannot be negative. Negative values may cause unexpected behavior.
## Example
```swift
// Use global setting
textField.iq.distanceFromKeyboard = UIView.defaultKeyboardDistance
// Use custom distance
textField.iq.distanceFromKeyboard = 50.0
```
*/
var distanceFromKeyboard: CGFloat {
get {
if let base = base {
if let value = objc_getAssociatedObject(base, &AssociatedKeys.distanceFromKeyboard) as? CGFloat {
return value
}
}
return UIView.defaultKeyboardDistance
}
set(newValue) {
if let base = base {
objc_setAssociatedObject(base, &AssociatedKeys.distanceFromKeyboard,
newValue, .OBJC_ASSOCIATION_RETAIN_NONATOMIC)
}
if newValue < 0 {
IQKeyboardManager.shared.showLog("Warning: distanceFromKeyboard shouldn't be negative.")
}
}
}
/**
Enable mode for this specific text input view.
Controls whether keyboard management is enabled, disabled, or uses the default
global setting for this view.
- `.default`: Use global `IQKeyboardManager.shared.isEnabled` setting
- `.enabled`: Force enable keyboard management for this view
- `.disabled`: Force disable keyboard management for this view
## Example
```swift
// Use global setting
textField.iq.enableMode = .default
// Always enable for this field
textField.iq.enableMode = .enabled
// Always disable for this field
textField.iq.enableMode = .disabled
```
- SeeAlso: `IQKeyboardManager.isEnabled` for global control
*/
var enableMode: IQEnableMode {
get {
if let base = base {
return objc_getAssociatedObject(base, &AssociatedKeys.enableMode) as? IQEnableMode ?? .default
}
return .default
}
set(newValue) {
if let base = base {
objc_setAssociatedObject(base, &AssociatedKeys.enableMode, newValue, .OBJC_ASSOCIATION_RETAIN_NONATOMIC)
}
}
}
}
// swiftlint:disable unused_setter_value
@available(iOSApplicationExtension, unavailable)
@MainActor
@objc public extension UIView {
@available(*, unavailable, renamed: "iq.distanceFromKeyboard")
var keyboardDistanceFromTextField: CGFloat {
get { 0 }
set { }
}
@available(*, unavailable, renamed: "iq.enableMode")
var enableMode: IQEnableMode {
get { .default }
set { }
}
}
// swiftlint:enable unused_setter_value
================================================
FILE: IQKeyboardManagerSwift/IQKeyboardManager/IQKeyboardManagerExtension/UIView+IQKeyboardManagerExtensionObjc.swift
================================================
//
// UIView+IQKeyboardManagerExtensionObjc.swift
// https://github.com/hackiftekhar/IQKeyboardManager
// Copyright (c) 2013-24 Iftekhar Qurashi.
//
// Permission is hereby granted, free of charge, to any person obtaining a copy
// of this software and associated documentation files (the "Software"), to deal
// in the Software without restriction, including without limitation the rights
// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
// copies of the Software, and to permit persons to whom the Software is
// furnished to do so, subject to the following conditions:
//
// The above copyright notice and this permission notice shall be included in
// all copies or substantial portions of the Software.
//
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
// THE SOFTWARE.
import UIKit
import IQKeyboardCore
// MARK: For ObjectiveC Compatibility
// swiftlint:disable identifier_name
@objc public extension UITextField {
var iq_distanceFromKeyboard: CGFloat {
get { iq.distanceFromKeyboard }
set { iq.distanceFromKeyboard = newValue }
}
var iq_enableMode: IQEnableMode {
get { iq.enableMode }
set { iq.enableMode = newValue }
}
}
@objc public extension UITextView {
var iq_distanceFromKeyboard: CGFloat {
get { iq.distanceFromKeyboard }
set { iq.distanceFromKeyboard = newValue }
}
var iq_enableMode: IQEnableMode {
get { iq.enableMode }
set { iq.enableMode = newValue }
}
}
// swiftlint:enable identifier_name
================================================
FILE: IQKeyboardManagerSwift/IQKeyboardManager/UIKitExtensions/UICollectionView+IndexPaths.swift
================================================
//
// UICollectionView+IndexPaths.swift
// https://github.com/hackiftekhar/IQKeyboardManager
// Copyright (c) 2013-24 Iftekhar Qurashi.
//
// Permission is hereby granted, free of charge, to any person obtaining a copy
// of this software and associated documentation files (the "Software"), to deal
// in the Software without restriction, including without limitation the rights
// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
// copies of the Software, and to permit persons to whom the Software is
// furnished to do so, subject to the following conditions:
//
// The above copyright notice and this permission notice shall be included in
// all copies or substantial portions of the Software.
//
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
// THE SOFTWARE.
import UIKit
@available(iOSApplicationExtension, unavailable)
@MainActor
internal extension UICollectionView {
func previousIndexPath(of indexPath: IndexPath) -> IndexPath? {
var previousRow: Int = indexPath.row - 1
var previousSection: Int = indexPath.section
// Fixing indexPath
if previousRow < 0 {
previousSection -= 1
if previousSection >= 0 {
previousRow = self.numberOfItems(inSection: previousSection) - 1
}
}
guard previousRow >= 0, previousSection >= 0 else { return nil }
return IndexPath(item: previousRow, section: previousSection)
}
}
================================================
FILE: IQKeyboardManagerSwift/IQKeyboardManager/UIKitExtensions/UITableView+IndexPaths.swift
================================================
//
// UITableView+IndexPaths.swift
// https://github.com/hackiftekhar/IQKeyboardManager
// Copyright (c) 2013-24 Iftekhar Qurashi.
//
// Permission is hereby granted, free of charge, to any person obtaining a copy
// of this software and associated documentation files (the "Software"), to deal
// in the Software without restriction, including without limitation the rights
// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
// copies of the Software, and to permit persons to whom the Software is
// furnished to do so, subject to the following conditions:
//
// The above copyright notice and this permission notice shall be included in
// all copies or substantial portions of the Software.
//
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
// THE SOFTWARE.
import UIKit
@available(iOSApplicationExtension, unavailable)
@MainActor
internal extension UITableView {
func previousIndexPath(of indexPath: IndexPath) -> IndexPath? {
var previousRow: Int = indexPath.row - 1
var previousSection: Int = indexPath.section
// Fixing indexPath
if previousRow < 0 {
previousSection -= 1
if previousSection >= 0 {
let rowCount = self.numberOfRows(inSection: previousSection)
previousRow = rowCount > 0 ? rowCount - 1 : -1
}
}
guard previousRow >= 0, previousSection >= 0 else { return nil }
return IndexPath(row: previousRow, section: previousSection)
}
}
================================================
FILE: IQKeyboardManagerSwift/IQKeyboardManager/UIKitExtensions/UIView+Parent.swift
================================================
//
// UIView+Parent.swift
// https://github.com/hackiftekhar/IQKeyboardManager
// Copyright (c) 2013-24 Iftekhar Qurashi.
//
// Permission is hereby granted, free of charge, to any person obtaining a copy
// of this software and associated documentation files (the "Software"), to deal
// in the Software without restriction, including without limitation the rights
// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
// copies of the Software, and to permit persons to whom the Software is
// furnished to do so, subject to the following conditions:
//
// The above copyright notice and this permission notice shall be included in
// all copies or substantial portions of the Software.
//
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
// THE SOFTWARE.
import UIKit
import IQKeyboardCore
/**
UIView hierarchy category.
*/
@available(iOSApplicationExtension, unavailable)
@MainActor
public extension IQKeyboardExtension where Base: UIView {
/**
Returns the UIViewController object that is actually the parent of this object.
Most of the time it's the viewController object which actually contains it,
but result may be different if it's viewController is added as childViewController of another viewController.
*/
func parentContainerViewController() -> UIViewController? {
var matchController: UIViewController? = viewContainingController()
var parentContainerViewController: UIViewController?
if var navController: UINavigationController = matchController?.navigationController {
while let parentNav: UINavigationController = navController.navigationController {
navController = parentNav
}
var parentController: UIViewController = navController
while let parent: UIViewController = parentController.parent,
!(parent is UINavigationController) &&
!(parent is UITabBarController) &&
!(parent is UISplitViewController) {
parentController = parent
}
if navController == parentController {
parentContainerViewController = navController.topViewController
} else {
parentContainerViewController = parentController
}
} else if let tabController: UITabBarController = matchController?.tabBarController {
let selectedController = tabController.selectedViewController
if let navController: UINavigationController = selectedController as? UINavigationController {
parentContainerViewController = navController.topViewController
} else {
parentContainerViewController = tabController.selectedViewController
}
} else {
while let parent: UIViewController = matchController?.parent,
!(parent is UINavigationController) &&
!(parent is UITabBarController) &&
!(parent is UISplitViewController) {
matchController = parent
}
parentContainerViewController = matchController
}
if let controller: UIViewController = parentContainerViewController?.iq_parentContainerViewController() {
return controller
} else {
return parentContainerViewController
}
}
}
@available(iOSApplicationExtension, unavailable)
@MainActor
@objc public extension UIView {
@available(*, unavailable, renamed: "iq.parentContainerViewController()")
func parentContainerViewController() -> UIViewController? { nil }
}
================================================
FILE: IQKeyboardManagerSwift/IQKeyboardManager/UIKitExtensions/UIView+ParentObjc.swift
================================================
//
// UIView+ParentObjc.swift
// https://github.com/hackiftekhar/IQKeyboardManager
// Copyright (c) 2013-24 Iftekhar Qurashi.
//
// Permission is hereby granted, free of charge, to any person obtaining a copy
// of this software and associated documentation files (the "Software"), to deal
// in the Software without restriction, including without limitation the rights
// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
// copies of the Software, and to permit persons to whom the Software is
// furnished to do so, subject to the following conditions:
//
// The above copyright notice and this permission notice shall be included in
// all copies or substantial portions of the Software.
//
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
// THE SOFTWARE.
import UIKit
@objc public extension UIView {
func iq_parentContainerViewController() -> UIViewController? {
iq.parentContainerViewController()
}
}
================================================
FILE: IQKeyboardManagerSwift/IQKeyboardManager/UIKitExtensions/UIViewController+ParentContainer.swift
================================================
//
// UIViewController+ParentContainer.swift
// https://github.com/hackiftekhar/IQKeyboardManager
// Copyright (c) 2013-24 Iftekhar Qurashi.
//
// Permission is hereby granted, free of charge, to any person obtaining a copy
// of this software and associated documentation files (the "Software"), to deal
// in the Software without restriction, including without limitation the rights
// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
// copies of the Software, and to permit persons to whom the Software is
// furnished to do so, subject to the following conditions:
//
// The above copyright notice and this permission notice shall be included in
// all copies or substantial portions of the Software.
//
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
// THE SOFTWARE.
import UIKit
@available(iOSApplicationExtension, unavailable)
@MainActor
@objc extension UIViewController {
/**
This method is provided to override by viewController's
if the library lifts a viewController which you doesn't want to lift.
This may happen if you have implemented side menu feature
in your app and the library try to lift the side menu controller.
Overriding this method in side menu class to return correct controller should fix the problem.
*/
open func iq_parentContainerViewController() -> UIViewController? {
return self
}
}
@available(iOSApplicationExtension, unavailable)
@MainActor
@objc extension UIViewController {
@available(*, unavailable, renamed: "iq_parentContainerViewController()")
open func parentIQContainerViewController() -> UIViewController? {
return self
}
}
================================================
FILE: IQKeyboardManagerSwift/IQKeyboardManagerSwift.h
================================================
//
// IQKeyboardManagerSwift.h
// https://github.com/hackiftekhar/IQKeyboardManager
// Copyright (c) 2013-16 Iftekhar Qurashi.
//
// Permission is hereby granted, free of charge, to any person obtaining a copy
// of this software and associated documentation files (the "Software"), to deal
// in the Software without restriction, including without limitation the rights
// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
// copies of the Software, and to permit persons to whom the Software is
// furnished to do so, subject to the following conditions:
//
// The above copyright notice and this permission notice shall be included in
// all copies or substantial portions of the Software.
//
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
// THE SOFTWARE.
#import
//! Project version number for IQKeyboardManagerSwift.
FOUNDATION_EXPORT double IQKeyboardManagerSwiftVersionNumber;
//! Project version string for IQKeyboardManagerSwift.
FOUNDATION_EXPORT const unsigned char IQKeyboardManagerSwiftVersionString[];
// In this header, you should import all the public headers of your framework using statements like #import
================================================
FILE: IQKeyboardManagerSwift/IQKeyboardToolbarManager/IQKeyboardManager+ToolbarManager.swift
================================================
//
// IQKeyboardManager+ToolbarManager.swift
// https://github.com/hackiftekhar/IQKeyboardManager
// Copyright (c) 2013-24 Iftekhar Qurashi.
//
// Permission is hereby granted, free of charge, to any person obtaining a copy
// of this software and associated documentation files (the "Software"), to deal
// in the Software without restriction, including without limitation the rights
// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
// copies of the Software, and to permit persons to whom the Software is
// furnished to do so, subject to the following conditions:
//
// The above copyright notice and this permission notice shall be included in
// all copies or substantial portions of the Software.
//
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
// THE SOFTWARE.
import UIKit
import IQKeyboardToolbarManager
@available(iOSApplicationExtension, unavailable)
// swiftlint:disable line_length
@available(*, deprecated,
message: "Please use `IQKeyboardToolbarManager` independently from https://github.com/hackiftekhar/IQKeyboardToolbarManager")
// swiftlint:enable line_length
@MainActor
@objc public extension IQKeyboardManager {
@MainActor
private struct AssociatedKeys {
static var toolbarManager: Int = 0
}
internal var toolbarManager: IQKeyboardToolbarManager {
IQKeyboardToolbarManager.shared
}
var enableToolbarDebugging: Bool {
get { toolbarManager.isDebuggingEnabled }
set { toolbarManager.isDebuggingEnabled = newValue }
}
/**
Automatic add the toolbar functionality. Default is YES.
*/
var enableAutoToolbar: Bool {
get { toolbarManager.isEnabled }
set { toolbarManager.isEnabled = newValue }
}
/**
Configurations related to the toolbar display over the keyboard.
*/
var toolbarConfiguration: IQKeyboardToolbarConfiguration {
toolbarManager.toolbarConfiguration
}
// MARK: UISound handling
/**
If YES, then it plays inputClick sound on next/previous/done click.
*/
var playInputClicks: Bool {
get { toolbarManager.playInputClicks }
set { toolbarManager.playInputClicks = newValue }
}
/**
Disable automatic toolbar creation within the scope of disabled toolbar viewControllers classes.
Within this scope, 'enableAutoToolbar' property is ignored. Class should be kind of UIViewController.
*/
var disabledToolbarClasses: [UIViewController.Type] {
get { toolbarManager.disabledToolbarClasses }
set { toolbarManager.disabledToolbarClasses = newValue }
}
/**
Enable automatic toolbar creation within the scope of enabled toolbar viewControllers classes.
Within this scope, 'enableAutoToolbar' property is ignored. Class should be kind of UIViewController.
If same Class is added in disabledToolbarClasses list, then enabledToolbarClasses will be ignore.
*/
var enabledToolbarClasses: [UIViewController.Type] {
get { toolbarManager.enabledToolbarClasses }
set { toolbarManager.enabledToolbarClasses = newValue }
}
/**
Allowed subclasses of UIView to add all inner textField,
this will allow to navigate between textField contains in different superview.
Class should be kind of UIView.
*/
var deepResponderAllowedContainerClasses: [UIView.Type] {
get { toolbarManager.deepResponderAllowedContainerClasses }
set { toolbarManager.deepResponderAllowedContainerClasses = newValue }
}
/** reloadInputViews to reload toolbar buttons enable/disable state on the fly Enhancement ID #434. */
func reloadInputViews() {
toolbarManager.reloadInputViews()
}
/**
Returns YES if can navigate to previous responder textInputView, otherwise NO.
*/
var canGoPrevious: Bool {
toolbarManager.canGoPrevious
}
/**
Returns YES if can navigate to next responder textInputViews, otherwise NO.
*/
var canGoNext: Bool {
toolbarManager.canGoNext
}
/**
Navigate to previous responder textInputViews
*/
@discardableResult
func goPrevious() -> Bool {
toolbarManager.goPrevious()
}
/**
Navigate to next responder textInputView.
*/
@discardableResult
func goNext() -> Bool {
toolbarManager.goNext()
}
}
================================================
FILE: IQKeyboardManagerSwift/IQKeyboardToolbarManager/IQKeyboardManager+ToolbarManagerDeprecated.swift
================================================
//
// IQKeyboardManager+ToolbarManagerDeprecated.swift
// https://github.com/hackiftekhar/IQKeyboardManager
// Copyright (c) 2013-24 Iftekhar Qurashi.
//
// Permission is hereby granted, free of charge, to any person obtaining a copy
// of this software and associated documentation files (the "Software"), to deal
// in the Software without restriction, including without limitation the rights
// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
// copies of the Software, and to permit persons to whom the Software is
// furnished to do so, subject to the following conditions:
//
// The above copyright notice and this permission notice shall be included in
// all copies or substantial portions of the Software.
//
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
// THE SOFTWARE.
import UIKit
import IQKeyboardToolbarManager
// swiftlint:disable unused_setter_value
// swiftlint:disable identifier_name
@available(iOSApplicationExtension, unavailable)
@MainActor
@objc public extension IQKeyboardManager {
@available(*, unavailable, renamed: "playInputClicks")
var shouldPlayInputClicks: Bool {
get { false }
set { }
}
}
@available(iOSApplicationExtension, unavailable)
@MainActor
@objc public extension IQKeyboardManager {
@available(*, unavailable, renamed: "toolbarConfiguration.manageBehavior")
var toolbarManageBehaviour: IQKeyboardToolbarManageBehavior {
get { .bySubviews }
set { }
}
@available(*, unavailable, renamed: "toolbarConfiguration.useTextInputViewTintColor")
var shouldToolbarUsesTextFieldTintColor: Bool {
get { false }
set { }
}
@available(*, unavailable, renamed: "toolbarConfiguration.tintColor")
var toolbarTintColor: UIColor? {
get { nil }
set { }
}
@available(*, unavailable, renamed: "toolbarConfiguration.barTintColor")
var toolbarBarTintColor: UIColor? {
get { nil }
set { }
}
@available(*, unavailable, renamed: "toolbarConfiguration.previousNextDisplayMode")
var previousNextDisplayMode: IQPreviousNextDisplayMode {
get { .default }
set { }
}
@available(*, unavailable, renamed: "deepResponderAllowedContainerClasses")
var toolbarPreviousNextAllowedClasses: [UIView.Type] {
get { [] }
set { }
}
}
@available(iOSApplicationExtension, unavailable)
@MainActor
@objc public extension IQKeyboardManager {
@available(*, unavailable, renamed: "toolbarConfiguration.previousBarButtonConfiguration.image",
message: "To change, please assign a new toolbarConfiguration.previousBarButtonConfiguration")
var toolbarPreviousBarButtonItemImage: UIImage? {
get { nil }
set { }
}
@available(*, unavailable, renamed: "toolbarConfiguration.previousBarButtonConfiguration.title",
message: "To change, please assign a new toolbarConfiguration.previousBarButtonConfiguration")
var toolbarPreviousBarButtonItemText: String? {
get { nil }
set { }
}
@available(*, unavailable, renamed: "toolbarConfiguration.previousBarButtonConfiguration.accessibilityLabel",
message: "To change, please assign a new toolbarConfiguration.previousBarButtonConfiguration")
var toolbarPreviousBarButtonItemAccessibilityLabel: String? {
get { nil }
set { }
}
@available(*, unavailable, renamed: "toolbarConfiguration.nextBarButtonConfiguration.image",
message: "To change, please assign a new toolbarConfiguration.nextBarButtonConfiguration")
var toolbarNextBarButtonItemImage: UIImage? {
get { nil }
set { }
}
@available(*, unavailable, renamed: "toolbarConfiguration.nextBarButtonConfiguration.title",
message: "To change, please assign a new toolbarConfiguration.nextBarButtonConfiguration")
var toolbarNextBarButtonItemText: String? {
get { nil }
set { }
}
@available(*, unavailable, renamed: "toolbarConfiguration.nextBarButtonConfiguration.accessibilityLabel",
message: "To change, please assign a new toolbarConfiguration.nextBarButtonConfiguration")
var toolbarNextBarButtonItemAccessibilityLabel: String? {
get { nil }
set { }
}
@available(*, unavailable, renamed: "toolbarConfiguration.doneBarButtonConfiguration.image",
message: "To change, please assign a new toolbarConfiguration.doneBarButtonConfiguration")
var toolbarDoneBarButtonItemImage: UIImage? {
get { nil }
set { }
}
@available(*, unavailable, renamed: "toolbarConfiguration.doneBarButtonConfiguration.title",
message: "To change, please assign a new toolbarConfiguration.doneBarButtonConfiguration")
var toolbarDoneBarButtonItemText: String? {
get { nil }
set { }
}
@available(*, unavailable, renamed: "toolbarConfiguration.doneBarButtonConfiguration.accessibilityLabel",
message: "To change, please assign a new toolbarConfiguration.doneBarButtonConfiguration")
var toolbarDoneBarButtonItemAccessibilityLabel: String? {
get { nil }
set { }
}
}
@available(iOSApplicationExtension, unavailable)
@MainActor
@objc public extension IQKeyboardManager {
@available(*, unavailable, renamed: "toolbarConfiguration.placeholderConfiguration.accessibilityLabel")
var toolbarTitleBarButtonItemAccessibilityLabel: String? {
get { nil }
set { }
}
@available(*, unavailable, renamed: "toolbarConfiguration.placeholderConfiguration.showPlaceholder")
var shouldShowToolbarPlaceholder: Bool {
get { false }
set { }
}
@available(*, unavailable, renamed: "toolbarConfiguration.placeholderConfiguration.font")
var placeholderFont: UIFont? {
get { nil }
set { }
}
@available(*, unavailable, renamed: "toolbarConfiguration.placeholderConfiguration.color")
var placeholderColor: UIColor? {
get { nil }
set { }
}
@available(*, unavailable, renamed: "toolbarConfiguration.placeholderConfiguration.buttonColor")
var placeholderButtonColor: UIColor? {
get { nil }
set { }
}
}
// swiftlint:enable unused_setter_value
// swiftlint:enable identifier_name
================================================
FILE: IQKeyboardManagerSwift/PrivacyInfo.xcprivacy
================================================
NSPrivacyAccessedAPITypes
NSPrivacyTrackingDomains
NSPrivacyCollectedDataTypes
NSPrivacyTracking
================================================
FILE: IQKeyboardManagerSwift/Resign/IQKeyboardManager+Resign.swift
================================================
//
// IQKeyboardManager+Resign.swift
// https://github.com/hackiftekhar/IQKeyboardManager
// Copyright (c) 2013-24 Iftekhar Qurashi.
//
// Permission is hereby granted, free of charge, to any person obtaining a copy
// of this software and associated documentation files (the "Software"), to deal
// in the Software without restriction, including without limitation the rights
// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
// copies of the Software, and to permit persons to whom the Software is
// furnished to do so, subject to the following conditions:
//
// The above copyright notice and this permission notice shall be included in
// all copies or substantial portions of the Software.
//
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
// THE SOFTWARE.
import UIKit
@available(iOSApplicationExtension, unavailable)
@MainActor
@objc public extension IQKeyboardManager {
@MainActor
private struct AssociatedKeys {
static var resignHandler: Int = 0
}
internal var resignHandler: IQKeyboardResignHandler {
if let object = objc_getAssociatedObject(self, &AssociatedKeys.resignHandler)
as? IQKeyboardResignHandler {
return object
}
let object: IQKeyboardResignHandler = .init()
objc_setAssociatedObject(self, &AssociatedKeys.resignHandler,
object, .OBJC_ASSOCIATION_RETAIN_NONATOMIC)
return object
}
/**
Resigns Keyboard on touching outside TextInputView. Default is NO.
*/
var resignOnTouchOutside: Bool {
get { resignHandler.resignOnTouchOutside }
set { resignHandler.resignOnTouchOutside = newValue }
}
/** TapGesture to resign keyboard on view's touch.
It's a readonly property and exposed only for adding/removing dependencies
if your added gesture does have collision with this one
*/
var resignGesture: UITapGestureRecognizer {
get { resignHandler.resignGesture }
set { resignHandler.resignGesture = newValue }
}
/**
Disabled classes to ignore resignOnTouchOutside' property, Class should be kind of UIViewController.
*/
var disabledTouchResignedClasses: [UIViewController.Type] {
get { resignHandler.disabledTouchResignedClasses }
set { resignHandler.disabledTouchResignedClasses = newValue }
}
/**
Enabled classes to forcefully enable 'resignOnTouchOutside' property.
Class should be kind of UIViewController
. If same Class is added in disabledTouchResignedClasses list, then enabledTouchResignedClasses will be ignored.
*/
var enabledTouchResignedClasses: [UIViewController.Type] {
get { resignHandler.enabledTouchResignedClasses }
set { resignHandler.enabledTouchResignedClasses = newValue }
}
/**
if resignOnTouchOutside is enabled then you can customize the behavior
to not recognize gesture touches on some specific view subclasses.
Class should be kind of UIView. Default is [UIControl, UINavigationBar]
*/
var touchResignedGestureIgnoreClasses: [UIView.Type] {
get { resignHandler.touchResignedGestureIgnoreClasses }
set { resignHandler.touchResignedGestureIgnoreClasses = newValue }
}
/**
Resigns currently first responder field.
*/
@discardableResult
func resignFirstResponder() -> Bool {
resignHandler.resignFirstResponder()
}
}
================================================
FILE: IQKeyboardManagerSwift/Resign/IQKeyboardManager+Resign_Deprecated.swift
================================================
//
// IQKeyboardManager+Resign_Deprecated.swift
// https://github.com/hackiftekhar/IQKeyboardManager
// Copyright (c) 2013-24 Iftekhar Qurashi.
//
// Permission is hereby granted, free of charge, to any person obtaining a copy
// of this software and associated documentation files (the "Software"), to deal
// in the Software without restriction, including without limitation the rights
// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
// copies of the Software, and to permit persons to whom the Software is
// furnished to do so, subject to the following conditions:
//
// The above copyright notice and this permission notice shall be included in
// all copies or substantial portions of the Software.
//
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
// THE SOFTWARE.
import UIKit
// swiftlint:disable unused_setter_value
@available(iOSApplicationExtension, unavailable)
@MainActor
@objc public extension IQKeyboardManager {
@available(*, unavailable, renamed: "resignOnTouchOutside")
var shouldResignOnTouchOutside: Bool {
get { false }
set { }
}
}
// swiftlint:enable unused_setter_value
================================================
FILE: IQKeyboardManagerSwift/Resign/IQKeyboardResignHandler+Internal.swift
================================================
//
// IQKeyboardResignHandler+Internal.swift
// https://github.com/hackiftekhar/IQKeyboardManager
// Copyright (c) 2013-24 Iftekhar Qurashi.
//
// Permission is hereby granted, free of charge, to any person obtaining a copy
// of this software and associated documentation files (the "Software"), to deal
// in the Software without restriction, including without limitation the rights
// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
// copies of the Software, and to permit persons to whom the Software is
// furnished to do so, subject to the following conditions:
//
// The above copyright notice and this permission notice shall be included in
// all copies or substantial portions of the Software.
//
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
// THE SOFTWARE.
import UIKit
import IQKeyboardCore
@available(iOSApplicationExtension, unavailable)
@MainActor
internal extension IQKeyboardResignHandler {
func removeTextInputViewObserver() {
textInputViewObserver.unsubscribe(identifier: "IQKeyboardResignHandler")
}
func addTextInputViewObserver() {
textInputViewObserver.subscribe(identifier: "IQKeyboardResignHandler",
changeHandler: { [weak self] event, textInputView in
guard let self = self else { return }
switch event {
case .beginEditing:
self.resignGesture.isEnabled = self.privateResignOnTouchOutside()
textInputView.window?.addGestureRecognizer(self.resignGesture)
case .endEditing:
textInputView.window?.removeGestureRecognizer(self.resignGesture)
}
})
}
func privateResignOnTouchOutside() -> Bool {
guard let textInputView: any IQTextInputView = textInputViewObserver.textInputView else {
return resignOnTouchOutside
}
switch textInputView.internalResignOnTouchOutsideMode {
case .default:
guard var controller = (textInputView as UIView).iq.viewContainingController() else {
return resignOnTouchOutside
}
// If it is searchBar textField embedded in Navigation Bar
if textInputView is UISearchTextField {
if let navController: UINavigationController = controller as? UINavigationController,
let topController: UIViewController = navController.topViewController,
controller.navigationItem.searchController?.searchBar.searchTextField == textInputView {
controller = topController
}
}
// If viewController is in enabledTouchResignedClasses, then assuming resignOnTouchOutside is enabled.
let isWithEnabledClass: Bool = enabledTouchResignedClasses.contains(where: { controller.isKind(of: $0) })
var isEnabled: Bool = resignOnTouchOutside || isWithEnabledClass
if isEnabled {
// If viewController is in disabledTouchResignedClasses,
// then assuming resignOnTouchOutside is disable.
if disabledTouchResignedClasses.contains(where: { controller.isKind(of: $0) }) {
isEnabled = false
} else {
let classNameString: String = "\(type(of: controller.self))"
// _UIAlertControllerTextFieldViewController
if classNameString.contains("UIAlertController"),
classNameString.hasSuffix("TextFieldViewController") {
isEnabled = false
}
}
}
return isEnabled
case .enabled:
return true
case .disabled:
return false
}
}
}
@available(iOSApplicationExtension, unavailable)
@MainActor
fileprivate extension IQTextInputView {
var internalResignOnTouchOutsideMode: IQEnableMode {
iq.resignOnTouchOutsideMode
}
}
================================================
FILE: IQKeyboardManagerSwift/Resign/IQKeyboardResignHandler.swift
================================================
//
// IQKeyboardResignHandler.swift
// https://github.com/hackiftekhar/IQKeyboardManager
// Copyright (c) 2013-24 Iftekhar Qurashi.
//
// Permission is hereby granted, free of charge, to any person obtaining a copy
// of this software and associated documentation files (the "Software"), to deal
// in the Software without restriction, including without limitation the rights
// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
// copies of the Software, and to permit persons to whom the Software is
// furnished to do so, subject to the following conditions:
//
// The above copyright notice and this permission notice shall be included in
// all copies or substantial portions of the Software.
//
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
// THE SOFTWARE.
import UIKit
import IQTextInputViewNotification
import IQKeyboardCore
@available(iOSApplicationExtension, unavailable)
@MainActor
@objcMembers internal final class IQKeyboardResignHandler: NSObject {
let textInputViewObserver: IQTextInputViewNotification = .init()
/**
Resigns Keyboard on touching outside of TextInputView. Default is NO.
*/
public var resignOnTouchOutside: Bool = false {
didSet {
resignGesture.isEnabled = privateResignOnTouchOutside()
IQKeyboardManager.shared.showLog("resignOnTouchOutside: \(resignOnTouchOutside ? "Yes" : "No")")
}
}
/** TapGesture to resign keyboard on view's touch.
It's a readonly property and exposed only for adding/removing dependencies
if your added gesture does have collision with this one
*/
public var resignGesture: UITapGestureRecognizer = .init()
/**
Disabled classes to ignore resignOnTouchOutside' property, Class should be kind of UIViewController.
*/
public var disabledTouchResignedClasses: [UIViewController.Type] = [
UIAlertController.self,
UIInputViewController.self
]
/**
Enabled classes to forcefully enable 'resignOnTouchOutside' property.
Class should be kind of UIViewController
. If same Class is added in disabledTouchResignedClasses list, then enabledTouchResignedClasses will be ignored.
*/
public var enabledTouchResignedClasses: [UIViewController.Type] = []
/**
if resignOnTouchOutside is enabled then you can customize the behavior
to not recognize gesture touches on some specific view subclasses.
Class should be kind of UIView. Default is [UIControl, UINavigationBar]
*/
public var touchResignedGestureIgnoreClasses: [UIView.Type] = [
UIControl.self,
UINavigationBar.self
]
/**
Resigns currently first responder field.
*/
@discardableResult
public func resignFirstResponder() -> Bool {
guard let textInputView: any IQTextInputView = textInputViewObserver.textInputView else {
return false
}
// Resigning first responder
guard textInputView.resignFirstResponder() else {
IQKeyboardManager.shared.showLog("Warning: Refuses to resign first responder: \(textInputView)")
// If it refuses then becoming it as first responder again. (Bug ID: #96)
// If it refuses to resign then becoming it first responder again for getting notifications callback.
textInputView.becomeFirstResponder()
return false
}
return true
}
public override init() {
super.init()
resignGesture.addTarget(self, action: #selector(self.tapRecognized(_:)))
resignGesture.cancelsTouchesInView = false
resignGesture.delegate = self
resignGesture.isEnabled = false
addTextInputViewObserver()
}
}
@available(iOSApplicationExtension, unavailable)
@MainActor
@objc extension IQKeyboardResignHandler: UIGestureRecognizerDelegate {
/** Resigning on tap gesture. (Enhancement ID: #14)*/
private func tapRecognized(_ gesture: UITapGestureRecognizer) {
if gesture.state == .ended {
// Resigning currently responder textInputView.
resignFirstResponder()
}
}
/** Note: returning YES is guaranteed to allow simultaneous recognition.
returning NO is not guaranteed to prevent simultaneous recognition,
as the other gesture's delegate may return YES.
*/
public func gestureRecognizer(_ gestureRecognizer: UIGestureRecognizer,
shouldRecognizeSimultaneouslyWith
otherGestureRecognizer: UIGestureRecognizer) -> Bool {
return false
}
/**
To not detect touch events in a subclass of UIControl,
these may have added their own selector for specific work
*/
public func gestureRecognizer(_ gestureRecognizer: UIGestureRecognizer,
shouldReceive touch: UITouch) -> Bool {
// (Bug ID: #145)
// Should not recognize gesture if the clicked view is either UIControl or UINavigationBar(
[](https://github.com/hackiftekhar/IQKeyboardManager/blob/master/LICENSE.md)
[](https://travis-ci.org/hackiftekhar/IQKeyboardManager)

[](http://cocoadocs.org/docsets/IQKeyboardManagerSwift)
[](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
[](http://youtu.be/6nhLw6hju2A)
[](http://youtu.be/6nhLw6hju2A)
[](http://youtu.be/6nhLw6hju2A)
[](http://youtu.be/6nhLw6hju2A)
[](http://youtu.be/6nhLw6hju2A)
## GIF animation
[](http://youtu.be/6nhLw6hju2A)
## Video
## 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:
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
[](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: hack.iftekhar@gmail.com
================================================
FILE: SECURITY.md
================================================
# Security
## Reporting Potential Security Issues
If you have encountered a potential security vulnerability in this project,
please report it to us at . We will work with you to
verify the vulnerability and patch it.
When reporting issues, please provide the following information:
- Component(s) affected
- A description indicating how to reproduce the issue
- A summary of the security vulnerability and impact
We request that you contact us via the email address above and give the
project contributors a chance to resolve the vulnerability and issue a new
release prior to any public exposure; this helps protect the project's
users, and provides them with a chance to upgrade and/or update in order to
protect their applications.
## Policy
If we verify a reported security vulnerability, our policy is:
- We will patch the current release branch, as well as the immediate prior minor
release branch.
- After patching the release branches, we will immediately issue new security
fix releases for each patched release branch.
- A security advisory will be released on the project website detailing the
vulnerability, as well as recommendations for end-users to protect themselves.