diff --git a/IQKeyboardManager/IQKeyboardManager.h b/IQKeyboardManager/IQKeyboardManager.h index 21a1186c..f4453f45 100755 --- a/IQKeyboardManager/IQKeyboardManager.h +++ b/IQKeyboardManager/IQKeyboardManager.h @@ -240,6 +240,17 @@ extern NSInteger const kIQPreviousNextButtonToolbarTag; */ @property(nonatomic, assign) BOOL shouldFixInteractivePopGestureRecognizer; +#ifdef __IPHONE_11_0 +///--------------------------- +/// @name Safe Area +///--------------------------- + +/** + If YES, then library will try to adjust viewController.additionalSafeAreaInsets to automatically handle layout guide. Default is NO. + */ +@property(nonatomic, assign) BOOL canAdjustAdditionalSafeAreaInsets; +#endif + ///--------------------------------------------- /// @name Class Level enabling/disabling methods ///--------------------------------------------- diff --git a/IQKeyboardManager/IQKeyboardManager.m b/IQKeyboardManager/IQKeyboardManager.m index c348f983..39e3e3eb 100644 --- a/IQKeyboardManager/IQKeyboardManager.m +++ b/IQKeyboardManager/IQKeyboardManager.m @@ -560,23 +560,26 @@ -(void)setRootViewFrame:(CGRect)frame #ifdef __IPHONE_11_0 UIEdgeInsets safeAreaNewInset = UIEdgeInsetsZero; - if (@available(iOS 11.0, *)) { - safeAreaNewInset = self.initialAdditionalSafeAreaInsets; - CGFloat viewMovement = CGRectGetMaxY(_topViewBeginRect)-CGRectGetMaxY(frame); - - //Maintain keyboardDistanceFromTextField - CGFloat specialKeyboardDistanceFromTextField = _textFieldView.keyboardDistanceFromTextField; - - if (_textFieldView.isSearchBarTextField) - { - UISearchBar *searchBar = (UISearchBar*)[_textFieldView superviewOfClassType:[UISearchBar class]]; - specialKeyboardDistanceFromTextField = searchBar.keyboardDistanceFromTextField; + if (self.canAdjustAdditionalSafeAreaInsets == YES) + { + if (@available(iOS 11.0, *)) { + safeAreaNewInset = self.initialAdditionalSafeAreaInsets; + CGFloat viewMovement = CGRectGetMaxY(_topViewBeginRect)-CGRectGetMaxY(frame); + + //Maintain keyboardDistanceFromTextField + CGFloat specialKeyboardDistanceFromTextField = _textFieldView.keyboardDistanceFromTextField; + + if (_textFieldView.isSearchBarTextField) + { + UISearchBar *searchBar = (UISearchBar*)[_textFieldView superviewOfClassType:[UISearchBar class]]; + specialKeyboardDistanceFromTextField = searchBar.keyboardDistanceFromTextField; + } + + CGFloat keyboardDistanceFromTextField = (specialKeyboardDistanceFromTextField == kIQUseDefaultKeyboardDistance)?_keyboardDistanceFromTextField:specialKeyboardDistanceFromTextField; + + CGFloat textFieldDistance = _textFieldView.frame.size.height + keyboardDistanceFromTextField; + safeAreaNewInset.bottom += MIN(viewMovement, textFieldDistance); } - - CGFloat keyboardDistanceFromTextField = (specialKeyboardDistanceFromTextField == kIQUseDefaultKeyboardDistance)?_keyboardDistanceFromTextField:specialKeyboardDistanceFromTextField; - - CGFloat textFieldDistance = _textFieldView.frame.size.height + keyboardDistanceFromTextField; - safeAreaNewInset.bottom += MIN(viewMovement, textFieldDistance); } #endif @@ -586,8 +589,11 @@ -(void)setRootViewFrame:(CGRect)frame __strong typeof(self) strongSelf = weakSelf; #ifdef __IPHONE_11_0 - if (@available(iOS 11.0, *)) { - controller.additionalSafeAreaInsets = safeAreaNewInset; + if (self.canAdjustAdditionalSafeAreaInsets == YES) + { + if (@available(iOS 11.0, *)) { + controller.additionalSafeAreaInsets = safeAreaNewInset; + } } #endif diff --git a/IQKeyboardManagerSwift/IQKeyboardManager.swift b/IQKeyboardManagerSwift/IQKeyboardManager.swift index 3c45b0a0..34df9b99 100644 --- a/IQKeyboardManagerSwift/IQKeyboardManager.swift +++ b/IQKeyboardManagerSwift/IQKeyboardManager.swift @@ -669,7 +669,17 @@ open class IQKeyboardManager: NSObject, UIGestureRecognizerDelegate { */ open var shouldFixInteractivePopGestureRecognizer = true - +#if swift(>=3.2) + ///------------------------------------ + /// MARK: Safe Area + ///------------------------------------ + + /** + If YES, then library will try to adjust viewController.additionalSafeAreaInsets to automatically handle layout guide. Default is NO. + */ + open var canAdjustAdditionalSafeAreaInsets = false +#endif + ///------------------------------------ /// MARK: Class Level disabling methods ///------------------------------------ @@ -915,26 +925,29 @@ open class IQKeyboardManager: NSObject, UIGestureRecognizerDelegate { var safeAreaNewInset = UIEdgeInsets.zero; #if swift(>=3.2) - if #available(iOS 11, *) { - - if let textFieldView = _textFieldView { - safeAreaNewInset = _initialAdditionalSafeAreaInsets; - let viewMovement : CGFloat = _topViewBeginRect.maxY - newFrame.maxY; - - //Maintain keyboardDistanceFromTextField - var specialKeyboardDistanceFromTextField = textFieldView.keyboardDistanceFromTextField + if canAdjustAdditionalSafeAreaInsets { + + if #available(iOS 11, *) { - if textFieldView.isSearchBarTextField() { + if let textFieldView = _textFieldView { + safeAreaNewInset = _initialAdditionalSafeAreaInsets; + let viewMovement : CGFloat = _topViewBeginRect.maxY - newFrame.maxY; + + //Maintain keyboardDistanceFromTextField + var specialKeyboardDistanceFromTextField = textFieldView.keyboardDistanceFromTextField - if let searchBar = textFieldView.superviewOfClassType(UISearchBar.self) { - specialKeyboardDistanceFromTextField = searchBar.keyboardDistanceFromTextField + if textFieldView.isSearchBarTextField() { + + if let searchBar = textFieldView.superviewOfClassType(UISearchBar.self) { + specialKeyboardDistanceFromTextField = searchBar.keyboardDistanceFromTextField + } } + + let newKeyboardDistanceFromTextField = (specialKeyboardDistanceFromTextField == kIQUseDefaultKeyboardDistance) ? keyboardDistanceFromTextField : specialKeyboardDistanceFromTextField + + let textFieldDistance = textFieldView.frame.size.height + newKeyboardDistanceFromTextField; + safeAreaNewInset.bottom += min(viewMovement, textFieldDistance); } - - let newKeyboardDistanceFromTextField = (specialKeyboardDistanceFromTextField == kIQUseDefaultKeyboardDistance) ? keyboardDistanceFromTextField : specialKeyboardDistanceFromTextField - - let textFieldDistance = textFieldView.frame.size.height + newKeyboardDistanceFromTextField; - safeAreaNewInset.bottom += min(viewMovement, textFieldDistance); } } #endif @@ -943,8 +956,10 @@ open class IQKeyboardManager: NSObject, UIGestureRecognizerDelegate { UIView.animate(withDuration: _animationDuration, delay: 0, options: UIViewAnimationOptions.beginFromCurrentState.union(_animationCurve), animations: { () -> Void in #if swift(>=3.2) - if #available(iOS 11, *) { - unwrappedController.additionalSafeAreaInsets = safeAreaNewInset; + if self.canAdjustAdditionalSafeAreaInsets { + if #available(iOS 11, *) { + unwrappedController.additionalSafeAreaInsets = safeAreaNewInset; + } } #endif @@ -1813,7 +1828,7 @@ open class IQKeyboardManager: NSObject, UIGestureRecognizerDelegate { if let window = keyWindow() { _topViewBeginRect.origin.y = window.frame.size.height-rootViewController.view.frame.size.height } else { - _topViewBeginRect.origin.y =0 + _topViewBeginRect.origin.y = 0 } }