diff --git a/IQKeyBoardManager/.DS_Store b/IQKeyBoardManager/.DS_Store index fc4a714..6503c1a 100644 Binary files a/IQKeyBoardManager/.DS_Store and b/IQKeyBoardManager/.DS_Store differ diff --git a/IQKeyBoardManager/IQKeyboardManager.h b/IQKeyBoardManager/IQKeyboardManager.h index 9e775c5..44629d3 100755 --- a/IQKeyBoardManager/IQKeyboardManager.h +++ b/IQKeyBoardManager/IQKeyboardManager.h @@ -188,6 +188,15 @@ extern NSInteger const kIQPreviousNextButtonToolbarTag; /*******************************************/ +//UIScrollView handling + +/** + @property shouldRestoreScrollViewContentOffset + + @abstract Restore scrollViewContentOffset when resigning from scrollView. Default is NO. + */ +@property(nonatomic, assign) BOOL shouldRestoreScrollViewContentOffset; + //UISound handling @@ -221,24 +230,30 @@ extern NSInteger const kIQPreviousNextButtonToolbarTag; /** @method disableInViewControllerClass: + @method removeDisableInViewControllerClass: @param disabledClass: Class in which library should not adjust view to show textField. */ -(void)disableInViewControllerClass:(Class)disabledClass; +-(void)removeDisableInViewControllerClass:(Class)disabledClass; /** - @method disableToolbarInViewControllerClass + @method disableToolbarInViewControllerClass: + @method removeDisableToolbarInViewControllerClass: @param toolbarDisabledClass: Class in which library should not add toolbar over textField. */ -(void)disableToolbarInViewControllerClass:(Class)toolbarDisabledClass; +-(void)removeDisableToolbarInViewControllerClass:(Class)toolbarDisabledClass; /** - @method considerToolbarPreviousNextInViewClass + @method considerToolbarPreviousNextInViewClass: + @method removeConsiderToolbarPreviousNextInViewClass: @param toolbarPreviousNextConsideredClass: Custom UIView subclass Class in which library should consider all inner textField as siblings and add next/previous accordingly. */ -(void)considerToolbarPreviousNextInViewClass:(Class)toolbarPreviousNextConsideredClass; +-(void)removeConsiderToolbarPreviousNextInViewClass:(Class)toolbarPreviousNextConsideredClass; /*******************************************/ diff --git a/IQKeyBoardManager/IQKeyboardManager.m b/IQKeyBoardManager/IQKeyboardManager.m index 505bdaa..50d0ab3 100755 --- a/IQKeyBoardManager/IQKeyboardManager.m +++ b/IQKeyBoardManager/IQKeyboardManager.m @@ -233,6 +233,7 @@ void _IQShowLog(NSString *logString); [self setPreventShowingBottomBlankSpace:YES]; [self setShouldShowTextFieldPlaceholder:YES]; [self setShouldAdoptDefaultKeyboardAnimation:YES]; + [self setShouldRestoreScrollViewContentOffset:NO]; [self setToolbarManageBehaviour:IQAutoToolbarBySubviews]; //Initializing disabled classes Set. @@ -464,8 +465,15 @@ void _IQShowLog(NSString *logString); { _IQShowLog([NSString stringWithFormat:@"Restoring %@ contentInset to : %@ and contentOffset to : %@",[_lastScrollView _IQDescription],NSStringFromUIEdgeInsets(_startingContentInsets),NSStringFromCGPoint(_startingContentOffset)]); - [_lastScrollView setContentInset:_startingContentInsets]; - [_lastScrollView setContentOffset:_startingContentOffset animated:YES]; + [UIView animateWithDuration:_animationDuration delay:0 options:(_animationCurve|UIViewAnimationOptionBeginFromCurrentState) animations:^{ + [_lastScrollView setContentInset:_startingContentInsets]; + } completion:NULL]; + + if (_shouldRestoreScrollViewContentOffset) + { + [_lastScrollView setContentOffset:_startingContentOffset animated:YES]; + } + _startingContentInsets = UIEdgeInsetsZero; _startingContentOffset = CGPointZero; _lastScrollView = nil; @@ -475,8 +483,15 @@ void _IQShowLog(NSString *logString); { _IQShowLog([NSString stringWithFormat:@"Restoring %@ contentInset to : %@ and contentOffset to : %@",[_lastScrollView _IQDescription],NSStringFromUIEdgeInsets(_startingContentInsets),NSStringFromCGPoint(_startingContentOffset)]); - [_lastScrollView setContentInset:_startingContentInsets]; - [_lastScrollView setContentOffset:_startingContentOffset animated:YES]; + [UIView animateWithDuration:_animationDuration delay:0 options:(_animationCurve|UIViewAnimationOptionBeginFromCurrentState) animations:^{ + [_lastScrollView setContentInset:_startingContentInsets]; + } completion:NULL]; + + if (_shouldRestoreScrollViewContentOffset) + { + [_lastScrollView setContentOffset:_startingContentOffset animated:YES]; + } + _lastScrollView = superScrollView; _startingContentInsets = superScrollView.contentInset; _startingContentOffset = superScrollView.contentOffset; @@ -567,7 +582,10 @@ void _IQShowLog(NSString *logString); _IQShowLog([NSString stringWithFormat:@"%@ old ContentInset : %@",[_lastScrollView _IQDescription], NSStringFromUIEdgeInsets(_lastScrollView.contentInset)]); - _lastScrollView.contentInset = movedInsets; + [UIView animateWithDuration:_animationDuration delay:0 options:(_animationCurve|UIViewAnimationOptionBeginFromCurrentState) animations:^{ + _lastScrollView.contentInset = movedInsets; + } completion:NULL]; + if (_lastScrollView.contentSize.height<_lastScrollView.frame.size.height) { CGSize contentSize = _lastScrollView.contentSize; @@ -892,26 +910,14 @@ void _IQShowLog(NSString *logString); { [UIView animateWithDuration:_animationDuration delay:0 options:(_animationCurve|UIViewAnimationOptionBeginFromCurrentState) animations:^{ _lastScrollView.contentInset = _startingContentInsets; - _lastScrollView.contentOffset = _startingContentOffset; + + if (_shouldRestoreScrollViewContentOffset) + { + _lastScrollView.contentOffset = _startingContentOffset; + } _IQShowLog([NSString stringWithFormat:@"Restoring %@ contentInset to : %@ and contentOffset to : %@",[_lastScrollView _IQDescription],NSStringFromUIEdgeInsets(_startingContentInsets),NSStringFromCGPoint(_startingContentOffset)]); - // TODO: restore scrollView state - // This is temporary solution. Have to implement the save and restore scrollView state - UIScrollView *superscrollView = _lastScrollView; - while ((superscrollView = (UIScrollView*)[superscrollView superviewOfClassType:[UIScrollView class]])) - { - CGSize contentSize = CGSizeMake(MAX(superscrollView.contentSize.width, superscrollView.IQ_width), MAX(superscrollView.contentSize.height, superscrollView.IQ_height)); - - CGFloat minimumY = contentSize.height-superscrollView.IQ_height; - - if (minimumY +#import +#import "IQKeyboardManager.h" + +@interface IQKeyboardManager_Tests : XCTestCase + +@end + +@implementation IQKeyboardManager_Tests + +- (void) setUp { + NSLog(@"%@ setUp", self.name); +} + +- (void) tearDown { + NSLog(@"%@ tearDown", self.name); +} + +- (void)testInitiateLibrary { + + IQKeyboardManager *kbManager = [IQKeyboardManager sharedManager]; + + XCTAssertNotNil(kbManager, @"Did not initiate IQKeyboardManager"); +} + +@end diff --git a/KeyboardTextFieldDemo/IQKeyboardManager Tests/Info.plist b/KeyboardTextFieldDemo/IQKeyboardManager Tests/Info.plist new file mode 100644 index 0000000..4232d77 --- /dev/null +++ b/KeyboardTextFieldDemo/IQKeyboardManager Tests/Info.plist @@ -0,0 +1,24 @@ + + + + + CFBundleDevelopmentRegion + en + CFBundleExecutable + $(EXECUTABLE_NAME) + CFBundleIdentifier + com.iftekhar.IQKeyboardManager-Tests + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + $(PRODUCT_NAME) + CFBundlePackageType + BNDL + CFBundleShortVersionString + 1.0 + CFBundleSignature + ???? + CFBundleVersion + 1 + + diff --git a/KeyboardTextFieldDemo/IQKeyboardManager.xcodeproj/project.pbxproj b/KeyboardTextFieldDemo/IQKeyboardManager.xcodeproj/project.pbxproj index d1cc8c2..ca13923 100755 --- a/KeyboardTextFieldDemo/IQKeyboardManager.xcodeproj/project.pbxproj +++ b/KeyboardTextFieldDemo/IQKeyboardManager.xcodeproj/project.pbxproj @@ -89,6 +89,7 @@ C0B63BA41781FAB1008D3B64 /* CoreGraphics.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = C0B63BA31781FAB1008D3B64 /* CoreGraphics.framework */; }; C0B63BAC1781FAB1008D3B64 /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = C0B63BAB1781FAB1008D3B64 /* main.m */; }; C0B63BB01781FAB1008D3B64 /* AppDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = C0B63BAF1781FAB1008D3B64 /* AppDelegate.m */; }; + C0D7810E1ABF0AB6005FB0AA /* IQKeyboardManager_Tests.m in Sources */ = {isa = PBXBuildFile; fileRef = C0D7810D1ABF0AB6005FB0AA /* IQKeyboardManager_Tests.m */; }; C0DDEB6119FCD56300FAB29F /* IQNSArray+Sort.swift in Sources */ = {isa = PBXBuildFile; fileRef = C0DDEB4E19FCD56300FAB29F /* IQNSArray+Sort.swift */; }; C0DDEB6219FCD56300FAB29F /* IQUIView+Hierarchy.swift in Sources */ = {isa = PBXBuildFile; fileRef = C0DDEB4F19FCD56300FAB29F /* IQUIView+Hierarchy.swift */; }; C0DDEB6319FCD56300FAB29F /* IQUIWindow+Hierarchy.swift in Sources */ = {isa = PBXBuildFile; fileRef = C0DDEB5019FCD56300FAB29F /* IQUIWindow+Hierarchy.swift */; }; @@ -115,6 +116,16 @@ DDAA29F21A320057002C0ED8 /* TableViewInContainerViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = DDAA29F11A320057002C0ED8 /* TableViewInContainerViewController.m */; }; /* End PBXBuildFile section */ +/* Begin PBXContainerItemProxy section */ + C0D7810F1ABF0AB6005FB0AA /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = C0B63B921781FAB0008D3B64 /* Project object */; + proxyType = 1; + remoteGlobalIDString = C0B63B9A1781FAB1008D3B64; + remoteInfo = IQKeyboardManager; + }; +/* End PBXContainerItemProxy section */ + /* Begin PBXFileReference section */ 53CF2B7D1903D02200E3FDEA /* NavigationBarViewController.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = NavigationBarViewController.h; sourceTree = ""; }; 53CF2B7E1903D02200E3FDEA /* NavigationBarViewController.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = NavigationBarViewController.m; sourceTree = ""; }; @@ -212,6 +223,9 @@ C0B63BAD1781FAB1008D3B64 /* IQKeyboardManager-Prefix.pch */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "IQKeyboardManager-Prefix.pch"; sourceTree = ""; }; C0B63BAE1781FAB1008D3B64 /* AppDelegate.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = AppDelegate.h; sourceTree = ""; }; C0B63BAF1781FAB1008D3B64 /* AppDelegate.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = AppDelegate.m; sourceTree = ""; }; + C0D781091ABF0AB6005FB0AA /* IQKeyboardManager Tests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = "IQKeyboardManager Tests.xctest"; sourceTree = BUILT_PRODUCTS_DIR; }; + C0D7810C1ABF0AB6005FB0AA /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; + C0D7810D1ABF0AB6005FB0AA /* IQKeyboardManager_Tests.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = IQKeyboardManager_Tests.m; sourceTree = ""; }; C0DD7EA019D0A0C5007604CF /* AppDelegate.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; }; C0DD7EA119D0A0C5007604CF /* ViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ViewController.swift; sourceTree = ""; }; C0DDEB4E19FCD56300FAB29F /* IQNSArray+Sort.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "IQNSArray+Sort.swift"; sourceTree = ""; }; @@ -269,6 +283,13 @@ ); runOnlyForDeploymentPostprocessing = 0; }; + C0D781061ABF0AB6005FB0AA /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; /* End PBXFrameworksBuildPhase section */ /* Begin PBXGroup section */ @@ -462,6 +483,7 @@ C0B63BA51781FAB1008D3B64 /* KeyboardTextFieldDemo */, C0DE7A3019D49D3400B6A582 /* Resources */, 9D0BB87518BB232B00667349 /* KeyboardManager */, + C0D7810A1ABF0AB6005FB0AA /* IQKeyboardManager Tests */, C0B63B9E1781FAB1008D3B64 /* Frameworks */, C0B63B9C1781FAB1008D3B64 /* Products */, ); @@ -473,6 +495,7 @@ C0B63B9B1781FAB1008D3B64 /* IQKeyboardManager.app */, 9D0BB87318BB232B00667349 /* KeyboardManager.framework */, C0ACB0F519CF104B0057B571 /* IQKeyboardManager Swift.app */, + C0D781091ABF0AB6005FB0AA /* IQKeyboardManager Tests.xctest */, ); name = Products; sourceTree = ""; @@ -546,6 +569,23 @@ name = "Supporting Files"; sourceTree = ""; }; + C0D7810A1ABF0AB6005FB0AA /* IQKeyboardManager Tests */ = { + isa = PBXGroup; + children = ( + C0D7810D1ABF0AB6005FB0AA /* IQKeyboardManager_Tests.m */, + C0D7810B1ABF0AB6005FB0AA /* Supporting Files */, + ); + path = "IQKeyboardManager Tests"; + sourceTree = ""; + }; + C0D7810B1ABF0AB6005FB0AA /* Supporting Files */ = { + isa = PBXGroup; + children = ( + C0D7810C1ABF0AB6005FB0AA /* Info.plist */, + ); + name = "Supporting Files"; + sourceTree = ""; + }; C0DD7E9F19D0A0AE007604CF /* KeyboardTextFieldDemoSwift */ = { isa = PBXGroup; children = ( @@ -712,6 +752,24 @@ productReference = C0B63B9B1781FAB1008D3B64 /* IQKeyboardManager.app */; productType = "com.apple.product-type.application"; }; + C0D781081ABF0AB6005FB0AA /* IQKeyboardManager Tests */ = { + isa = PBXNativeTarget; + buildConfigurationList = C0D781131ABF0AB6005FB0AA /* Build configuration list for PBXNativeTarget "IQKeyboardManager Tests" */; + buildPhases = ( + C0D781051ABF0AB6005FB0AA /* Sources */, + C0D781061ABF0AB6005FB0AA /* Frameworks */, + C0D781071ABF0AB6005FB0AA /* Resources */, + ); + buildRules = ( + ); + dependencies = ( + C0D781101ABF0AB6005FB0AA /* PBXTargetDependency */, + ); + name = "IQKeyboardManager Tests"; + productName = "IQKeyboardManager Tests"; + productReference = C0D781091ABF0AB6005FB0AA /* IQKeyboardManager Tests.xctest */; + productType = "com.apple.product-type.bundle.unit-test"; + }; /* End PBXNativeTarget section */ /* Begin PBXProject section */ @@ -727,6 +785,10 @@ C0B63B9A1781FAB1008D3B64 = { DevelopmentTeam = 7UUTF6T5P9; }; + C0D781081ABF0AB6005FB0AA = { + CreatedOnToolsVersion = 6.2; + TestTargetID = C0B63B9A1781FAB1008D3B64; + }; }; }; buildConfigurationList = C0B63B951781FAB0008D3B64 /* Build configuration list for PBXProject "IQKeyboardManager" */; @@ -746,6 +808,7 @@ C0B63B9A1781FAB1008D3B64 /* IQKeyboardManager */, 9D0BB87218BB232B00667349 /* KeyboardManager */, C0ACB0F419CF104B0057B571 /* IQKeyboardManager Swift */, + C0D781081ABF0AB6005FB0AA /* IQKeyboardManager Tests */, ); }; /* End PBXProject section */ @@ -793,6 +856,13 @@ ); runOnlyForDeploymentPostprocessing = 0; }; + C0D781071ABF0AB6005FB0AA /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; /* End PBXResourcesBuildPhase section */ /* Begin PBXShellScriptBuildPhase section */ @@ -897,8 +967,24 @@ ); runOnlyForDeploymentPostprocessing = 0; }; + C0D781051ABF0AB6005FB0AA /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + C0D7810E1ABF0AB6005FB0AA /* IQKeyboardManager_Tests.m in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; /* End PBXSourcesBuildPhase section */ +/* Begin PBXTargetDependency section */ + C0D781101ABF0AB6005FB0AA /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + target = C0B63B9A1781FAB1008D3B64 /* IQKeyboardManager */; + targetProxy = C0D7810F1ABF0AB6005FB0AA /* PBXContainerItemProxy */; + }; +/* End PBXTargetDependency section */ + /* Begin PBXVariantGroup section */ 9D0BB87818BB232B00667349 /* InfoPlist.strings */ = { isa = PBXVariantGroup; @@ -1154,6 +1240,60 @@ }; name = Release; }; + C0D781111ABF0AB6005FB0AA /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + BUNDLE_LOADER = "$(TEST_HOST)"; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + FRAMEWORK_SEARCH_PATHS = ( + "$(SDKROOT)/Developer/Library/Frameworks", + "$(inherited)", + ); + GCC_PREPROCESSOR_DEFINITIONS = ( + "DEBUG=1", + "$(inherited)", + ); + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + INFOPLIST_FILE = "IQKeyboardManager Tests/Info.plist"; + IPHONEOS_DEPLOYMENT_TARGET = 8.2; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; + MTL_ENABLE_DEBUG_INFO = YES; + PRODUCT_NAME = "$(TARGET_NAME)"; + TEST_HOST = "$(BUILT_PRODUCTS_DIR)/IQKeyboardManager.app/IQKeyboardManager"; + }; + name = Debug; + }; + C0D781121ABF0AB6005FB0AA /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + BUNDLE_LOADER = "$(TEST_HOST)"; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + COPY_PHASE_STRIP = NO; + ENABLE_NS_ASSERTIONS = NO; + FRAMEWORK_SEARCH_PATHS = ( + "$(SDKROOT)/Developer/Library/Frameworks", + "$(inherited)", + ); + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + INFOPLIST_FILE = "IQKeyboardManager Tests/Info.plist"; + IPHONEOS_DEPLOYMENT_TARGET = 8.2; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; + MTL_ENABLE_DEBUG_INFO = NO; + PRODUCT_NAME = "$(TARGET_NAME)"; + TEST_HOST = "$(BUILT_PRODUCTS_DIR)/IQKeyboardManager.app/IQKeyboardManager"; + }; + name = Release; + }; /* End XCBuildConfiguration section */ /* Begin XCConfigurationList section */ @@ -1193,6 +1333,15 @@ defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; }; + C0D781131ABF0AB6005FB0AA /* Build configuration list for PBXNativeTarget "IQKeyboardManager Tests" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + C0D781111ABF0AB6005FB0AA /* Debug */, + C0D781121ABF0AB6005FB0AA /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; /* End XCConfigurationList section */ }; rootObject = C0B63B921781FAB0008D3B64 /* Project object */; diff --git a/KeyboardTextFieldDemo/IQKeyboardManager.xcodeproj/project.xcworkspace/xcuserdata/iftekhar.xcuserdatad/UserInterfaceState.xcuserstate b/KeyboardTextFieldDemo/IQKeyboardManager.xcodeproj/project.xcworkspace/xcuserdata/iftekhar.xcuserdatad/UserInterfaceState.xcuserstate index 0a7dec3..eb72b7c 100644 Binary files a/KeyboardTextFieldDemo/IQKeyboardManager.xcodeproj/project.xcworkspace/xcuserdata/iftekhar.xcuserdatad/UserInterfaceState.xcuserstate and b/KeyboardTextFieldDemo/IQKeyboardManager.xcodeproj/project.xcworkspace/xcuserdata/iftekhar.xcuserdatad/UserInterfaceState.xcuserstate differ diff --git a/KeyboardTextFieldDemo/IQKeyboardManager.xcodeproj/xcuserdata/iftekhar.xcuserdatad/xcschemes/IQKeyboard.xcscheme b/KeyboardTextFieldDemo/IQKeyboardManager.xcodeproj/xcuserdata/iftekhar.xcuserdatad/xcschemes/IQKeyboard.xcscheme index ccc9f0d..cc3756c 100644 --- a/KeyboardTextFieldDemo/IQKeyboardManager.xcodeproj/xcuserdata/iftekhar.xcuserdatad/xcschemes/IQKeyboard.xcscheme +++ b/KeyboardTextFieldDemo/IQKeyboardManager.xcodeproj/xcuserdata/iftekhar.xcuserdatad/xcschemes/IQKeyboard.xcscheme @@ -20,6 +20,20 @@ ReferencedContainer = "container:IQKeyboardManager.xcodeproj"> + + + + + + + + - + - + primary + C0D781081ABF0AB6005FB0AA + + primary + +