From 48d219cf45f47f3123e348b3cf934a8ab80bcef0 Mon Sep 17 00:00:00 2001 From: liukun <765409243@qq.com> Date: Fri, 25 Apr 2014 00:52:02 +0800 Subject: [PATCH 1/5] add `keyboardWillChangeFrame` support --- .../TPKeyboardAvoidingCollectionView.m | 1 + .../TPKeyboardAvoidingScrollView.m | 1 + .../TPKeyboardAvoidingTableView.m | 1 + ...UIScrollView+TPKeyboardAvoidingAdditions.h | 3 +- ...UIScrollView+TPKeyboardAvoidingAdditions.m | 40 +++++++++++++++++++ 5 files changed, 45 insertions(+), 1 deletion(-) diff --git a/TPKeyboardAvoiding/TPKeyboardAvoidingCollectionView.m b/TPKeyboardAvoiding/TPKeyboardAvoidingCollectionView.m index caad404e..3c53b6c9 100644 --- a/TPKeyboardAvoiding/TPKeyboardAvoidingCollectionView.m +++ b/TPKeyboardAvoiding/TPKeyboardAvoidingCollectionView.m @@ -17,6 +17,7 @@ @implementation TPKeyboardAvoidingCollectionView - (void)setup { [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(TPKeyboardAvoiding_keyboardWillShow:) name:UIKeyboardWillShowNotification object:nil]; [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(TPKeyboardAvoiding_keyboardWillHide:) name:UIKeyboardWillHideNotification object:nil]; + [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(TPKeyboardAvoiding_keyboardWillChangeFrame:) name:UIKeyboardWillChangeFrameNotification object:nil]; } -(id)initWithFrame:(CGRect)frame { diff --git a/TPKeyboardAvoiding/TPKeyboardAvoidingScrollView.m b/TPKeyboardAvoiding/TPKeyboardAvoidingScrollView.m index 2959ec03..a5a23c28 100644 --- a/TPKeyboardAvoiding/TPKeyboardAvoidingScrollView.m +++ b/TPKeyboardAvoiding/TPKeyboardAvoidingScrollView.m @@ -17,6 +17,7 @@ @implementation TPKeyboardAvoidingScrollView - (void)setup { [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(TPKeyboardAvoiding_keyboardWillShow:) name:UIKeyboardWillShowNotification object:nil]; [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(TPKeyboardAvoiding_keyboardWillHide:) name:UIKeyboardWillHideNotification object:nil]; + [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(TPKeyboardAvoiding_keyboardWillChangeFrame:) name:UIKeyboardWillChangeFrameNotification object:nil]; } -(id)initWithFrame:(CGRect)frame { diff --git a/TPKeyboardAvoiding/TPKeyboardAvoidingTableView.m b/TPKeyboardAvoiding/TPKeyboardAvoidingTableView.m index e1b57efa..dcfed357 100644 --- a/TPKeyboardAvoiding/TPKeyboardAvoidingTableView.m +++ b/TPKeyboardAvoiding/TPKeyboardAvoidingTableView.m @@ -17,6 +17,7 @@ @implementation TPKeyboardAvoidingTableView - (void)setup { [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(TPKeyboardAvoiding_keyboardWillShow:) name:UIKeyboardWillShowNotification object:nil]; [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(TPKeyboardAvoiding_keyboardWillHide:) name:UIKeyboardWillHideNotification object:nil]; + [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(TPKeyboardAvoiding_keyboardWillChangeFrame:) name:UIKeyboardWillChangeFrameNotification object:nil]; } -(id)initWithFrame:(CGRect)frame { diff --git a/TPKeyboardAvoiding/UIScrollView+TPKeyboardAvoidingAdditions.h b/TPKeyboardAvoiding/UIScrollView+TPKeyboardAvoidingAdditions.h index 86c15183..c82dab40 100644 --- a/TPKeyboardAvoiding/UIScrollView+TPKeyboardAvoidingAdditions.h +++ b/TPKeyboardAvoiding/UIScrollView+TPKeyboardAvoidingAdditions.h @@ -13,10 +13,11 @@ - (void)TPKeyboardAvoiding_scrollToActiveTextField; - (void)TPKeyboardAvoiding_keyboardWillShow:(NSNotification*)notification; +- (void)TPKeyboardAvoiding_keyboardWillChangeFrame:(NSNotification *)notification; - (void)TPKeyboardAvoiding_keyboardWillHide:(NSNotification*)notification; - (void)TPKeyboardAvoiding_updateContentInset; - (void)TPKeyboardAvoiding_updateFromContentSizeChange; - (void)TPKeyboardAvoiding_assignTextDelegateForViewsBeneathView:(UIView*)view; - (UIView*)TPKeyboardAvoiding_findFirstResponderBeneathView:(UIView*)view; --(CGSize)TPKeyboardAvoiding_calculatedContentSizeFromSubviewFrames; +- (CGSize)TPKeyboardAvoiding_calculatedContentSizeFromSubviewFrames; @end diff --git a/TPKeyboardAvoiding/UIScrollView+TPKeyboardAvoidingAdditions.m b/TPKeyboardAvoiding/UIScrollView+TPKeyboardAvoidingAdditions.m index 782a9e96..bce06149 100644 --- a/TPKeyboardAvoiding/UIScrollView+TPKeyboardAvoidingAdditions.m +++ b/TPKeyboardAvoiding/UIScrollView+TPKeyboardAvoidingAdditions.m @@ -83,6 +83,46 @@ - (void)TPKeyboardAvoiding_keyboardWillShow:(NSNotification*)notification { [UIView commitAnimations]; } +- (void)TPKeyboardAvoiding_keyboardWillChangeFrame:(NSNotification *)notification{ + TPKeyboardAvoidingState *state = self.keyboardAvoidingState; + + UIView *firstResponder = [self TPKeyboardAvoiding_findFirstResponderBeneathView:self]; + + state.keyboardRect = [self convertRect:[[[notification userInfo] objectForKey:_UIKeyboardFrameEndUserInfoKey] CGRectValue] fromView:nil]; + state.keyboardVisible = YES; + state.priorInset = self.contentInset; + state.priorScrollIndicatorInsets = self.scrollIndicatorInsets; + + if ( [self isKindOfClass:[TPKeyboardAvoidingScrollView class]] ) { + state.priorContentSize = self.contentSize; + + if ( CGSizeEqualToSize(self.contentSize, CGSizeZero) ) { + // Set the content size, if it's not set. Do not set content size explicitly if auto-layout + // is being used to manage subviews + self.contentSize = [self TPKeyboardAvoiding_calculatedContentSizeFromSubviewFrames]; + } + } + + // Shrink view's inset by the keyboard's height, and scroll to show the text field/view being edited + [UIView beginAnimations:nil context:NULL]; + [UIView setAnimationCurve:[[[notification userInfo] objectForKey:UIKeyboardAnimationCurveUserInfoKey] intValue]]; + [UIView setAnimationDuration:[[[notification userInfo] objectForKey:UIKeyboardAnimationDurationUserInfoKey] floatValue]]; + + self.contentInset = [self TPKeyboardAvoiding_contentInsetForKeyboard]; + + if ( firstResponder ) { + CGFloat viewableHeight = self.bounds.size.height - self.contentInset.top - self.contentInset.bottom; + [self setContentOffset:CGPointMake(self.contentOffset.x, + [self TPKeyboardAvoiding_idealOffsetForView:firstResponder + withViewingAreaHeight:viewableHeight]) + animated:NO]; + } + + self.scrollIndicatorInsets = self.contentInset; + + [UIView commitAnimations]; +} + - (void)TPKeyboardAvoiding_keyboardWillHide:(NSNotification*)notification { TPKeyboardAvoidingState *state = self.keyboardAvoidingState; From 419b50a77dcb0f6ca9d31bca8e902ccf5046180a Mon Sep 17 00:00:00 2001 From: liukun <765409243@qq.com> Date: Fri, 25 Apr 2014 01:14:43 +0800 Subject: [PATCH 2/5] add filter for keyboardWillChangeFrame method --- .../UIScrollView+TPKeyboardAvoidingAdditions.m | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/TPKeyboardAvoiding/UIScrollView+TPKeyboardAvoidingAdditions.m b/TPKeyboardAvoiding/UIScrollView+TPKeyboardAvoidingAdditions.m index bce06149..bb2e5a70 100644 --- a/TPKeyboardAvoiding/UIScrollView+TPKeyboardAvoidingAdditions.m +++ b/TPKeyboardAvoiding/UIScrollView+TPKeyboardAvoidingAdditions.m @@ -86,13 +86,15 @@ - (void)TPKeyboardAvoiding_keyboardWillShow:(NSNotification*)notification { - (void)TPKeyboardAvoiding_keyboardWillChangeFrame:(NSNotification *)notification{ TPKeyboardAvoidingState *state = self.keyboardAvoidingState; + if ([[[notification userInfo] objectForKey:UIKeyboardAnimationDurationUserInfoKey] floatValue] > 0.0f ) { + return; + } + UIView *firstResponder = [self TPKeyboardAvoiding_findFirstResponderBeneathView:self]; state.keyboardRect = [self convertRect:[[[notification userInfo] objectForKey:_UIKeyboardFrameEndUserInfoKey] CGRectValue] fromView:nil]; state.keyboardVisible = YES; - state.priorInset = self.contentInset; - state.priorScrollIndicatorInsets = self.scrollIndicatorInsets; - + if ( [self isKindOfClass:[TPKeyboardAvoidingScrollView class]] ) { state.priorContentSize = self.contentSize; From 7a9959de6c46cc3274e1d6e45451316bbcea2855 Mon Sep 17 00:00:00 2001 From: liukun <765409243@qq.com> Date: Tue, 10 Jun 2014 17:05:37 +0800 Subject: [PATCH 3/5] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../UIScrollView+TPKeyboardAvoidingAdditions.m | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/TPKeyboardAvoiding/UIScrollView+TPKeyboardAvoidingAdditions.m b/TPKeyboardAvoiding/UIScrollView+TPKeyboardAvoidingAdditions.m index bb2e5a70..d3ee3d7d 100644 --- a/TPKeyboardAvoiding/UIScrollView+TPKeyboardAvoidingAdditions.m +++ b/TPKeyboardAvoiding/UIScrollView+TPKeyboardAvoidingAdditions.m @@ -48,7 +48,7 @@ - (void)TPKeyboardAvoiding_keyboardWillShow:(NSNotification*)notification { UIView *firstResponder = [self TPKeyboardAvoiding_findFirstResponderBeneathView:self]; - state.keyboardRect = [self convertRect:[[[notification userInfo] objectForKey:_UIKeyboardFrameEndUserInfoKey] CGRectValue] fromView:nil]; + state.keyboardRect = [[[notification userInfo] objectForKey:_UIKeyboardFrameEndUserInfoKey] CGRectValue]; state.keyboardVisible = YES; state.priorInset = self.contentInset; state.priorScrollIndicatorInsets = self.scrollIndicatorInsets; @@ -92,7 +92,7 @@ - (void)TPKeyboardAvoiding_keyboardWillChangeFrame:(NSNotification *)notificatio UIView *firstResponder = [self TPKeyboardAvoiding_findFirstResponderBeneathView:self]; - state.keyboardRect = [self convertRect:[[[notification userInfo] objectForKey:_UIKeyboardFrameEndUserInfoKey] CGRectValue] fromView:nil]; + state.keyboardRect = [[[notification userInfo] objectForKey:_UIKeyboardFrameEndUserInfoKey] CGRectValue]; state.keyboardVisible = YES; if ( [self isKindOfClass:[TPKeyboardAvoidingScrollView class]] ) { @@ -269,7 +269,7 @@ - (UIEdgeInsets)TPKeyboardAvoiding_contentInsetForKeyboard { TPKeyboardAvoidingState *state = self.keyboardAvoidingState; UIEdgeInsets newInset = self.contentInset; CGRect keyboardRect = state.keyboardRect; - newInset.bottom = keyboardRect.size.height - (CGRectGetMaxY(keyboardRect) - CGRectGetMaxY(self.bounds)); + newInset.bottom = keyboardRect.size.height - (CGRectGetMaxY(keyboardRect) - CGRectGetMaxY(self.frame)); return newInset; } From 156a5b6b496832ddabf9eb2a2206bbc4ed8277ff Mon Sep 17 00:00:00 2001 From: liukun <765409243@qq.com> Date: Wed, 11 Jun 2014 10:28:17 +0800 Subject: [PATCH 4/5] =?UTF-8?q?=E4=BF=AE=E5=A4=8Dbug?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- TPKeyboardAvoiding/UIScrollView+TPKeyboardAvoidingAdditions.m | 1 + 1 file changed, 1 insertion(+) diff --git a/TPKeyboardAvoiding/UIScrollView+TPKeyboardAvoidingAdditions.m b/TPKeyboardAvoiding/UIScrollView+TPKeyboardAvoidingAdditions.m index d3ee3d7d..e6347bf7 100644 --- a/TPKeyboardAvoiding/UIScrollView+TPKeyboardAvoidingAdditions.m +++ b/TPKeyboardAvoiding/UIScrollView+TPKeyboardAvoidingAdditions.m @@ -269,6 +269,7 @@ - (UIEdgeInsets)TPKeyboardAvoiding_contentInsetForKeyboard { TPKeyboardAvoidingState *state = self.keyboardAvoidingState; UIEdgeInsets newInset = self.contentInset; CGRect keyboardRect = state.keyboardRect; + CGRect bounds = [self.superview convertRect:self.frame toView:nil]; newInset.bottom = keyboardRect.size.height - (CGRectGetMaxY(keyboardRect) - CGRectGetMaxY(self.frame)); return newInset; } From f8451a646fef53a349a38499a4c00678bd534b01 Mon Sep 17 00:00:00 2001 From: liukun <765409243@qq.com> Date: Wed, 11 Jun 2014 10:32:33 +0800 Subject: [PATCH 5/5] =?UTF-8?q?=E4=BF=AE=E6=94=B9=E2=80=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- TPKeyboardAvoiding/UIScrollView+TPKeyboardAvoidingAdditions.m | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/TPKeyboardAvoiding/UIScrollView+TPKeyboardAvoidingAdditions.m b/TPKeyboardAvoiding/UIScrollView+TPKeyboardAvoidingAdditions.m index e6347bf7..4dd5d90e 100644 --- a/TPKeyboardAvoiding/UIScrollView+TPKeyboardAvoidingAdditions.m +++ b/TPKeyboardAvoiding/UIScrollView+TPKeyboardAvoidingAdditions.m @@ -270,7 +270,7 @@ - (UIEdgeInsets)TPKeyboardAvoiding_contentInsetForKeyboard { UIEdgeInsets newInset = self.contentInset; CGRect keyboardRect = state.keyboardRect; CGRect bounds = [self.superview convertRect:self.frame toView:nil]; - newInset.bottom = keyboardRect.size.height - (CGRectGetMaxY(keyboardRect) - CGRectGetMaxY(self.frame)); + newInset.bottom = keyboardRect.size.height - (CGRectGetMaxY(keyboardRect) - CGRectGetMaxY(bounds)); return newInset; }