├── .gitignore ├── GTKeyboardHelper.framework ├── GTKeyboardHelper ├── Headers ├── Resources └── Versions │ ├── A │ ├── GTKeyboardHelper │ ├── Headers │ │ └── GTKeyboardHelper.h │ └── Resources │ │ ├── Info.plist │ │ └── en.lproj │ │ └── InfoPlist.strings │ └── Current ├── Keyboard Helper Demo.xcodeproj ├── project.pbxproj └── project.xcworkspace │ └── contents.xcworkspacedata ├── Keyboard Helper Demo ├── AppDelegate.h ├── AppDelegate.m ├── Keyboard Helper Demo-Info.plist ├── Keyboard Helper Demo-Prefix.pch ├── ViewController.h ├── ViewController.m ├── en.lproj │ ├── InfoPlist.strings │ ├── ViewController_iPad.xib │ └── ViewController_iPhone.xib └── main.m └── README.markdown /.gitignore: -------------------------------------------------------------------------------- 1 | # taken from http://blog.illuminex.com/2009/10/better-sample-gitignore-file-for-xcode.html 2 | 3 | # Mac OS X Finder and whatnot 4 | .DS_Store 5 | 6 | 7 | # Sparkle distribution Private Key (Don't check me in!) 8 | dsa_priv.pem 9 | 10 | 11 | # XCode (and ancestors) per-user config (very noisy, and not relevant) 12 | *.mode1 13 | *.mode1v3 14 | *.mode2v3 15 | *.perspective 16 | *.perspectivev3 17 | *.pbxuser 18 | 19 | # Xcode 4 http://stackoverflow.com/questions/49478/git-ignore-file-for-xcode-projects 20 | xcuserdata 21 | 22 | 23 | # Generated files 24 | VersionX-revision.h 25 | 26 | 27 | # build products 28 | build/ 29 | *.[oa] 30 | 31 | # Other source repository archive directories (protects when importing) 32 | .hg 33 | .svn 34 | CVS 35 | 36 | 37 | # automatic backup files 38 | *~.nib 39 | *.swp 40 | *~ 41 | *(Autosaved).rtfd/ 42 | Backup[ ]of[ ]*.pages/ 43 | Backup[ ]of[ ]*.key/ 44 | Backup[ ]of[ ]*.numbers/ 45 | 46 | -------------------------------------------------------------------------------- /GTKeyboardHelper.framework/GTKeyboardHelper: -------------------------------------------------------------------------------- 1 | Versions/Current/GTKeyboardHelper -------------------------------------------------------------------------------- /GTKeyboardHelper.framework/Headers: -------------------------------------------------------------------------------- 1 | Versions/Current/Headers -------------------------------------------------------------------------------- /GTKeyboardHelper.framework/Resources: -------------------------------------------------------------------------------- 1 | Versions/Current/Resources -------------------------------------------------------------------------------- /GTKeyboardHelper.framework/Versions/A/GTKeyboardHelper: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mackross/GTKeyboardHelper/d25060c6220c692306830822fb39ddb45736bd6f/GTKeyboardHelper.framework/Versions/A/GTKeyboardHelper -------------------------------------------------------------------------------- /GTKeyboardHelper.framework/Versions/A/Headers/GTKeyboardHelper.h: -------------------------------------------------------------------------------- 1 | // 2 | // GTKeyboardHelper.h 3 | // 4 | // Created by Andrew Mackenzie-Ross on 13/04/11. 5 | // Copyright (c) 2011 Andrew Mackenzie-Ross. All rights reserved. 6 | // 7 | 8 | #import 9 | 10 | typedef enum { 11 | GTKeyboardHelperAutoFocusScrollPositionProportional, // default - this should behave nicely 12 | GTKeyboardHelperAutoFocusScrollPositionBottom, // this forces the first responder even if the content offset is out of bounds 13 | GTKeyboardHelperAutoFocusScrollPositionTop, // this forces the first responder even if the content offset is out of bounds 14 | GTKeyboardHelperAutoFocusScrollNone, // this doesn't change the content offset but still does change the scroll views frame. 15 | } GTKeyboardHelperAutoFocusScrollPosition; 16 | 17 | ////////////////////////////////////////////////////////////////////////////////////////////////////// 18 | /// Public Interface 19 | ////////////////////////////////////////////////////////////////////////////////////////////////////// 20 | 21 | @interface GTKeyboardHelper : UIScrollView { 22 | UITapGestureRecognizer *tap_; 23 | UIPanGestureRecognizer *pan_; 24 | UISwipeGestureRecognizer *swipe_; 25 | } 26 | 27 | /** 28 | Use this to force auto focus to occur on a view within the scroll view. 29 | This is automatically called on keyboard notifications. It might be used so that a next button on the keyboard moves 30 | the next first responder into view. 31 | */ 32 | - (void)autoFocusOnView:(UIView*)view withAutoScrollPosition:(GTKeyboardHelperAutoFocusScrollPosition)scrollPosition; 33 | 34 | /** 35 | Use this to disable/enable keyboard monitoring. 36 | If weird things happen when pushing/popping view controllers consider setting to NO on viewWillDisappear: or viewDidDisappear: 37 | and YES on viewWillAppear: or viewDidAppear: 38 | */ 39 | @property (nonatomic, assign, getter = isMonitoringKeyboard) BOOL monitoringKeyboard; 40 | 41 | /** 42 | Use this to change the behaviour of the scroll views auto focus behaviour when the keyboard appears. 43 | */ 44 | @property (nonatomic, assign) GTKeyboardHelperAutoFocusScrollPosition autoFocusScrollPosition; 45 | 46 | @property (nonatomic, assign) BOOL dismissKeyboardOnTouchOutside; // default YES 47 | @property (nonatomic, assign) BOOL dismissKeyboardOnScroll; // default NO 48 | @end 49 | 50 | 51 | ////////////////////////////////////////////////////////////////////////////////////////////////////// 52 | /// Example Usage 53 | ////////////////////////////////////////////////////////////////////////////////////////////////////// 54 | 55 | 56 | // this is an example of how a resizing a container UIView (detailContainerView) of the GTKeyboardHelper (detailScrollView) could work. 57 | // this assumes that self.detailContatinerView view is a UIView with the content that needs to be keyboard aware and that self.detailScrollView is an 58 | // instance of GTKeyboardHelper. 59 | // 60 | // 61 | // - (void)viewDidLoad { 62 | // [super viewDidLoad]; 63 | // 64 | // [self.detailScrollView addSubview:self.detailContainerView]; 65 | // [self.detailScrollView setContentSize:self.detailContainerView.frame.size]; 66 | // 67 | // [self setFrameOnDetailContainerViewForInterfaceOrientation:[[UIApplication sharedApplication] statusBarOrientation]]; 68 | // 69 | // } 70 | // 71 | // 72 | // - (void)willAnimateRotationToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation duration:(NSTimeInterval)duration { 73 | // [self setFrameOnDetailContainerViewForInterfaceOrientation:toInterfaceOrientation]; 74 | // } 75 | // 76 | // 77 | // - (void)setFrameOnDetailContainerViewForInterfaceOrientation:(UIInterfaceOrientation)intefaceOrientation { 78 | // if (UIInterfaceOrientationIsLandscape(intefaceOrientation)) 79 | // { 80 | // [self.detailContainerView setFrame:CGRectMake(0.0, 0.0, 445.0, 704)]; 81 | // [self.detailScrollView setContentSize:CGSizeMake(445, 704)]; 82 | // } 83 | // else 84 | // { 85 | // [self.detailContainerView setFrame:CGRectMake(0.0, 0.0, 445.0, 960)]; 86 | // [self.detailScrollView setContentSize:CGSizeMake(445, 960)]; 87 | // } 88 | // } 89 | 90 | ////////////////////////////////////////////////////////////////////////////////////////////////////// 91 | /// Forces Linker to load GTKeyboardHelper 92 | ////////////////////////////////////////////////////////////////////////////////////////////////////// 93 | 94 | // If this file is referenced in a project using #import the following category will force the linker to load GTKeyboardHelper. 95 | 96 | @interface GTKeyboardHelper (force_linking) 97 | @end 98 | @implementation GTKeyboardHelper (force_linking) 99 | @end 100 | -------------------------------------------------------------------------------- /GTKeyboardHelper.framework/Versions/A/Resources/Info.plist: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mackross/GTKeyboardHelper/d25060c6220c692306830822fb39ddb45736bd6f/GTKeyboardHelper.framework/Versions/A/Resources/Info.plist -------------------------------------------------------------------------------- /GTKeyboardHelper.framework/Versions/A/Resources/en.lproj/InfoPlist.strings: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/mackross/GTKeyboardHelper/d25060c6220c692306830822fb39ddb45736bd6f/GTKeyboardHelper.framework/Versions/A/Resources/en.lproj/InfoPlist.strings -------------------------------------------------------------------------------- /GTKeyboardHelper.framework/Versions/Current: -------------------------------------------------------------------------------- 1 | A -------------------------------------------------------------------------------- /Keyboard Helper Demo.xcodeproj/project.pbxproj: -------------------------------------------------------------------------------- 1 | // !$*UTF8*$! 2 | { 3 | archiveVersion = 1; 4 | classes = { 5 | }; 6 | objectVersion = 46; 7 | objects = { 8 | 9 | /* Begin PBXBuildFile section */ 10 | 187E15CF1447A3C8006F5A45 /* UIKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 187E15CE1447A3C8006F5A45 /* UIKit.framework */; }; 11 | 187E15D11447A3C9006F5A45 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 187E15D01447A3C8006F5A45 /* Foundation.framework */; }; 12 | 187E15D31447A3C9006F5A45 /* CoreGraphics.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 187E15D21447A3C9006F5A45 /* CoreGraphics.framework */; }; 13 | 187E15D91447A3C9006F5A45 /* InfoPlist.strings in Resources */ = {isa = PBXBuildFile; fileRef = 187E15D71447A3C9006F5A45 /* InfoPlist.strings */; }; 14 | 187E15DB1447A3C9006F5A45 /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = 187E15DA1447A3C9006F5A45 /* main.m */; }; 15 | 187E15DF1447A3C9006F5A45 /* AppDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = 187E15DE1447A3C9006F5A45 /* AppDelegate.m */; }; 16 | 187E15E21447A3C9006F5A45 /* ViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 187E15E11447A3C9006F5A45 /* ViewController.m */; }; 17 | 187E15E51447A3C9006F5A45 /* ViewController_iPhone.xib in Resources */ = {isa = PBXBuildFile; fileRef = 187E15E31447A3C9006F5A45 /* ViewController_iPhone.xib */; }; 18 | 187E15E81447A3C9006F5A45 /* ViewController_iPad.xib in Resources */ = {isa = PBXBuildFile; fileRef = 187E15E61447A3C9006F5A45 /* ViewController_iPad.xib */; }; 19 | 187E16131447B157006F5A45 /* GTKeyboardHelper.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 187E16121447B157006F5A45 /* GTKeyboardHelper.framework */; }; 20 | /* End PBXBuildFile section */ 21 | 22 | /* Begin PBXFileReference section */ 23 | 187E15CA1447A3C8006F5A45 /* Keyboard Helper Demo.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = "Keyboard Helper Demo.app"; sourceTree = BUILT_PRODUCTS_DIR; }; 24 | 187E15CE1447A3C8006F5A45 /* UIKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = UIKit.framework; path = System/Library/Frameworks/UIKit.framework; sourceTree = SDKROOT; }; 25 | 187E15D01447A3C8006F5A45 /* Foundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Foundation.framework; path = System/Library/Frameworks/Foundation.framework; sourceTree = SDKROOT; }; 26 | 187E15D21447A3C9006F5A45 /* CoreGraphics.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreGraphics.framework; path = System/Library/Frameworks/CoreGraphics.framework; sourceTree = SDKROOT; }; 27 | 187E15D61447A3C9006F5A45 /* Keyboard Helper Demo-Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = "Keyboard Helper Demo-Info.plist"; sourceTree = ""; }; 28 | 187E15D81447A3C9006F5A45 /* en */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = en; path = en.lproj/InfoPlist.strings; sourceTree = ""; }; 29 | 187E15DA1447A3C9006F5A45 /* main.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = main.m; sourceTree = ""; }; 30 | 187E15DC1447A3C9006F5A45 /* Keyboard Helper Demo-Prefix.pch */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "Keyboard Helper Demo-Prefix.pch"; sourceTree = ""; }; 31 | 187E15DD1447A3C9006F5A45 /* AppDelegate.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = AppDelegate.h; sourceTree = ""; }; 32 | 187E15DE1447A3C9006F5A45 /* AppDelegate.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = AppDelegate.m; sourceTree = ""; }; 33 | 187E15E01447A3C9006F5A45 /* ViewController.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = ViewController.h; sourceTree = ""; }; 34 | 187E15E11447A3C9006F5A45 /* ViewController.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = ViewController.m; sourceTree = ""; }; 35 | 187E15E41447A3C9006F5A45 /* en */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = en; path = en.lproj/ViewController_iPhone.xib; sourceTree = ""; }; 36 | 187E15E71447A3C9006F5A45 /* en */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = en; path = en.lproj/ViewController_iPad.xib; sourceTree = ""; }; 37 | 187E16121447B157006F5A45 /* GTKeyboardHelper.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; path = GTKeyboardHelper.framework; sourceTree = ""; }; 38 | /* End PBXFileReference section */ 39 | 40 | /* Begin PBXFrameworksBuildPhase section */ 41 | 187E15C71447A3C8006F5A45 /* Frameworks */ = { 42 | isa = PBXFrameworksBuildPhase; 43 | buildActionMask = 2147483647; 44 | files = ( 45 | 187E15CF1447A3C8006F5A45 /* UIKit.framework in Frameworks */, 46 | 187E15D11447A3C9006F5A45 /* Foundation.framework in Frameworks */, 47 | 187E15D31447A3C9006F5A45 /* CoreGraphics.framework in Frameworks */, 48 | 187E16131447B157006F5A45 /* GTKeyboardHelper.framework in Frameworks */, 49 | ); 50 | runOnlyForDeploymentPostprocessing = 0; 51 | }; 52 | /* End PBXFrameworksBuildPhase section */ 53 | 54 | /* Begin PBXGroup section */ 55 | 187E15BF1447A3C8006F5A45 = { 56 | isa = PBXGroup; 57 | children = ( 58 | 187E15D41447A3C9006F5A45 /* Keyboard Helper Demo */, 59 | 187E15CD1447A3C8006F5A45 /* Frameworks */, 60 | 187E15CB1447A3C8006F5A45 /* Products */, 61 | ); 62 | sourceTree = ""; 63 | }; 64 | 187E15CB1447A3C8006F5A45 /* Products */ = { 65 | isa = PBXGroup; 66 | children = ( 67 | 187E15CA1447A3C8006F5A45 /* Keyboard Helper Demo.app */, 68 | ); 69 | name = Products; 70 | sourceTree = ""; 71 | }; 72 | 187E15CD1447A3C8006F5A45 /* Frameworks */ = { 73 | isa = PBXGroup; 74 | children = ( 75 | 187E16121447B157006F5A45 /* GTKeyboardHelper.framework */, 76 | 187E15CE1447A3C8006F5A45 /* UIKit.framework */, 77 | 187E15D01447A3C8006F5A45 /* Foundation.framework */, 78 | 187E15D21447A3C9006F5A45 /* CoreGraphics.framework */, 79 | ); 80 | name = Frameworks; 81 | sourceTree = ""; 82 | }; 83 | 187E15D41447A3C9006F5A45 /* Keyboard Helper Demo */ = { 84 | isa = PBXGroup; 85 | children = ( 86 | 187E15DD1447A3C9006F5A45 /* AppDelegate.h */, 87 | 187E15DE1447A3C9006F5A45 /* AppDelegate.m */, 88 | 187E15E01447A3C9006F5A45 /* ViewController.h */, 89 | 187E15E11447A3C9006F5A45 /* ViewController.m */, 90 | 187E15E31447A3C9006F5A45 /* ViewController_iPhone.xib */, 91 | 187E15E61447A3C9006F5A45 /* ViewController_iPad.xib */, 92 | 187E15D51447A3C9006F5A45 /* Supporting Files */, 93 | ); 94 | path = "Keyboard Helper Demo"; 95 | sourceTree = ""; 96 | }; 97 | 187E15D51447A3C9006F5A45 /* Supporting Files */ = { 98 | isa = PBXGroup; 99 | children = ( 100 | 187E15D61447A3C9006F5A45 /* Keyboard Helper Demo-Info.plist */, 101 | 187E15D71447A3C9006F5A45 /* InfoPlist.strings */, 102 | 187E15DA1447A3C9006F5A45 /* main.m */, 103 | 187E15DC1447A3C9006F5A45 /* Keyboard Helper Demo-Prefix.pch */, 104 | ); 105 | name = "Supporting Files"; 106 | sourceTree = ""; 107 | }; 108 | /* End PBXGroup section */ 109 | 110 | /* Begin PBXNativeTarget section */ 111 | 187E15C91447A3C8006F5A45 /* Keyboard Helper Demo */ = { 112 | isa = PBXNativeTarget; 113 | buildConfigurationList = 187E15EB1447A3C9006F5A45 /* Build configuration list for PBXNativeTarget "Keyboard Helper Demo" */; 114 | buildPhases = ( 115 | 187E15C61447A3C8006F5A45 /* Sources */, 116 | 187E15C71447A3C8006F5A45 /* Frameworks */, 117 | 187E15C81447A3C8006F5A45 /* Resources */, 118 | ); 119 | buildRules = ( 120 | ); 121 | dependencies = ( 122 | ); 123 | name = "Keyboard Helper Demo"; 124 | productName = "Keyboard Helper Demo"; 125 | productReference = 187E15CA1447A3C8006F5A45 /* Keyboard Helper Demo.app */; 126 | productType = "com.apple.product-type.application"; 127 | }; 128 | /* End PBXNativeTarget section */ 129 | 130 | /* Begin PBXProject section */ 131 | 187E15C11447A3C8006F5A45 /* Project object */ = { 132 | isa = PBXProject; 133 | attributes = { 134 | LastUpgradeCheck = 0420; 135 | }; 136 | buildConfigurationList = 187E15C41447A3C8006F5A45 /* Build configuration list for PBXProject "Keyboard Helper Demo" */; 137 | compatibilityVersion = "Xcode 3.2"; 138 | developmentRegion = English; 139 | hasScannedForEncodings = 0; 140 | knownRegions = ( 141 | en, 142 | ); 143 | mainGroup = 187E15BF1447A3C8006F5A45; 144 | productRefGroup = 187E15CB1447A3C8006F5A45 /* Products */; 145 | projectDirPath = ""; 146 | projectRoot = ""; 147 | targets = ( 148 | 187E15C91447A3C8006F5A45 /* Keyboard Helper Demo */, 149 | ); 150 | }; 151 | /* End PBXProject section */ 152 | 153 | /* Begin PBXResourcesBuildPhase section */ 154 | 187E15C81447A3C8006F5A45 /* Resources */ = { 155 | isa = PBXResourcesBuildPhase; 156 | buildActionMask = 2147483647; 157 | files = ( 158 | 187E15D91447A3C9006F5A45 /* InfoPlist.strings in Resources */, 159 | 187E15E51447A3C9006F5A45 /* ViewController_iPhone.xib in Resources */, 160 | 187E15E81447A3C9006F5A45 /* ViewController_iPad.xib in Resources */, 161 | ); 162 | runOnlyForDeploymentPostprocessing = 0; 163 | }; 164 | /* End PBXResourcesBuildPhase section */ 165 | 166 | /* Begin PBXSourcesBuildPhase section */ 167 | 187E15C61447A3C8006F5A45 /* Sources */ = { 168 | isa = PBXSourcesBuildPhase; 169 | buildActionMask = 2147483647; 170 | files = ( 171 | 187E15DB1447A3C9006F5A45 /* main.m in Sources */, 172 | 187E15DF1447A3C9006F5A45 /* AppDelegate.m in Sources */, 173 | 187E15E21447A3C9006F5A45 /* ViewController.m in Sources */, 174 | ); 175 | runOnlyForDeploymentPostprocessing = 0; 176 | }; 177 | /* End PBXSourcesBuildPhase section */ 178 | 179 | /* Begin PBXVariantGroup section */ 180 | 187E15D71447A3C9006F5A45 /* InfoPlist.strings */ = { 181 | isa = PBXVariantGroup; 182 | children = ( 183 | 187E15D81447A3C9006F5A45 /* en */, 184 | ); 185 | name = InfoPlist.strings; 186 | sourceTree = ""; 187 | }; 188 | 187E15E31447A3C9006F5A45 /* ViewController_iPhone.xib */ = { 189 | isa = PBXVariantGroup; 190 | children = ( 191 | 187E15E41447A3C9006F5A45 /* en */, 192 | ); 193 | name = ViewController_iPhone.xib; 194 | sourceTree = ""; 195 | }; 196 | 187E15E61447A3C9006F5A45 /* ViewController_iPad.xib */ = { 197 | isa = PBXVariantGroup; 198 | children = ( 199 | 187E15E71447A3C9006F5A45 /* en */, 200 | ); 201 | name = ViewController_iPad.xib; 202 | sourceTree = ""; 203 | }; 204 | /* End PBXVariantGroup section */ 205 | 206 | /* Begin XCBuildConfiguration section */ 207 | 187E15E91447A3C9006F5A45 /* Debug */ = { 208 | isa = XCBuildConfiguration; 209 | buildSettings = { 210 | ALWAYS_SEARCH_USER_PATHS = NO; 211 | ARCHS = "$(ARCHS_STANDARD_32_BIT)"; 212 | "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; 213 | COPY_PHASE_STRIP = NO; 214 | GCC_C_LANGUAGE_STANDARD = gnu99; 215 | GCC_DYNAMIC_NO_PIC = NO; 216 | GCC_OPTIMIZATION_LEVEL = 0; 217 | GCC_PREPROCESSOR_DEFINITIONS = ( 218 | "DEBUG=1", 219 | "$(inherited)", 220 | ); 221 | GCC_SYMBOLS_PRIVATE_EXTERN = NO; 222 | GCC_VERSION = com.apple.compilers.llvm.clang.1_0; 223 | GCC_WARN_ABOUT_MISSING_PROTOTYPES = YES; 224 | GCC_WARN_ABOUT_RETURN_TYPE = YES; 225 | GCC_WARN_UNUSED_VARIABLE = YES; 226 | IPHONEOS_DEPLOYMENT_TARGET = 5.0; 227 | SDKROOT = iphoneos; 228 | TARGETED_DEVICE_FAMILY = "1,2"; 229 | }; 230 | name = Debug; 231 | }; 232 | 187E15EA1447A3C9006F5A45 /* Release */ = { 233 | isa = XCBuildConfiguration; 234 | buildSettings = { 235 | ALWAYS_SEARCH_USER_PATHS = NO; 236 | ARCHS = "$(ARCHS_STANDARD_32_BIT)"; 237 | "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; 238 | COPY_PHASE_STRIP = YES; 239 | GCC_C_LANGUAGE_STANDARD = gnu99; 240 | GCC_VERSION = com.apple.compilers.llvm.clang.1_0; 241 | GCC_WARN_ABOUT_MISSING_PROTOTYPES = YES; 242 | GCC_WARN_ABOUT_RETURN_TYPE = YES; 243 | GCC_WARN_UNUSED_VARIABLE = YES; 244 | IPHONEOS_DEPLOYMENT_TARGET = 5.0; 245 | OTHER_CFLAGS = "-DNS_BLOCK_ASSERTIONS=1"; 246 | SDKROOT = iphoneos; 247 | TARGETED_DEVICE_FAMILY = "1,2"; 248 | VALIDATE_PRODUCT = YES; 249 | }; 250 | name = Release; 251 | }; 252 | 187E15EC1447A3C9006F5A45 /* Debug */ = { 253 | isa = XCBuildConfiguration; 254 | buildSettings = { 255 | FRAMEWORK_SEARCH_PATHS = ( 256 | "$(inherited)", 257 | "\"$(SRCROOT)\"", 258 | "\"$(SRCROOT)/GTKeyboardHelper.embeddedframework\"", 259 | "\"$(SRCROOT)/../../Library/Developer/Xcode/DerivedData/GTKeyboardHelper-aozvsmoetqethobncqrltpjlasoe/Build/Products/Release-iphoneos\"", 260 | ); 261 | GCC_PRECOMPILE_PREFIX_HEADER = YES; 262 | GCC_PREFIX_HEADER = "Keyboard Helper Demo/Keyboard Helper Demo-Prefix.pch"; 263 | INFOPLIST_FILE = "Keyboard Helper Demo/Keyboard Helper Demo-Info.plist"; 264 | IPHONEOS_DEPLOYMENT_TARGET = 4.3; 265 | OTHER_LDFLAGS = ""; 266 | PRODUCT_NAME = "$(TARGET_NAME)"; 267 | WRAPPER_EXTENSION = app; 268 | }; 269 | name = Debug; 270 | }; 271 | 187E15ED1447A3C9006F5A45 /* Release */ = { 272 | isa = XCBuildConfiguration; 273 | buildSettings = { 274 | FRAMEWORK_SEARCH_PATHS = ( 275 | "$(inherited)", 276 | "\"$(SRCROOT)\"", 277 | "\"$(SRCROOT)/GTKeyboardHelper.embeddedframework\"", 278 | "\"$(SRCROOT)/../../Library/Developer/Xcode/DerivedData/GTKeyboardHelper-aozvsmoetqethobncqrltpjlasoe/Build/Products/Release-iphoneos\"", 279 | ); 280 | GCC_PRECOMPILE_PREFIX_HEADER = YES; 281 | GCC_PREFIX_HEADER = "Keyboard Helper Demo/Keyboard Helper Demo-Prefix.pch"; 282 | INFOPLIST_FILE = "Keyboard Helper Demo/Keyboard Helper Demo-Info.plist"; 283 | IPHONEOS_DEPLOYMENT_TARGET = 4.3; 284 | OTHER_LDFLAGS = ""; 285 | PRODUCT_NAME = "$(TARGET_NAME)"; 286 | WRAPPER_EXTENSION = app; 287 | }; 288 | name = Release; 289 | }; 290 | /* End XCBuildConfiguration section */ 291 | 292 | /* Begin XCConfigurationList section */ 293 | 187E15C41447A3C8006F5A45 /* Build configuration list for PBXProject "Keyboard Helper Demo" */ = { 294 | isa = XCConfigurationList; 295 | buildConfigurations = ( 296 | 187E15E91447A3C9006F5A45 /* Debug */, 297 | 187E15EA1447A3C9006F5A45 /* Release */, 298 | ); 299 | defaultConfigurationIsVisible = 0; 300 | defaultConfigurationName = Release; 301 | }; 302 | 187E15EB1447A3C9006F5A45 /* Build configuration list for PBXNativeTarget "Keyboard Helper Demo" */ = { 303 | isa = XCConfigurationList; 304 | buildConfigurations = ( 305 | 187E15EC1447A3C9006F5A45 /* Debug */, 306 | 187E15ED1447A3C9006F5A45 /* Release */, 307 | ); 308 | defaultConfigurationIsVisible = 0; 309 | defaultConfigurationName = Release; 310 | }; 311 | /* End XCConfigurationList section */ 312 | }; 313 | rootObject = 187E15C11447A3C8006F5A45 /* Project object */; 314 | } 315 | -------------------------------------------------------------------------------- /Keyboard Helper Demo.xcodeproj/project.xcworkspace/contents.xcworkspacedata: -------------------------------------------------------------------------------- 1 | 2 | 4 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /Keyboard Helper Demo/AppDelegate.h: -------------------------------------------------------------------------------- 1 | // 2 | // AppDelegate.h 3 | // Keyboard Helper Demo 4 | // 5 | // Created by Andrew Mackenzie-Ross on 14/10/11. 6 | // Copyright (c) 2011 mackross.net. All rights reserved. 7 | // 8 | 9 | #import 10 | #import 11 | @class ViewController; 12 | 13 | @interface AppDelegate : UIResponder 14 | 15 | @property (strong, nonatomic) UIWindow *window; 16 | 17 | @property (strong, nonatomic) ViewController *viewController; 18 | 19 | @end 20 | -------------------------------------------------------------------------------- /Keyboard Helper Demo/AppDelegate.m: -------------------------------------------------------------------------------- 1 | // 2 | // AppDelegate.m 3 | // Keyboard Helper Demo 4 | // 5 | // Created by Andrew Mackenzie-Ross on 14/10/11. 6 | // Copyright (c) 2011 mackross.net. All rights reserved. 7 | // 8 | 9 | #import "AppDelegate.h" 10 | 11 | #import "ViewController.h" 12 | 13 | @implementation AppDelegate 14 | 15 | @synthesize window = _window; 16 | @synthesize viewController = _viewController; 17 | 18 | - (void)dealloc 19 | { 20 | [_window release]; 21 | [_viewController release]; 22 | [super dealloc]; 23 | } 24 | 25 | - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions 26 | { 27 | self.window = [[[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]] autorelease]; 28 | // Override point for customization after application launch. 29 | if ([[UIDevice currentDevice] userInterfaceIdiom] == UIUserInterfaceIdiomPhone) { 30 | self.viewController = [[[ViewController alloc] initWithNibName:@"ViewController_iPhone" bundle:nil] autorelease]; 31 | } else { 32 | self.viewController = [[[ViewController alloc] initWithNibName:@"ViewController_iPad" bundle:nil] autorelease]; 33 | } 34 | self.window.rootViewController = self.viewController; 35 | [self.window makeKeyAndVisible]; 36 | return YES; 37 | } 38 | 39 | - (void)applicationWillResignActive:(UIApplication *)application 40 | { 41 | /* 42 | 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. 43 | 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. 44 | */ 45 | } 46 | 47 | - (void)applicationDidEnterBackground:(UIApplication *)application 48 | { 49 | /* 50 | 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. 51 | If your application supports background execution, this method is called instead of applicationWillTerminate: when the user quits. 52 | */ 53 | } 54 | 55 | - (void)applicationWillEnterForeground:(UIApplication *)application 56 | { 57 | /* 58 | 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. 59 | */ 60 | } 61 | 62 | - (void)applicationDidBecomeActive:(UIApplication *)application 63 | { 64 | /* 65 | 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. 66 | */ 67 | } 68 | 69 | - (void)applicationWillTerminate:(UIApplication *)application 70 | { 71 | /* 72 | Called when the application is about to terminate. 73 | Save data if appropriate. 74 | See also applicationDidEnterBackground:. 75 | */ 76 | } 77 | 78 | @end 79 | -------------------------------------------------------------------------------- /Keyboard Helper Demo/Keyboard Helper Demo-Info.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | CFBundleDevelopmentRegion 6 | en 7 | CFBundleDisplayName 8 | ${PRODUCT_NAME} 9 | CFBundleExecutable 10 | ${EXECUTABLE_NAME} 11 | CFBundleIconFiles 12 | 13 | CFBundleIdentifier 14 | net.mackross.${PRODUCT_NAME:rfc1034identifier} 15 | CFBundleInfoDictionaryVersion 16 | 6.0 17 | CFBundleName 18 | ${PRODUCT_NAME} 19 | CFBundlePackageType 20 | APPL 21 | CFBundleShortVersionString 22 | 1.0 23 | CFBundleSignature 24 | ???? 25 | CFBundleVersion 26 | 1.0 27 | LSRequiresIPhoneOS 28 | 29 | UIRequiredDeviceCapabilities 30 | 31 | armv7 32 | 33 | UISupportedInterfaceOrientations 34 | 35 | UIInterfaceOrientationPortrait 36 | UIInterfaceOrientationLandscapeLeft 37 | UIInterfaceOrientationLandscapeRight 38 | 39 | UISupportedInterfaceOrientations~ipad 40 | 41 | UIInterfaceOrientationPortrait 42 | UIInterfaceOrientationPortraitUpsideDown 43 | UIInterfaceOrientationLandscapeLeft 44 | UIInterfaceOrientationLandscapeRight 45 | 46 | 47 | 48 | -------------------------------------------------------------------------------- /Keyboard Helper Demo/Keyboard Helper Demo-Prefix.pch: -------------------------------------------------------------------------------- 1 | // 2 | // Prefix header for all source files of the 'Keyboard Helper Demo' target in the 'Keyboard Helper Demo' project 3 | // 4 | 5 | #import 6 | 7 | #ifndef __IPHONE_4_0 8 | #warning "This project uses features only available in iOS SDK 4.0 and later." 9 | #endif 10 | 11 | #ifdef __OBJC__ 12 | #import 13 | #import 14 | #endif 15 | -------------------------------------------------------------------------------- /Keyboard Helper Demo/ViewController.h: -------------------------------------------------------------------------------- 1 | // 2 | // ViewController.h 3 | // Keyboard Helper Demo 4 | // 5 | // Created by Andrew Mackenzie-Ross on 14/10/11. 6 | // Copyright (c) 2011 mackross.net. All rights reserved. 7 | // 8 | 9 | #import 10 | 11 | @interface ViewController : UIViewController 12 | 13 | @end 14 | -------------------------------------------------------------------------------- /Keyboard Helper Demo/ViewController.m: -------------------------------------------------------------------------------- 1 | // 2 | // ViewController.m 3 | // Keyboard Helper Demo 4 | // 5 | // Created by Andrew Mackenzie-Ross on 14/10/11. 6 | // Copyright (c) 2011 mackross.net. All rights reserved. 7 | // 8 | 9 | #import "ViewController.h" 10 | @implementation ViewController 11 | 12 | 13 | // See nib files for how GTKeyboardHelper is implemented in this project. 14 | // For more customisation of behaviour and information on how to support multiple orientations see header file 15 | // 16 | // Tested on iOS 4.3 and above. Uses gesture recognises and therefore definitely wont work on iOS 3.x 17 | 18 | - (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation 19 | { 20 | return UIInterfaceOrientationIsPortrait(interfaceOrientation); 21 | } 22 | 23 | @end 24 | -------------------------------------------------------------------------------- /Keyboard Helper Demo/en.lproj/InfoPlist.strings: -------------------------------------------------------------------------------- 1 | /* Localized versions of Info.plist keys */ 2 | 3 | -------------------------------------------------------------------------------- /Keyboard Helper Demo/en.lproj/ViewController_iPad.xib: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 1280 5 | 11C73 6 | 1938 7 | 1138.23 8 | 567.00 9 | 10 | com.apple.InterfaceBuilder.IBCocoaTouchPlugin 11 | 933 12 | 13 | 14 | IBUITextField 15 | IBUIView 16 | IBUIScrollView 17 | IBProxyObject 18 | 19 | 20 | com.apple.InterfaceBuilder.IBCocoaTouchPlugin 21 | 22 | 23 | PluginDependencyRecalculationVersion 24 | 25 | 26 | 27 | 28 | IBFilesOwner 29 | IBIPadFramework 30 | 31 | 32 | IBFirstResponder 33 | IBIPadFramework 34 | 35 | 36 | 37 | 274 38 | 39 | 40 | 41 | 274 42 | 43 | 44 | 45 | 292 46 | {{229, 372}, {97, 31}} 47 | 48 | 49 | 50 | _NS:304 51 | NO 52 | YES 53 | IBIPadFramework 54 | 0 55 | 56 | 3 57 | Isn't this 58 | 59 | 3 60 | MAA 61 | 62 | 2 63 | 64 | 65 | 1 66 | YES 67 | 17 68 | 69 | IBCocoaTouchFramework 70 | 71 | 72 | 1 73 | 14 74 | 75 | 76 | Helvetica 77 | 14 78 | 16 79 | 80 | 81 | 82 | 83 | 292 84 | {{343, 590}, {97, 31}} 85 | 86 | 87 | 88 | _NS:304 89 | NO 90 | YES 91 | IBIPadFramework 92 | 0 93 | 94 | 3 95 | a little bit 96 | 97 | 3 98 | MAA 99 | 100 | 101 | 1 102 | YES 103 | 17 104 | 105 | IBCocoaTouchFramework 106 | 107 | 108 | 109 | 110 | 111 | 112 | 292 113 | {{543, 828}, {97, 31}} 114 | 115 | 116 | 117 | _NS:304 118 | NO 119 | YES 120 | IBIPadFramework 121 | 0 122 | 123 | 3 124 | Cool! 125 | 126 | 3 127 | MAA 128 | 129 | 130 | 1 131 | YES 132 | 17 133 | 134 | IBCocoaTouchFramework 135 | 136 | 137 | 138 | 139 | 140 | {768, 1004} 141 | 142 | 143 | 144 | _NS:190 145 | YES 146 | YES 147 | IBIPadFramework 148 | 149 | 150 | {{0, 20}, {768, 1004}} 151 | 152 | 153 | 154 | 155 | 3 156 | MC42NjY2NjY2NjY3AA 157 | 158 | 159 | 2 160 | 161 | IBIPadFramework 162 | 163 | 164 | 165 | 166 | 167 | 168 | view 169 | 170 | 171 | 172 | 3 173 | 174 | 175 | 176 | 177 | 178 | 0 179 | 180 | 181 | 182 | 183 | 184 | -1 185 | 186 | 187 | File's Owner 188 | 189 | 190 | -2 191 | 192 | 193 | 194 | 195 | 2 196 | 197 | 198 | 199 | 200 | 201 | 202 | 203 | 4 204 | 205 | 206 | 207 | 208 | 209 | 210 | 211 | 212 | 213 | 7 214 | 215 | 216 | 217 | 218 | 6 219 | 220 | 221 | 222 | 223 | 5 224 | 225 | 226 | 227 | 228 | 229 | 230 | ViewController 231 | com.apple.InterfaceBuilder.IBCocoaTouchPlugin 232 | UIResponder 233 | com.apple.InterfaceBuilder.IBCocoaTouchPlugin 234 | com.apple.InterfaceBuilder.IBCocoaTouchPlugin 235 | GTKeyboardHelper 236 | com.apple.InterfaceBuilder.IBCocoaTouchPlugin 237 | com.apple.InterfaceBuilder.IBCocoaTouchPlugin 238 | com.apple.InterfaceBuilder.IBCocoaTouchPlugin 239 | com.apple.InterfaceBuilder.IBCocoaTouchPlugin 240 | 241 | 242 | 243 | 244 | 245 | 7 246 | 247 | 248 | 249 | 250 | GTKeyboardHelper 251 | UIScrollView 252 | 253 | IBProjectSource 254 | ./Classes/GTKeyboardHelper.h 255 | 256 | 257 | 258 | ViewController 259 | UIViewController 260 | 261 | IBProjectSource 262 | ./Classes/ViewController.h 263 | 264 | 265 | 266 | 267 | 0 268 | IBIPadFramework 269 | YES 270 | 3 271 | 933 272 | 273 | 274 | -------------------------------------------------------------------------------- /Keyboard Helper Demo/en.lproj/ViewController_iPhone.xib: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 1280 5 | 11C73 6 | 1938 7 | 1138.23 8 | 567.00 9 | 10 | com.apple.InterfaceBuilder.IBCocoaTouchPlugin 11 | 933 12 | 13 | 14 | IBUITextField 15 | IBUILabel 16 | IBUIView 17 | IBUIScrollView 18 | IBProxyObject 19 | 20 | 21 | com.apple.InterfaceBuilder.IBCocoaTouchPlugin 22 | 23 | 24 | PluginDependencyRecalculationVersion 25 | 26 | 27 | 28 | 29 | IBFilesOwner 30 | IBCocoaTouchFramework 31 | 32 | 33 | IBFirstResponder 34 | IBCocoaTouchFramework 35 | 36 | 37 | 38 | 274 39 | 40 | 41 | 42 | 274 43 | 44 | 45 | 46 | 292 47 | {{112, 35}, {97, 31}} 48 | 49 | 50 | 51 | _NS:304 52 | NO 53 | YES 54 | IBCocoaTouchFramework 55 | 0 56 | 57 | 3 58 | Isn't this 59 | 60 | 3 61 | MAA 62 | 63 | 2 64 | 65 | 66 | 1 67 | YES 68 | 17 69 | 70 | IBCocoaTouchFramework 71 | 72 | 73 | 1 74 | 14 75 | 76 | 77 | Helvetica 78 | 14 79 | 16 80 | 81 | 82 | 83 | 84 | 292 85 | {{112, 198}, {97, 31}} 86 | 87 | 88 | 89 | _NS:304 90 | NO 91 | YES 92 | IBCocoaTouchFramework 93 | 0 94 | 95 | 3 96 | a little bit 97 | 98 | 3 99 | MAA 100 | 101 | 102 | 1 103 | YES 104 | 17 105 | 106 | IBCocoaTouchFramework 107 | 108 | 109 | 110 | 111 | 112 | 113 | 292 114 | {{112, 359}, {97, 31}} 115 | 116 | 117 | 118 | _NS:304 119 | NO 120 | YES 121 | IBCocoaTouchFramework 122 | 0 123 | 124 | 3 125 | Cool! 126 | 127 | 3 128 | MAA 129 | 130 | 131 | 1 132 | YES 133 | 17 134 | 135 | IBCocoaTouchFramework 136 | 137 | 138 | 139 | 140 | 141 | 142 | 292 143 | {{10, 118}, {300, 21}} 144 | 145 | 146 | 147 | _NS:328 148 | NO 149 | YES 150 | 7 151 | NO 152 | IBCocoaTouchFramework 153 | Tap inside and outside of the text fields 154 | 155 | 1 156 | MCAwIDAAA 157 | 158 | 159 | 1 160 | 10 161 | 162 | 1 163 | 17 164 | 165 | 166 | Helvetica 167 | 17 168 | 16 169 | 170 | 171 | 172 | 173 | 292 174 | {{17, 289}, {325, 21}} 175 | 176 | 177 | 178 | _NS:328 179 | NO 180 | YES 181 | 7 182 | NO 183 | IBCocoaTouchFramework 184 | This and other behaviours changeable 185 | 186 | 187 | 1 188 | 10 189 | 190 | 191 | 192 | 193 | 194 | 292 195 | {{50, 420}, {218, 21}} 196 | 197 | 198 | 199 | _NS:328 200 | NO 201 | YES 202 | 7 203 | NO 204 | IBCocoaTouchFramework 205 | For more info see header file 206 | 207 | 208 | 1 209 | 10 210 | 211 | 212 | 213 | 214 | {320, 460} 215 | 216 | 217 | 218 | _NS:190 219 | YES 220 | YES 221 | IBCocoaTouchFramework 222 | 223 | 224 | {{0, 20}, {320, 460}} 225 | 226 | 227 | 228 | 229 | 3 230 | MC43NQA 231 | 232 | 233 | NO 234 | 235 | IBCocoaTouchFramework 236 | 237 | 238 | 239 | 240 | 241 | 242 | view 243 | 244 | 245 | 246 | 7 247 | 248 | 249 | 250 | 251 | 252 | 0 253 | 254 | 255 | 256 | 257 | 258 | -1 259 | 260 | 261 | File's Owner 262 | 263 | 264 | -2 265 | 266 | 267 | 268 | 269 | 6 270 | 271 | 272 | 273 | 274 | 275 | 276 | 277 | 8 278 | 279 | 280 | 281 | 282 | 283 | 284 | 285 | 286 | 287 | 288 | 289 | 290 | 9 291 | 292 | 293 | 294 | 295 | 10 296 | 297 | 298 | 299 | 300 | 11 301 | 302 | 303 | 304 | 305 | 12 306 | 307 | 308 | 309 | 310 | 13 311 | 312 | 313 | 314 | 315 | 14 316 | 317 | 318 | 319 | 320 | 321 | 322 | ViewController 323 | com.apple.InterfaceBuilder.IBCocoaTouchPlugin 324 | UIResponder 325 | com.apple.InterfaceBuilder.IBCocoaTouchPlugin 326 | com.apple.InterfaceBuilder.IBCocoaTouchPlugin 327 | com.apple.InterfaceBuilder.IBCocoaTouchPlugin 328 | com.apple.InterfaceBuilder.IBCocoaTouchPlugin 329 | com.apple.InterfaceBuilder.IBCocoaTouchPlugin 330 | com.apple.InterfaceBuilder.IBCocoaTouchPlugin 331 | com.apple.InterfaceBuilder.IBCocoaTouchPlugin 332 | GTKeyboardHelper 333 | com.apple.InterfaceBuilder.IBCocoaTouchPlugin 334 | com.apple.InterfaceBuilder.IBCocoaTouchPlugin 335 | 336 | 337 | 338 | 339 | 340 | 14 341 | 342 | 343 | 344 | 345 | GTKeyboardHelper 346 | UIScrollView 347 | 348 | IBProjectSource 349 | ./Classes/GTKeyboardHelper.h 350 | 351 | 352 | 353 | ViewController 354 | UIViewController 355 | 356 | IBProjectSource 357 | ./Classes/ViewController.h 358 | 359 | 360 | 361 | 362 | 0 363 | IBCocoaTouchFramework 364 | YES 365 | 3 366 | 933 367 | 368 | 369 | -------------------------------------------------------------------------------- /Keyboard Helper Demo/main.m: -------------------------------------------------------------------------------- 1 | // 2 | // main.m 3 | // Keyboard Helper Demo 4 | // 5 | // Created by Andrew Mackenzie-Ross on 14/10/11. 6 | // Copyright (c) 2011 __MyCompanyName__. All rights reserved. 7 | // 8 | 9 | #import 10 | 11 | #import "AppDelegate.h" 12 | 13 | int main(int argc, char *argv[]) 14 | { 15 | @autoreleasepool { 16 | return UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class])); 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /README.markdown: -------------------------------------------------------------------------------- 1 | #GTKeyboardHelper 2 | 3 | ##Master Branch 4 | The master branch contains a basic demo project and the GTKeyboardHelper.framework. Unless you wish to modify the GTKeyboardHelper source files this is the branch you want. 5 | 6 | ###Installation 7 | 1. _Drag and drop_ the GTKeyboardHelper.framework folder into any Xcode project. 8 | 2. In at least one file use `#import ` 9 | 10 | ###Usage 11 | Simply use GTKeyboardHelper as a container for any first responders. 12 | It will automatically resize and allow scrolling to accommodate the keyboard. 13 | Includes customisable auto-focus behaviour and automatic resignation of first responder. 14 | 15 | ##Development Branch 16 | The development branch contains the source files for building the GTKeyboardHelper framework. 17 | 18 | In order to modify/build the source of the GTKeyboardHelper framework the iOS-Universal-Framework Real Framework Xcode changes must be installed. (https://github.com/kstenerud/iOS-Universal-Framework). 19 | 20 | 21 | --------------------------------------------------------------------------------