Skip to content

Commit

Permalink
Added canAdjustAdditionalSafeAreaInsets to control safe area adjustme…
Browse files Browse the repository at this point in the history
…nts by developer
  • Loading branch information
hackiftekhar committed Oct 12, 2017
1 parent 7e71205 commit 66a39b3
Show file tree
Hide file tree
Showing 3 changed files with 70 additions and 38 deletions.
11 changes: 11 additions & 0 deletions IQKeyboardManager/IQKeyboardManager.h
Original file line number Diff line number Diff line change
Expand Up @@ -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
///---------------------------------------------
Expand Down
42 changes: 24 additions & 18 deletions IQKeyboardManager/IQKeyboardManager.m
Original file line number Diff line number Diff line change
Expand Up @@ -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

Expand All @@ -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

Expand Down
55 changes: 35 additions & 20 deletions IQKeyboardManagerSwift/IQKeyboardManager.swift
Original file line number Diff line number Diff line change
Expand Up @@ -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
///------------------------------------
Expand Down Expand Up @@ -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
Expand All @@ -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

Expand Down Expand Up @@ -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
}
}

Expand Down

0 comments on commit 66a39b3

Please sign in to comment.