├── .gitignore ├── CHANGELOG.md ├── Classes ├── UIViewController+TAPKeyboardPop.h └── UIViewController+TAPKeyboardPop.m ├── LICENSE ├── Project └── Podfile ├── README.md ├── Rakefile ├── Screenshots └── example.png ├── TAPKeyboardPop.podspec └── TAPKeyboardPopExample ├── .gitignore ├── Podfile ├── Podfile.lock ├── TAPKeyboardPopExample.xcodeproj └── project.pbxproj └── TAPKeyboardPopExample ├── Images.xcassets ├── AppIcon.appiconset │ └── Contents.json └── LaunchImage.launchimage │ └── Contents.json ├── TAPAppDelegate.h ├── TAPAppDelegate.m ├── TAPKeyboardPopExample-Info.plist ├── TAPKeyboardPopExample-Prefix.pch ├── TAPRootViewController.h ├── TAPRootViewController.m ├── TAPRootViewController.xib ├── TAPTextFieldViewController.h ├── TAPTextFieldViewController.m ├── TAPTextFieldViewController.xib ├── TAPTextViewViewController.h ├── TAPTextViewViewController.m ├── TAPTextViewViewController.xib ├── en.lproj └── InfoPlist.strings └── main.m /.gitignore: -------------------------------------------------------------------------------- 1 | # Xcode 2 | .DS_Store 3 | */build/* 4 | *.pbxuser 5 | !default.pbxuser 6 | *.mode1v3 7 | !default.mode1v3 8 | *.mode2v3 9 | !default.mode2v3 10 | *.perspectivev3 11 | !default.perspectivev3 12 | xcuserdata 13 | profile 14 | *.moved-aside 15 | DerivedData 16 | .idea/ 17 | *.hmap 18 | 19 | #CocoaPods 20 | Pods 21 | -------------------------------------------------------------------------------- /CHANGELOG.md: -------------------------------------------------------------------------------- 1 | # TAPKeyboardPop CHANGELOG 2 | 3 | ## 0.1.2 4 | 5 | * Better support for UITextView -- [@jpism](https://github.com/jpsim) 6 | * Ensure that first reponder is not forced to be set after canceled interactive transition 7 | 8 | ## 0.1.1 9 | 10 | * Minor memory/performance tweaks [@stephencelis](https://github.com/stephencelis) 11 | * Backwards compatibility for iOS 6 [@derpoliuk](https://github.com/derpoliuk) 12 | 13 | ## 0.1.0 14 | 15 | Initial release. 16 | -------------------------------------------------------------------------------- /Classes/UIViewController+TAPKeyboardPop.h: -------------------------------------------------------------------------------- 1 | /*** 2 | The MIT License (MIT) 3 | 4 | Copyright (c) 2014 CoTap, Inc. (http://cotap.com/) 5 | 6 | Permission is hereby granted, free of charge, to any person obtaining a copy 7 | of this software and associated documentation files (the "Software"), to deal 8 | in the Software without restriction, including without limitation the rights 9 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 10 | copies of the Software, and to permit persons to whom the Software is 11 | furnished to do so, subject to the following conditions: 12 | 13 | The above copyright notice and this permission notice shall be included in all 14 | copies or substantial portions of the Software. 15 | 16 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 17 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 18 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 19 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 20 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 21 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 22 | SOFTWARE. 23 | */ 24 | 25 | #import 26 | 27 | /** 28 | Implements basic functionality for dismissing keyboard with the animated back gesture in iOS7 29 | */ 30 | @interface UIViewController (TAPKeyboardPop) 31 | 32 | @end 33 | -------------------------------------------------------------------------------- /Classes/UIViewController+TAPKeyboardPop.m: -------------------------------------------------------------------------------- 1 | #import "UIViewController+TAPKeyboardPop.h" 2 | #import 3 | 4 | @interface UIViewController () 5 | 6 | @property (nonatomic, strong) UIResponder *tap_previousResponder; 7 | 8 | @end 9 | 10 | @implementation UIViewController (TAPKeyboardPop) 11 | 12 | + (void)load 13 | { 14 | if ([self instancesRespondToSelector:@selector(transitionCoordinator)]) { 15 | static dispatch_once_t onceToken; 16 | dispatch_once(&onceToken, ^{ 17 | [self tap_swizzleSelector:@selector(viewWillAppear:) withSelector:@selector(tap_viewWillAppear:)]; 18 | [self tap_swizzleSelector:@selector(viewWillDisappear:) withSelector:@selector(tap_viewWillDisappear:)]; 19 | [self tap_swizzleSelector:@selector(beginAppearanceTransition:animated:) withSelector:@selector(tap_beginAppearanceTransition:animated:)]; 20 | }); 21 | } 22 | } 23 | 24 | + (void)tap_swizzleSelector:(SEL)originalSelector withSelector:(SEL)swizzledSelector 25 | { 26 | Class class = [self class]; 27 | 28 | Method originalMethod = class_getInstanceMethod(class, originalSelector); 29 | Method swizzledMethod = class_getInstanceMethod(class, swizzledSelector); 30 | 31 | BOOL didAddMethod = class_addMethod(class, originalSelector, method_getImplementation(swizzledMethod), method_getTypeEncoding(swizzledMethod)); 32 | if (didAddMethod) { 33 | class_replaceMethod(class, swizzledSelector, method_getImplementation(originalMethod), method_getTypeEncoding(originalMethod)); 34 | } else { 35 | method_exchangeImplementations(originalMethod, swizzledMethod); 36 | } 37 | } 38 | 39 | - (void)tap_beginAppearanceTransition:(BOOL)isAppearing animated:(BOOL)animated 40 | { 41 | [self tap_beginAppearanceTransition:isAppearing animated:animated]; 42 | 43 | if (isAppearing || !animated || self.tap_previousResponder == nil) { 44 | return; 45 | } 46 | 47 | if (![self.transitionCoordinator isInteractive]) { 48 | return; 49 | } 50 | UIView *keyboardView = self.tap_previousResponder.inputAccessoryView.superview; 51 | if (!keyboardView) { 52 | [self.tap_previousResponder becomeFirstResponder]; 53 | keyboardView = self.tap_previousResponder.inputAccessoryView.superview; 54 | if (!keyboardView) { 55 | return; 56 | } else { 57 | [self.tap_previousResponder resignFirstResponder]; 58 | } 59 | } 60 | 61 | [self.tap_previousResponder becomeFirstResponder]; 62 | [self.transitionCoordinator animateAlongsideTransitionInView:keyboardView animation:^(id context) { 63 | UIView* fromView = [[context viewControllerForKey:UITransitionContextFromViewControllerKey] view]; 64 | CGRect endFrame = keyboardView.frame; 65 | endFrame.origin.x = fromView.frame.origin.x; 66 | keyboardView.frame = endFrame; 67 | } completion:^(id context) { 68 | if ([context isCancelled]) { 69 | return; 70 | } 71 | [self.tap_previousResponder resignFirstResponder]; 72 | self.tap_previousResponder = nil; 73 | }]; 74 | } 75 | 76 | - (void)tap_viewWillAppear:(BOOL)animated 77 | { 78 | NSNotificationCenter *center = [NSNotificationCenter defaultCenter]; 79 | [center addObserver:self selector:@selector(tap_didBeginEditing:) name:UITextFieldTextDidBeginEditingNotification object:nil]; 80 | [center addObserver:self selector:@selector(tap_didBeginEditing:) name:UITextViewTextDidBeginEditingNotification object:nil]; 81 | 82 | // When the keyboard is dismissed, we need to remove our hooks from it so that we don't accidentally re-set 83 | // the first responder if an interactive transition is canceled. 84 | [center addObserver:self selector:@selector(tap_didEndEditing:) name:UIKeyboardDidHideNotification object:nil]; 85 | 86 | [self tap_viewWillAppear:animated]; 87 | } 88 | 89 | - (void)tap_viewWillDisappear:(BOOL)animated 90 | { 91 | [self tap_viewWillDisappear:animated]; 92 | 93 | NSNotificationCenter *center = [NSNotificationCenter defaultCenter]; 94 | [center removeObserver:self name:UITextFieldTextDidBeginEditingNotification object:nil]; 95 | [center removeObserver:self name:UITextViewTextDidBeginEditingNotification object:nil]; 96 | 97 | [center removeObserver:self name:UIKeyboardDidHideNotification object:nil]; 98 | } 99 | 100 | - (void)tap_didBeginEditing:(NSNotification *)note 101 | { 102 | UIResponder *firstResponder = note.object; 103 | self.tap_previousResponder = firstResponder; 104 | if (!firstResponder.inputAccessoryView) { 105 | [firstResponder performSelector:@selector(setInputAccessoryView:) withObject:[UIView new]]; 106 | } 107 | } 108 | 109 | - (void)tap_didEndEditing:(NSNotification *)note 110 | { 111 | self.tap_previousResponder = nil; 112 | } 113 | 114 | 115 | - (UIResponder *)tap_previousResponder 116 | { 117 | return objc_getAssociatedObject(self, @selector(tap_previousResponder)); 118 | } 119 | 120 | - (void)setTap_previousResponder:(UIResponder *)responder 121 | { 122 | objc_setAssociatedObject(self, @selector(tap_previousResponder), responder, OBJC_ASSOCIATION_RETAIN_NONATOMIC); 123 | } 124 | 125 | @end 126 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | The MIT License (MIT) 2 | 3 | Copyright (c) 2014 CoTap, Inc. (http://cotap.com/) 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /Project/Podfile: -------------------------------------------------------------------------------- 1 | pod "TAPKeyboardPop", :path => "../TAPKeyboardPop.podspec" 2 | 3 | target "Demo" do 4 | end 5 | 6 | target "DemoTests" do 7 | end 8 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # TAPKeyboardPop 2 | 3 | For an in depth overview, see the [blog post on the Cotap blog](http://engineering.cotap.com/post/77006076500/animating-the-keyboard-with-the-ios7-interactive-pop) 4 | 5 | In short, animated keyboard dismissal, just like iMessage: 6 | 7 | ![Example Screenshot](https://raw.github.com/cotap/TAPKeyboardPop/master/Screenshots/example.png) 8 | 9 | ## Installation 10 | 11 | TAPKeyboardPop is available through [CocoaPods](http://cocoapods.org), 12 | to install it simply add the following line to your Podfile: 13 | 14 | ``` ruby 15 | pod 'TAPKeyboardPop', '~> 0.1.2' 16 | ``` 17 | 18 | ## Usage 19 | 20 | To enable the keyboard to dismiss during an interactive back gesture, 21 | import the category so that it's accessible to view controllers that can 22 | be interactively popped: 23 | 24 | ``` objective-c 25 | #import 26 | ``` 27 | 28 | ## Author 29 | 30 | [Dave Lyon] (http://davelyon.net/) - [@daveisonthego](https://twitter.com/daveisonthego) 31 | 32 | ## Contributors 33 | 34 | - Built to support [Cotap](http://cotap.com) 35 | - [Stephen Celis] (https://github.com/stephencelis) 36 | - [Delisa Mason] (http://delisa.me) 37 | 38 | ## License 39 | 40 | TAPKeyboardPop is available under the MIT license. See the LICENSE file 41 | for more info. 42 | -------------------------------------------------------------------------------- /Rakefile: -------------------------------------------------------------------------------- 1 | desc "Runs the specs [EMPTY]" 2 | task :spec do 3 | # Provide your own implementation 4 | end 5 | 6 | task :version do 7 | git_remotes = `git remote`.strip.split("\n") 8 | 9 | if git_remotes.count > 0 10 | puts "-- fetching version number from github" 11 | sh 'git fetch' 12 | 13 | remote_version = remote_spec_version 14 | end 15 | 16 | if remote_version.nil? 17 | puts "There is no current released version. You're about to release a new Pod." 18 | version = "0.0.1" 19 | else 20 | puts "The current released version of your pod is " + remote_spec_version.to_s() 21 | version = suggested_version_number 22 | end 23 | 24 | puts "Enter the version you want to release (" + version + ") " 25 | new_version_number = $stdin.gets.strip 26 | if new_version_number == "" 27 | new_version_number = version 28 | end 29 | 30 | replace_version_number(new_version_number) 31 | end 32 | 33 | desc "Release a new version of the Pod" 34 | task :release do 35 | 36 | puts "* Running version" 37 | sh "rake version" 38 | 39 | unless ENV['SKIP_CHECKS'] 40 | if `git symbolic-ref HEAD 2>/dev/null`.strip.split('/').last != 'master' 41 | $stderr.puts "[!] You need to be on the `master' branch in order to be able to do a release." 42 | exit 1 43 | end 44 | 45 | if `git tag`.strip.split("\n").include?(spec_version) 46 | $stderr.puts "[!] A tag for version `#{spec_version}' already exists. Change the version in the podspec" 47 | exit 1 48 | end 49 | 50 | puts "You are about to release `#{spec_version}`, is that correct? [y/n]" 51 | exit if $stdin.gets.strip.downcase != 'y' 52 | end 53 | 54 | puts "* Running specs" 55 | sh "rake spec" 56 | 57 | puts "* Linting the podspec" 58 | sh "pod lib lint" 59 | 60 | # Then release 61 | sh "git commit #{podspec_path} CHANGELOG.md -m 'Release #{spec_version}'" 62 | sh "git tag -a #{spec_version} -m 'Release #{spec_version}'" 63 | sh "git push origin master" 64 | sh "git push origin --tags" 65 | sh "pod push master #{podspec_path}" 66 | end 67 | 68 | # @return [Pod::Version] The version as reported by the Podspec. 69 | # 70 | def spec_version 71 | require 'cocoapods' 72 | spec = Pod::Specification.from_file(podspec_path) 73 | spec.version 74 | end 75 | 76 | # @return [Pod::Version] The version as reported by the Podspec from remote. 77 | # 78 | def remote_spec_version 79 | require 'cocoapods-core' 80 | 81 | if spec_file_exist_on_remote? 82 | remote_spec = eval(`git show origin/master:#{podspec_path}`) 83 | remote_spec.version 84 | else 85 | nil 86 | end 87 | end 88 | 89 | # @return [Bool] If the remote repository has a copy of the podpesc file or not. 90 | # 91 | def spec_file_exist_on_remote? 92 | test_condition = `if git rev-parse --verify --quiet origin/master:#{podspec_path} >/dev/null; 93 | then 94 | echo 'true' 95 | else 96 | echo 'false' 97 | fi` 98 | 99 | 'true' == test_condition.strip 100 | end 101 | 102 | # @return [String] The relative path of the Podspec. 103 | # 104 | def podspec_path 105 | podspecs = Dir.glob('*.podspec') 106 | if podspecs.count == 1 107 | podspecs.first 108 | else 109 | raise "Could not select a podspec" 110 | end 111 | end 112 | 113 | # @return [String] The suggested version number based on the local and remote version numbers. 114 | # 115 | def suggested_version_number 116 | if spec_version != remote_spec_version 117 | spec_version.to_s() 118 | else 119 | next_version(spec_version).to_s() 120 | end 121 | end 122 | 123 | # @param [Pod::Version] version 124 | # the version for which you need the next version 125 | # 126 | # @note It is computed by bumping the last component of the versino string by 1. 127 | # 128 | # @return [Pod::Version] The version that comes next after the version supplied. 129 | # 130 | def next_version(version) 131 | version_components = version.to_s().split("."); 132 | last = (version_components.last.to_i() + 1).to_s 133 | version_components[-1] = last 134 | Pod::Version.new(version_components.join(".")) 135 | end 136 | 137 | # @param [String] new_version_number 138 | # the new version number 139 | # 140 | # @note This methods replaces the version number in the podspec file with a new version number. 141 | # 142 | # @return void 143 | # 144 | def replace_version_number(new_version_number) 145 | text = File.read(podspec_path) 146 | text.gsub!(/(s.version( )*= ")#{spec_version}(")/, "\\1#{new_version_number}\\3") 147 | File.open(podspec_path, "w") { |file| file.puts text } 148 | end -------------------------------------------------------------------------------- /Screenshots/example.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/cotap/TAPKeyboardPop/1d3176f9970b2df6555b762e438a43f644fe5cc5/Screenshots/example.png -------------------------------------------------------------------------------- /TAPKeyboardPop.podspec: -------------------------------------------------------------------------------- 1 | Pod::Spec.new do |s| 2 | s.name = "TAPKeyboardPop" 3 | s.version = "0.1.2" 4 | s.summary = "A UIViewController category that enables animated keyboard dismissal with the pop gesture." 5 | s.homepage = "https://github.com/cotap/TAPKeyboardPop" 6 | s.license = 'MIT' 7 | s.author = { "Cotap" => "http://cotap.com", "Dave Lyon" => "dave@davelyon.net" } 8 | s.source = { :git => "https://github.com/cotap/TAPKeyboardPop.git", :tag => s.version.to_s } 9 | 10 | s.platform = :ios, '6.0' 11 | s.requires_arc = true 12 | 13 | s.source_files = 'Classes/*' 14 | end 15 | -------------------------------------------------------------------------------- /TAPKeyboardPopExample/.gitignore: -------------------------------------------------------------------------------- 1 | ld/* 2 | *.pbxuser 3 | !default.pbxuser 4 | *.mode1v3 5 | !default.mode1v3 6 | *.mode2v3 7 | !default.mode2v3 8 | *.perspectivev3 9 | !default.perspectivev3 10 | *.xcworkspace 11 | !default.xcworkspace 12 | xcuserdata 13 | profile 14 | *.moved-aside 15 | 16 | docset-installed.txt 17 | .DS_Store 18 | -------------------------------------------------------------------------------- /TAPKeyboardPopExample/Podfile: -------------------------------------------------------------------------------- 1 | 2 | target "TAPKeyboardPopExample" do 3 | pod "TAPKeyboardPop", :path => "../" 4 | end 5 | -------------------------------------------------------------------------------- /TAPKeyboardPopExample/Podfile.lock: -------------------------------------------------------------------------------- 1 | PODS: 2 | - TAPKeyboardPop (0.1.1) 3 | 4 | DEPENDENCIES: 5 | - TAPKeyboardPop (from `../`) 6 | 7 | EXTERNAL SOURCES: 8 | TAPKeyboardPop: 9 | :path: ../ 10 | 11 | SPEC CHECKSUMS: 12 | TAPKeyboardPop: f700411e02ea5a0d01fec416bc5aa9ef7b73bbb4 13 | 14 | COCOAPODS: 0.32.1 15 | -------------------------------------------------------------------------------- /TAPKeyboardPopExample/TAPKeyboardPopExample.xcodeproj/project.pbxproj: -------------------------------------------------------------------------------- 1 | // !$*UTF8*$! 2 | { 3 | archiveVersion = 1; 4 | classes = { 5 | }; 6 | objectVersion = 46; 7 | objects = { 8 | 9 | /* Begin PBXBuildFile section */ 10 | D5AC5F96189EE87000AF551F /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = D5AC5F95189EE87000AF551F /* Foundation.framework */; }; 11 | D5AC5F98189EE87000AF551F /* CoreGraphics.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = D5AC5F97189EE87000AF551F /* CoreGraphics.framework */; }; 12 | D5AC5F9A189EE87000AF551F /* UIKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = D5AC5F99189EE87000AF551F /* UIKit.framework */; }; 13 | D5AC5FA0189EE87000AF551F /* InfoPlist.strings in Resources */ = {isa = PBXBuildFile; fileRef = D5AC5F9E189EE87000AF551F /* InfoPlist.strings */; }; 14 | D5AC5FA2189EE87000AF551F /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = D5AC5FA1189EE87000AF551F /* main.m */; }; 15 | D5AC5FA6189EE87000AF551F /* TAPAppDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = D5AC5FA5189EE87000AF551F /* TAPAppDelegate.m */; }; 16 | D5AC5FA8189EE87000AF551F /* Images.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = D5AC5FA7189EE87000AF551F /* Images.xcassets */; }; 17 | D5AC5FAF189EE87000AF551F /* XCTest.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = D5AC5FAE189EE87000AF551F /* XCTest.framework */; }; 18 | D5AC5FB0189EE87000AF551F /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = D5AC5F95189EE87000AF551F /* Foundation.framework */; }; 19 | D5AC5FB1189EE87000AF551F /* UIKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = D5AC5F99189EE87000AF551F /* UIKit.framework */; }; 20 | D5AC5FC7189EE9BF00AF551F /* TAPRootViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = D5AC5FC5189EE9BF00AF551F /* TAPRootViewController.m */; }; 21 | D5AC5FC8189EE9BF00AF551F /* TAPRootViewController.xib in Resources */ = {isa = PBXBuildFile; fileRef = D5AC5FC6189EE9BF00AF551F /* TAPRootViewController.xib */; }; 22 | D5AC5FCC189EEC1300AF551F /* TAPTextFieldViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = D5AC5FCA189EEC1300AF551F /* TAPTextFieldViewController.m */; }; 23 | D5AC5FCD189EEC1300AF551F /* TAPTextFieldViewController.xib in Resources */ = {isa = PBXBuildFile; fileRef = D5AC5FCB189EEC1300AF551F /* TAPTextFieldViewController.xib */; }; 24 | E82755E019098ABE00DFE8F6 /* TAPTextViewViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = E82755DE19098ABE00DFE8F6 /* TAPTextViewViewController.m */; }; 25 | E82755E119098ABE00DFE8F6 /* TAPTextViewViewController.xib in Resources */ = {isa = PBXBuildFile; fileRef = E82755DF19098ABE00DFE8F6 /* TAPTextViewViewController.xib */; }; 26 | FA21134B472346ACAF81A0CC /* libPods-TAPKeyboardPopExample.a in Frameworks */ = {isa = PBXBuildFile; fileRef = A964E8B0676148A78736C3C3 /* libPods-TAPKeyboardPopExample.a */; }; 27 | /* End PBXBuildFile section */ 28 | 29 | /* Begin PBXContainerItemProxy section */ 30 | D5AC5FB2189EE87000AF551F /* PBXContainerItemProxy */ = { 31 | isa = PBXContainerItemProxy; 32 | containerPortal = D5AC5F8A189EE87000AF551F /* Project object */; 33 | proxyType = 1; 34 | remoteGlobalIDString = D5AC5F91189EE87000AF551F; 35 | remoteInfo = TAPKeyboardPopExample; 36 | }; 37 | /* End PBXContainerItemProxy section */ 38 | 39 | /* Begin PBXFileReference section */ 40 | 192354C0E26D44D1BC3DC155 /* Pods-TAPKeyboardPopExample.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-TAPKeyboardPopExample.xcconfig"; path = "Pods/Pods-TAPKeyboardPopExample.xcconfig"; sourceTree = ""; }; 41 | A964E8B0676148A78736C3C3 /* libPods-TAPKeyboardPopExample.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = "libPods-TAPKeyboardPopExample.a"; sourceTree = BUILT_PRODUCTS_DIR; }; 42 | D5AC5F92189EE87000AF551F /* TAPKeyboardPopExample.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = TAPKeyboardPopExample.app; sourceTree = BUILT_PRODUCTS_DIR; }; 43 | D5AC5F95189EE87000AF551F /* Foundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Foundation.framework; path = System/Library/Frameworks/Foundation.framework; sourceTree = SDKROOT; }; 44 | D5AC5F97189EE87000AF551F /* CoreGraphics.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreGraphics.framework; path = System/Library/Frameworks/CoreGraphics.framework; sourceTree = SDKROOT; }; 45 | D5AC5F99189EE87000AF551F /* UIKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = UIKit.framework; path = System/Library/Frameworks/UIKit.framework; sourceTree = SDKROOT; }; 46 | D5AC5F9D189EE87000AF551F /* TAPKeyboardPopExample-Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = "TAPKeyboardPopExample-Info.plist"; sourceTree = ""; }; 47 | D5AC5F9F189EE87000AF551F /* en */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = en; path = en.lproj/InfoPlist.strings; sourceTree = ""; }; 48 | D5AC5FA1189EE87000AF551F /* main.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = main.m; sourceTree = ""; }; 49 | D5AC5FA3189EE87000AF551F /* TAPKeyboardPopExample-Prefix.pch */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "TAPKeyboardPopExample-Prefix.pch"; sourceTree = ""; }; 50 | D5AC5FA4189EE87000AF551F /* TAPAppDelegate.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = TAPAppDelegate.h; sourceTree = ""; }; 51 | D5AC5FA5189EE87000AF551F /* TAPAppDelegate.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = TAPAppDelegate.m; sourceTree = ""; }; 52 | D5AC5FA7189EE87000AF551F /* Images.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Images.xcassets; sourceTree = ""; }; 53 | D5AC5FAD189EE87000AF551F /* TAPKeyboardPopExampleTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = TAPKeyboardPopExampleTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; 54 | D5AC5FAE189EE87000AF551F /* XCTest.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = XCTest.framework; path = Library/Frameworks/XCTest.framework; sourceTree = DEVELOPER_DIR; }; 55 | D5AC5FC4189EE9BF00AF551F /* TAPRootViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = TAPRootViewController.h; sourceTree = ""; }; 56 | D5AC5FC5189EE9BF00AF551F /* TAPRootViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = TAPRootViewController.m; sourceTree = ""; }; 57 | D5AC5FC6189EE9BF00AF551F /* TAPRootViewController.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = TAPRootViewController.xib; sourceTree = ""; }; 58 | D5AC5FC9189EEC1300AF551F /* TAPTextFieldViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = TAPTextFieldViewController.h; sourceTree = ""; }; 59 | D5AC5FCA189EEC1300AF551F /* TAPTextFieldViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = TAPTextFieldViewController.m; sourceTree = ""; }; 60 | D5AC5FCB189EEC1300AF551F /* TAPTextFieldViewController.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = TAPTextFieldViewController.xib; sourceTree = ""; }; 61 | E82755DD19098ABE00DFE8F6 /* TAPTextViewViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = TAPTextViewViewController.h; sourceTree = ""; }; 62 | E82755DE19098ABE00DFE8F6 /* TAPTextViewViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = TAPTextViewViewController.m; sourceTree = ""; }; 63 | E82755DF19098ABE00DFE8F6 /* TAPTextViewViewController.xib */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = file.xib; path = TAPTextViewViewController.xib; sourceTree = ""; }; 64 | /* End PBXFileReference section */ 65 | 66 | /* Begin PBXFrameworksBuildPhase section */ 67 | D5AC5F8F189EE87000AF551F /* Frameworks */ = { 68 | isa = PBXFrameworksBuildPhase; 69 | buildActionMask = 2147483647; 70 | files = ( 71 | D5AC5F98189EE87000AF551F /* CoreGraphics.framework in Frameworks */, 72 | D5AC5F9A189EE87000AF551F /* UIKit.framework in Frameworks */, 73 | D5AC5F96189EE87000AF551F /* Foundation.framework in Frameworks */, 74 | FA21134B472346ACAF81A0CC /* libPods-TAPKeyboardPopExample.a in Frameworks */, 75 | ); 76 | runOnlyForDeploymentPostprocessing = 0; 77 | }; 78 | D5AC5FAA189EE87000AF551F /* Frameworks */ = { 79 | isa = PBXFrameworksBuildPhase; 80 | buildActionMask = 2147483647; 81 | files = ( 82 | D5AC5FAF189EE87000AF551F /* XCTest.framework in Frameworks */, 83 | D5AC5FB1189EE87000AF551F /* UIKit.framework in Frameworks */, 84 | D5AC5FB0189EE87000AF551F /* Foundation.framework in Frameworks */, 85 | ); 86 | runOnlyForDeploymentPostprocessing = 0; 87 | }; 88 | /* End PBXFrameworksBuildPhase section */ 89 | 90 | /* Begin PBXGroup section */ 91 | D5AC5F89189EE87000AF551F = { 92 | isa = PBXGroup; 93 | children = ( 94 | D5AC5F9B189EE87000AF551F /* TAPKeyboardPopExample */, 95 | D5AC5F94189EE87000AF551F /* Frameworks */, 96 | D5AC5F93189EE87000AF551F /* Products */, 97 | 192354C0E26D44D1BC3DC155 /* Pods-TAPKeyboardPopExample.xcconfig */, 98 | ); 99 | sourceTree = ""; 100 | }; 101 | D5AC5F93189EE87000AF551F /* Products */ = { 102 | isa = PBXGroup; 103 | children = ( 104 | D5AC5F92189EE87000AF551F /* TAPKeyboardPopExample.app */, 105 | D5AC5FAD189EE87000AF551F /* TAPKeyboardPopExampleTests.xctest */, 106 | ); 107 | name = Products; 108 | sourceTree = ""; 109 | }; 110 | D5AC5F94189EE87000AF551F /* Frameworks */ = { 111 | isa = PBXGroup; 112 | children = ( 113 | D5AC5F95189EE87000AF551F /* Foundation.framework */, 114 | D5AC5F97189EE87000AF551F /* CoreGraphics.framework */, 115 | D5AC5F99189EE87000AF551F /* UIKit.framework */, 116 | D5AC5FAE189EE87000AF551F /* XCTest.framework */, 117 | A964E8B0676148A78736C3C3 /* libPods-TAPKeyboardPopExample.a */, 118 | ); 119 | name = Frameworks; 120 | sourceTree = ""; 121 | }; 122 | D5AC5F9B189EE87000AF551F /* TAPKeyboardPopExample */ = { 123 | isa = PBXGroup; 124 | children = ( 125 | D5AC5FA4189EE87000AF551F /* TAPAppDelegate.h */, 126 | D5AC5FA5189EE87000AF551F /* TAPAppDelegate.m */, 127 | D5AC5FC9189EEC1300AF551F /* TAPTextFieldViewController.h */, 128 | D5AC5FCA189EEC1300AF551F /* TAPTextFieldViewController.m */, 129 | D5AC5FCB189EEC1300AF551F /* TAPTextFieldViewController.xib */, 130 | E82755DD19098ABE00DFE8F6 /* TAPTextViewViewController.h */, 131 | E82755DE19098ABE00DFE8F6 /* TAPTextViewViewController.m */, 132 | E82755DF19098ABE00DFE8F6 /* TAPTextViewViewController.xib */, 133 | D5AC5FC4189EE9BF00AF551F /* TAPRootViewController.h */, 134 | D5AC5FC5189EE9BF00AF551F /* TAPRootViewController.m */, 135 | D5AC5FC6189EE9BF00AF551F /* TAPRootViewController.xib */, 136 | D5AC5FA7189EE87000AF551F /* Images.xcassets */, 137 | D5AC5F9C189EE87000AF551F /* Supporting Files */, 138 | ); 139 | path = TAPKeyboardPopExample; 140 | sourceTree = ""; 141 | }; 142 | D5AC5F9C189EE87000AF551F /* Supporting Files */ = { 143 | isa = PBXGroup; 144 | children = ( 145 | D5AC5F9D189EE87000AF551F /* TAPKeyboardPopExample-Info.plist */, 146 | D5AC5F9E189EE87000AF551F /* InfoPlist.strings */, 147 | D5AC5FA1189EE87000AF551F /* main.m */, 148 | D5AC5FA3189EE87000AF551F /* TAPKeyboardPopExample-Prefix.pch */, 149 | ); 150 | name = "Supporting Files"; 151 | sourceTree = ""; 152 | }; 153 | /* End PBXGroup section */ 154 | 155 | /* Begin PBXNativeTarget section */ 156 | D5AC5F91189EE87000AF551F /* TAPKeyboardPopExample */ = { 157 | isa = PBXNativeTarget; 158 | buildConfigurationList = D5AC5FBE189EE87000AF551F /* Build configuration list for PBXNativeTarget "TAPKeyboardPopExample" */; 159 | buildPhases = ( 160 | 31EBD48E81C04FA98ADB9AA3 /* Check Pods Manifest.lock */, 161 | D5AC5F8E189EE87000AF551F /* Sources */, 162 | D5AC5F8F189EE87000AF551F /* Frameworks */, 163 | D5AC5F90189EE87000AF551F /* Resources */, 164 | 67A21B93A2024D0C908DE104 /* Copy Pods Resources */, 165 | ); 166 | buildRules = ( 167 | ); 168 | dependencies = ( 169 | ); 170 | name = TAPKeyboardPopExample; 171 | productName = TAPKeyboardPopExample; 172 | productReference = D5AC5F92189EE87000AF551F /* TAPKeyboardPopExample.app */; 173 | productType = "com.apple.product-type.application"; 174 | }; 175 | D5AC5FAC189EE87000AF551F /* TAPKeyboardPopExampleTests */ = { 176 | isa = PBXNativeTarget; 177 | buildConfigurationList = D5AC5FC1189EE87000AF551F /* Build configuration list for PBXNativeTarget "TAPKeyboardPopExampleTests" */; 178 | buildPhases = ( 179 | D5AC5FA9189EE87000AF551F /* Sources */, 180 | D5AC5FAA189EE87000AF551F /* Frameworks */, 181 | D5AC5FAB189EE87000AF551F /* Resources */, 182 | ); 183 | buildRules = ( 184 | ); 185 | dependencies = ( 186 | D5AC5FB3189EE87000AF551F /* PBXTargetDependency */, 187 | ); 188 | name = TAPKeyboardPopExampleTests; 189 | productName = TAPKeyboardPopExampleTests; 190 | productReference = D5AC5FAD189EE87000AF551F /* TAPKeyboardPopExampleTests.xctest */; 191 | productType = "com.apple.product-type.bundle.unit-test"; 192 | }; 193 | /* End PBXNativeTarget section */ 194 | 195 | /* Begin PBXProject section */ 196 | D5AC5F8A189EE87000AF551F /* Project object */ = { 197 | isa = PBXProject; 198 | attributes = { 199 | CLASSPREFIX = TAP; 200 | LastUpgradeCheck = 0500; 201 | ORGANIZATIONNAME = Cotap; 202 | TargetAttributes = { 203 | D5AC5FAC189EE87000AF551F = { 204 | TestTargetID = D5AC5F91189EE87000AF551F; 205 | }; 206 | }; 207 | }; 208 | buildConfigurationList = D5AC5F8D189EE87000AF551F /* Build configuration list for PBXProject "TAPKeyboardPopExample" */; 209 | compatibilityVersion = "Xcode 3.2"; 210 | developmentRegion = English; 211 | hasScannedForEncodings = 0; 212 | knownRegions = ( 213 | en, 214 | ); 215 | mainGroup = D5AC5F89189EE87000AF551F; 216 | productRefGroup = D5AC5F93189EE87000AF551F /* Products */; 217 | projectDirPath = ""; 218 | projectRoot = ""; 219 | targets = ( 220 | D5AC5F91189EE87000AF551F /* TAPKeyboardPopExample */, 221 | D5AC5FAC189EE87000AF551F /* TAPKeyboardPopExampleTests */, 222 | ); 223 | }; 224 | /* End PBXProject section */ 225 | 226 | /* Begin PBXResourcesBuildPhase section */ 227 | D5AC5F90189EE87000AF551F /* Resources */ = { 228 | isa = PBXResourcesBuildPhase; 229 | buildActionMask = 2147483647; 230 | files = ( 231 | D5AC5FCD189EEC1300AF551F /* TAPTextFieldViewController.xib in Resources */, 232 | E82755E119098ABE00DFE8F6 /* TAPTextViewViewController.xib in Resources */, 233 | D5AC5FC8189EE9BF00AF551F /* TAPRootViewController.xib in Resources */, 234 | D5AC5FA0189EE87000AF551F /* InfoPlist.strings in Resources */, 235 | D5AC5FA8189EE87000AF551F /* Images.xcassets in Resources */, 236 | ); 237 | runOnlyForDeploymentPostprocessing = 0; 238 | }; 239 | D5AC5FAB189EE87000AF551F /* Resources */ = { 240 | isa = PBXResourcesBuildPhase; 241 | buildActionMask = 2147483647; 242 | files = ( 243 | ); 244 | runOnlyForDeploymentPostprocessing = 0; 245 | }; 246 | /* End PBXResourcesBuildPhase section */ 247 | 248 | /* Begin PBXShellScriptBuildPhase section */ 249 | 31EBD48E81C04FA98ADB9AA3 /* Check Pods Manifest.lock */ = { 250 | isa = PBXShellScriptBuildPhase; 251 | buildActionMask = 2147483647; 252 | files = ( 253 | ); 254 | inputPaths = ( 255 | ); 256 | name = "Check Pods Manifest.lock"; 257 | outputPaths = ( 258 | ); 259 | runOnlyForDeploymentPostprocessing = 0; 260 | shellPath = /bin/sh; 261 | shellScript = "diff \"${PODS_ROOT}/../Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [[ $? != 0 ]] ; then\n cat << EOM\nerror: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\nEOM\n exit 1\nfi\n"; 262 | showEnvVarsInLog = 0; 263 | }; 264 | 67A21B93A2024D0C908DE104 /* Copy Pods Resources */ = { 265 | isa = PBXShellScriptBuildPhase; 266 | buildActionMask = 2147483647; 267 | files = ( 268 | ); 269 | inputPaths = ( 270 | ); 271 | name = "Copy Pods Resources"; 272 | outputPaths = ( 273 | ); 274 | runOnlyForDeploymentPostprocessing = 0; 275 | shellPath = /bin/sh; 276 | shellScript = "\"${SRCROOT}/Pods/Pods-TAPKeyboardPopExample-resources.sh\"\n"; 277 | showEnvVarsInLog = 0; 278 | }; 279 | /* End PBXShellScriptBuildPhase section */ 280 | 281 | /* Begin PBXSourcesBuildPhase section */ 282 | D5AC5F8E189EE87000AF551F /* Sources */ = { 283 | isa = PBXSourcesBuildPhase; 284 | buildActionMask = 2147483647; 285 | files = ( 286 | D5AC5FCC189EEC1300AF551F /* TAPTextFieldViewController.m in Sources */, 287 | D5AC5FC7189EE9BF00AF551F /* TAPRootViewController.m in Sources */, 288 | D5AC5FA2189EE87000AF551F /* main.m in Sources */, 289 | D5AC5FA6189EE87000AF551F /* TAPAppDelegate.m in Sources */, 290 | E82755E019098ABE00DFE8F6 /* TAPTextViewViewController.m in Sources */, 291 | ); 292 | runOnlyForDeploymentPostprocessing = 0; 293 | }; 294 | D5AC5FA9189EE87000AF551F /* Sources */ = { 295 | isa = PBXSourcesBuildPhase; 296 | buildActionMask = 2147483647; 297 | files = ( 298 | ); 299 | runOnlyForDeploymentPostprocessing = 0; 300 | }; 301 | /* End PBXSourcesBuildPhase section */ 302 | 303 | /* Begin PBXTargetDependency section */ 304 | D5AC5FB3189EE87000AF551F /* PBXTargetDependency */ = { 305 | isa = PBXTargetDependency; 306 | target = D5AC5F91189EE87000AF551F /* TAPKeyboardPopExample */; 307 | targetProxy = D5AC5FB2189EE87000AF551F /* PBXContainerItemProxy */; 308 | }; 309 | /* End PBXTargetDependency section */ 310 | 311 | /* Begin PBXVariantGroup section */ 312 | D5AC5F9E189EE87000AF551F /* InfoPlist.strings */ = { 313 | isa = PBXVariantGroup; 314 | children = ( 315 | D5AC5F9F189EE87000AF551F /* en */, 316 | ); 317 | name = InfoPlist.strings; 318 | sourceTree = ""; 319 | }; 320 | /* End PBXVariantGroup section */ 321 | 322 | /* Begin XCBuildConfiguration section */ 323 | D5AC5FBC189EE87000AF551F /* Debug */ = { 324 | isa = XCBuildConfiguration; 325 | buildSettings = { 326 | ALWAYS_SEARCH_USER_PATHS = NO; 327 | ARCHS = "$(ARCHS_STANDARD_INCLUDING_64_BIT)"; 328 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; 329 | CLANG_CXX_LIBRARY = "libc++"; 330 | CLANG_ENABLE_MODULES = YES; 331 | CLANG_ENABLE_OBJC_ARC = YES; 332 | CLANG_WARN_BOOL_CONVERSION = YES; 333 | CLANG_WARN_CONSTANT_CONVERSION = YES; 334 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; 335 | CLANG_WARN_EMPTY_BODY = YES; 336 | CLANG_WARN_ENUM_CONVERSION = YES; 337 | CLANG_WARN_INT_CONVERSION = YES; 338 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; 339 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; 340 | "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; 341 | COPY_PHASE_STRIP = NO; 342 | GCC_C_LANGUAGE_STANDARD = gnu99; 343 | GCC_DYNAMIC_NO_PIC = NO; 344 | GCC_OPTIMIZATION_LEVEL = 0; 345 | GCC_PREPROCESSOR_DEFINITIONS = ( 346 | "DEBUG=1", 347 | "$(inherited)", 348 | ); 349 | GCC_SYMBOLS_PRIVATE_EXTERN = NO; 350 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES; 351 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; 352 | GCC_WARN_UNDECLARED_SELECTOR = YES; 353 | GCC_WARN_UNINITIALIZED_AUTOS = YES; 354 | GCC_WARN_UNUSED_FUNCTION = YES; 355 | GCC_WARN_UNUSED_VARIABLE = YES; 356 | IPHONEOS_DEPLOYMENT_TARGET = 7.0; 357 | ONLY_ACTIVE_ARCH = YES; 358 | SDKROOT = iphoneos; 359 | }; 360 | name = Debug; 361 | }; 362 | D5AC5FBD189EE87000AF551F /* Release */ = { 363 | isa = XCBuildConfiguration; 364 | buildSettings = { 365 | ALWAYS_SEARCH_USER_PATHS = NO; 366 | ARCHS = "$(ARCHS_STANDARD_INCLUDING_64_BIT)"; 367 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; 368 | CLANG_CXX_LIBRARY = "libc++"; 369 | CLANG_ENABLE_MODULES = YES; 370 | CLANG_ENABLE_OBJC_ARC = YES; 371 | CLANG_WARN_BOOL_CONVERSION = YES; 372 | CLANG_WARN_CONSTANT_CONVERSION = YES; 373 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; 374 | CLANG_WARN_EMPTY_BODY = YES; 375 | CLANG_WARN_ENUM_CONVERSION = YES; 376 | CLANG_WARN_INT_CONVERSION = YES; 377 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; 378 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; 379 | "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; 380 | COPY_PHASE_STRIP = YES; 381 | ENABLE_NS_ASSERTIONS = NO; 382 | GCC_C_LANGUAGE_STANDARD = gnu99; 383 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES; 384 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; 385 | GCC_WARN_UNDECLARED_SELECTOR = YES; 386 | GCC_WARN_UNINITIALIZED_AUTOS = YES; 387 | GCC_WARN_UNUSED_FUNCTION = YES; 388 | GCC_WARN_UNUSED_VARIABLE = YES; 389 | IPHONEOS_DEPLOYMENT_TARGET = 7.0; 390 | SDKROOT = iphoneos; 391 | VALIDATE_PRODUCT = YES; 392 | }; 393 | name = Release; 394 | }; 395 | D5AC5FBF189EE87000AF551F /* Debug */ = { 396 | isa = XCBuildConfiguration; 397 | baseConfigurationReference = 192354C0E26D44D1BC3DC155 /* Pods-TAPKeyboardPopExample.xcconfig */; 398 | buildSettings = { 399 | ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; 400 | ASSETCATALOG_COMPILER_LAUNCHIMAGE_NAME = LaunchImage; 401 | GCC_PRECOMPILE_PREFIX_HEADER = YES; 402 | GCC_PREFIX_HEADER = "TAPKeyboardPopExample/TAPKeyboardPopExample-Prefix.pch"; 403 | INFOPLIST_FILE = "TAPKeyboardPopExample/TAPKeyboardPopExample-Info.plist"; 404 | IPHONEOS_DEPLOYMENT_TARGET = 6.0; 405 | PRODUCT_NAME = "$(TARGET_NAME)"; 406 | WRAPPER_EXTENSION = app; 407 | }; 408 | name = Debug; 409 | }; 410 | D5AC5FC0189EE87000AF551F /* Release */ = { 411 | isa = XCBuildConfiguration; 412 | baseConfigurationReference = 192354C0E26D44D1BC3DC155 /* Pods-TAPKeyboardPopExample.xcconfig */; 413 | buildSettings = { 414 | ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; 415 | ASSETCATALOG_COMPILER_LAUNCHIMAGE_NAME = LaunchImage; 416 | GCC_PRECOMPILE_PREFIX_HEADER = YES; 417 | GCC_PREFIX_HEADER = "TAPKeyboardPopExample/TAPKeyboardPopExample-Prefix.pch"; 418 | INFOPLIST_FILE = "TAPKeyboardPopExample/TAPKeyboardPopExample-Info.plist"; 419 | IPHONEOS_DEPLOYMENT_TARGET = 6.0; 420 | PRODUCT_NAME = "$(TARGET_NAME)"; 421 | WRAPPER_EXTENSION = app; 422 | }; 423 | name = Release; 424 | }; 425 | D5AC5FC2189EE87000AF551F /* Debug */ = { 426 | isa = XCBuildConfiguration; 427 | buildSettings = { 428 | ARCHS = "$(ARCHS_STANDARD_INCLUDING_64_BIT)"; 429 | BUNDLE_LOADER = "$(BUILT_PRODUCTS_DIR)/TAPKeyboardPopExample.app/TAPKeyboardPopExample"; 430 | FRAMEWORK_SEARCH_PATHS = ( 431 | "$(SDKROOT)/Developer/Library/Frameworks", 432 | "$(inherited)", 433 | "$(DEVELOPER_FRAMEWORKS_DIR)", 434 | ); 435 | GCC_PRECOMPILE_PREFIX_HEADER = YES; 436 | GCC_PREFIX_HEADER = "TAPKeyboardPopExample/TAPKeyboardPopExample-Prefix.pch"; 437 | GCC_PREPROCESSOR_DEFINITIONS = ( 438 | "DEBUG=1", 439 | "$(inherited)", 440 | ); 441 | INFOPLIST_FILE = "TAPKeyboardPopExampleTests/TAPKeyboardPopExampleTests-Info.plist"; 442 | PRODUCT_NAME = "$(TARGET_NAME)"; 443 | TEST_HOST = "$(BUNDLE_LOADER)"; 444 | WRAPPER_EXTENSION = xctest; 445 | }; 446 | name = Debug; 447 | }; 448 | D5AC5FC3189EE87000AF551F /* Release */ = { 449 | isa = XCBuildConfiguration; 450 | buildSettings = { 451 | ARCHS = "$(ARCHS_STANDARD_INCLUDING_64_BIT)"; 452 | BUNDLE_LOADER = "$(BUILT_PRODUCTS_DIR)/TAPKeyboardPopExample.app/TAPKeyboardPopExample"; 453 | FRAMEWORK_SEARCH_PATHS = ( 454 | "$(SDKROOT)/Developer/Library/Frameworks", 455 | "$(inherited)", 456 | "$(DEVELOPER_FRAMEWORKS_DIR)", 457 | ); 458 | GCC_PRECOMPILE_PREFIX_HEADER = YES; 459 | GCC_PREFIX_HEADER = "TAPKeyboardPopExample/TAPKeyboardPopExample-Prefix.pch"; 460 | INFOPLIST_FILE = "TAPKeyboardPopExampleTests/TAPKeyboardPopExampleTests-Info.plist"; 461 | PRODUCT_NAME = "$(TARGET_NAME)"; 462 | TEST_HOST = "$(BUNDLE_LOADER)"; 463 | WRAPPER_EXTENSION = xctest; 464 | }; 465 | name = Release; 466 | }; 467 | /* End XCBuildConfiguration section */ 468 | 469 | /* Begin XCConfigurationList section */ 470 | D5AC5F8D189EE87000AF551F /* Build configuration list for PBXProject "TAPKeyboardPopExample" */ = { 471 | isa = XCConfigurationList; 472 | buildConfigurations = ( 473 | D5AC5FBC189EE87000AF551F /* Debug */, 474 | D5AC5FBD189EE87000AF551F /* Release */, 475 | ); 476 | defaultConfigurationIsVisible = 0; 477 | defaultConfigurationName = Release; 478 | }; 479 | D5AC5FBE189EE87000AF551F /* Build configuration list for PBXNativeTarget "TAPKeyboardPopExample" */ = { 480 | isa = XCConfigurationList; 481 | buildConfigurations = ( 482 | D5AC5FBF189EE87000AF551F /* Debug */, 483 | D5AC5FC0189EE87000AF551F /* Release */, 484 | ); 485 | defaultConfigurationIsVisible = 0; 486 | defaultConfigurationName = Release; 487 | }; 488 | D5AC5FC1189EE87000AF551F /* Build configuration list for PBXNativeTarget "TAPKeyboardPopExampleTests" */ = { 489 | isa = XCConfigurationList; 490 | buildConfigurations = ( 491 | D5AC5FC2189EE87000AF551F /* Debug */, 492 | D5AC5FC3189EE87000AF551F /* Release */, 493 | ); 494 | defaultConfigurationIsVisible = 0; 495 | defaultConfigurationName = Release; 496 | }; 497 | /* End XCConfigurationList section */ 498 | }; 499 | rootObject = D5AC5F8A189EE87000AF551F /* Project object */; 500 | } 501 | -------------------------------------------------------------------------------- /TAPKeyboardPopExample/TAPKeyboardPopExample/Images.xcassets/AppIcon.appiconset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "iphone", 5 | "size" : "29x29", 6 | "scale" : "2x" 7 | }, 8 | { 9 | "idiom" : "iphone", 10 | "size" : "40x40", 11 | "scale" : "2x" 12 | }, 13 | { 14 | "idiom" : "iphone", 15 | "size" : "60x60", 16 | "scale" : "2x" 17 | } 18 | ], 19 | "info" : { 20 | "version" : 1, 21 | "author" : "xcode" 22 | } 23 | } -------------------------------------------------------------------------------- /TAPKeyboardPopExample/TAPKeyboardPopExample/Images.xcassets/LaunchImage.launchimage/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "orientation" : "portrait", 5 | "idiom" : "iphone", 6 | "extent" : "full-screen", 7 | "minimum-system-version" : "7.0", 8 | "scale" : "2x" 9 | }, 10 | { 11 | "orientation" : "portrait", 12 | "idiom" : "iphone", 13 | "subtype" : "retina4", 14 | "extent" : "full-screen", 15 | "minimum-system-version" : "7.0", 16 | "scale" : "2x" 17 | } 18 | ], 19 | "info" : { 20 | "version" : 1, 21 | "author" : "xcode" 22 | } 23 | } -------------------------------------------------------------------------------- /TAPKeyboardPopExample/TAPKeyboardPopExample/TAPAppDelegate.h: -------------------------------------------------------------------------------- 1 | #import 2 | 3 | @interface TAPAppDelegate : UIResponder 4 | 5 | @property (strong, nonatomic) UIWindow *window; 6 | 7 | @end 8 | -------------------------------------------------------------------------------- /TAPKeyboardPopExample/TAPKeyboardPopExample/TAPAppDelegate.m: -------------------------------------------------------------------------------- 1 | #import "TAPAppDelegate.h" 2 | #import "TAPRootViewController.h" 3 | 4 | @implementation TAPAppDelegate 5 | 6 | - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions 7 | { 8 | self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]]; 9 | self.window.backgroundColor = [UIColor whiteColor]; 10 | [self.window makeKeyAndVisible]; 11 | 12 | TAPRootViewController *rootViewController = [TAPRootViewController new]; 13 | UINavigationController *navigationController = [[UINavigationController alloc] initWithRootViewController:rootViewController]; 14 | rootViewController.navigationItem.title = @"Keyboard Dismiss Base View"; 15 | 16 | [self.window setRootViewController:navigationController]; 17 | return YES; 18 | } 19 | 20 | - (void)applicationWillResignActive:(UIApplication *)application 21 | { 22 | // Sent when the application is about to move from active to inactive state. This can occur for certain types of temporary interruptions (such as an incoming phone call or SMS message) or when the user quits the application and it begins the transition to the background state. 23 | // Use this method to pause ongoing tasks, disable timers, and throttle down OpenGL ES frame rates. Games should use this method to pause the game. 24 | } 25 | 26 | - (void)applicationDidEnterBackground:(UIApplication *)application 27 | { 28 | // Use this method to release shared resources, save user data, invalidate timers, and store enough application state information to restore your application to its current state in case it is terminated later. 29 | // If your application supports background execution, this method is called instead of applicationWillTerminate: when the user quits. 30 | } 31 | 32 | - (void)applicationWillEnterForeground:(UIApplication *)application 33 | { 34 | // Called as part of the transition from the background to the inactive state; here you can undo many of the changes made on entering the background. 35 | } 36 | 37 | - (void)applicationDidBecomeActive:(UIApplication *)application 38 | { 39 | // Restart any tasks that were paused (or not yet started) while the application was inactive. If the application was previously in the background, optionally refresh the user interface. 40 | } 41 | 42 | - (void)applicationWillTerminate:(UIApplication *)application 43 | { 44 | // Called when the application is about to terminate. Save data if appropriate. See also applicationDidEnterBackground:. 45 | } 46 | 47 | @end 48 | -------------------------------------------------------------------------------- /TAPKeyboardPopExample/TAPKeyboardPopExample/TAPKeyboardPopExample-Info.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | CFBundleDevelopmentRegion 6 | en 7 | CFBundleDisplayName 8 | ${PRODUCT_NAME} 9 | CFBundleExecutable 10 | ${EXECUTABLE_NAME} 11 | CFBundleIdentifier 12 | com.cotap.${PRODUCT_NAME:rfc1034identifier} 13 | CFBundleInfoDictionaryVersion 14 | 6.0 15 | CFBundleName 16 | ${PRODUCT_NAME} 17 | CFBundlePackageType 18 | APPL 19 | CFBundleShortVersionString 20 | 1.0 21 | CFBundleSignature 22 | ???? 23 | CFBundleVersion 24 | 1.0 25 | LSRequiresIPhoneOS 26 | 27 | UIRequiredDeviceCapabilities 28 | 29 | armv7 30 | 31 | UISupportedInterfaceOrientations 32 | 33 | UIInterfaceOrientationPortrait 34 | UIInterfaceOrientationLandscapeLeft 35 | UIInterfaceOrientationLandscapeRight 36 | 37 | 38 | 39 | -------------------------------------------------------------------------------- /TAPKeyboardPopExample/TAPKeyboardPopExample/TAPKeyboardPopExample-Prefix.pch: -------------------------------------------------------------------------------- 1 | // 2 | // Prefix header 3 | // 4 | // The contents of this file are implicitly included at the beginning of every source file. 5 | // 6 | 7 | #import 8 | 9 | #ifndef __IPHONE_3_0 10 | #warning "This project uses features only available in iOS SDK 3.0 and later." 11 | #endif 12 | 13 | #ifdef __OBJC__ 14 | #import 15 | #import 16 | #endif 17 | -------------------------------------------------------------------------------- /TAPKeyboardPopExample/TAPKeyboardPopExample/TAPRootViewController.h: -------------------------------------------------------------------------------- 1 | #import 2 | 3 | @interface TAPRootViewController : UIViewController 4 | - (IBAction)tappedTextFieldButton:(id)sender; 5 | - (IBAction)tappedTextViewButton:(id)sender; 6 | @end 7 | -------------------------------------------------------------------------------- /TAPKeyboardPopExample/TAPKeyboardPopExample/TAPRootViewController.m: -------------------------------------------------------------------------------- 1 | #import "TAPRootViewController.h" 2 | #import "TAPTextFieldViewController.h" 3 | #import "TAPTextViewViewController.h" 4 | 5 | @interface TAPRootViewController () 6 | 7 | @end 8 | 9 | @implementation TAPRootViewController 10 | 11 | - (IBAction)tappedTextFieldButton:(id)sender 12 | { 13 | TAPTextFieldViewController *vc = [[TAPTextFieldViewController alloc] initWithNibName:@"TAPTextFieldViewController" bundle:nil]; 14 | vc.title = @"View with UITextField"; 15 | [self.navigationController pushViewController:vc animated:YES]; 16 | } 17 | 18 | - (IBAction)tappedTextViewButton:(id)sender 19 | { 20 | TAPTextViewViewController *vc = [[TAPTextViewViewController alloc] initWithNibName:@"TAPTextViewViewController" bundle:nil]; 21 | vc.title = @"View with UITextView"; 22 | [self.navigationController pushViewController:vc animated:YES]; 23 | } 24 | 25 | @end 26 | -------------------------------------------------------------------------------- /TAPKeyboardPopExample/TAPKeyboardPopExample/TAPRootViewController.xib: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 28 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | -------------------------------------------------------------------------------- /TAPKeyboardPopExample/TAPKeyboardPopExample/TAPTextFieldViewController.h: -------------------------------------------------------------------------------- 1 | #import 2 | 3 | @interface TAPTextFieldViewController : UIViewController 4 | 5 | @end 6 | -------------------------------------------------------------------------------- /TAPKeyboardPopExample/TAPKeyboardPopExample/TAPTextFieldViewController.m: -------------------------------------------------------------------------------- 1 | #import "TAPTextFieldViewController.h" 2 | #import "UIViewController+TAPKeyboardPop.h" 3 | 4 | @interface TAPTextFieldViewController () 5 | 6 | @property(nonatomic, retain) IBOutlet UITextField *textField; 7 | 8 | @end 9 | 10 | @implementation TAPTextFieldViewController 11 | 12 | - (IBAction)endEditing:(id)sender 13 | { 14 | [self.view endEditing:YES]; 15 | } 16 | 17 | @end 18 | -------------------------------------------------------------------------------- /TAPKeyboardPopExample/TAPKeyboardPopExample/TAPTextFieldViewController.xib: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 35 | 45 | 46 | 47 | 48 | 49 | 50 | 51 | 52 | -------------------------------------------------------------------------------- /TAPKeyboardPopExample/TAPKeyboardPopExample/TAPTextViewViewController.h: -------------------------------------------------------------------------------- 1 | // 2 | // TAPTextViewViewController.h 3 | // TAPKeyboardPopExample 4 | // 5 | // Created by JP Simard on 4/24/14. 6 | // Copyright (c) 2014 Cotap. All rights reserved. 7 | // 8 | 9 | #import 10 | 11 | @interface TAPTextViewViewController : UIViewController 12 | 13 | @property (nonatomic, strong) IBOutlet UITextView *textView; 14 | 15 | @end 16 | -------------------------------------------------------------------------------- /TAPKeyboardPopExample/TAPKeyboardPopExample/TAPTextViewViewController.m: -------------------------------------------------------------------------------- 1 | // 2 | // TAPTextViewViewController.m 3 | // TAPKeyboardPopExample 4 | // 5 | // Created by JP Simard on 4/24/14. 6 | // Copyright (c) 2014 Cotap. All rights reserved. 7 | // 8 | 9 | #import "TAPTextViewViewController.h" 10 | 11 | @interface TAPTextViewViewController () 12 | 13 | @end 14 | 15 | @implementation TAPTextViewViewController 16 | 17 | - (void)viewDidLoad { 18 | [super viewDidLoad]; 19 | self.navigationItem.rightBarButtonItem = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemDone target:self action:@selector(endEditing:)]; 20 | } 21 | 22 | - (void)viewDidAppear:(BOOL)animated { 23 | [super viewDidAppear:animated]; 24 | [self.textView becomeFirstResponder]; 25 | } 26 | 27 | #pragma mark - Actions 28 | 29 | - (void)endEditing:(id)sender { 30 | [self.textView endEditing:YES]; 31 | } 32 | 33 | @end 34 | -------------------------------------------------------------------------------- /TAPKeyboardPopExample/TAPKeyboardPopExample/TAPTextViewViewController.xib: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | -------------------------------------------------------------------------------- /TAPKeyboardPopExample/TAPKeyboardPopExample/en.lproj/InfoPlist.strings: -------------------------------------------------------------------------------- 1 | /* Localized versions of Info.plist keys */ 2 | 3 | -------------------------------------------------------------------------------- /TAPKeyboardPopExample/TAPKeyboardPopExample/main.m: -------------------------------------------------------------------------------- 1 | #import 2 | 3 | #import "TAPAppDelegate.h" 4 | 5 | int main(int argc, char * argv[]) 6 | { 7 | @autoreleasepool { 8 | return UIApplicationMain(argc, argv, nil, NSStringFromClass([TAPAppDelegate class])); 9 | } 10 | } 11 | --------------------------------------------------------------------------------