diff --git a/TPKeyboardAvoiding/UIScrollView+TPKeyboardAvoidingAdditions.h b/TPKeyboardAvoiding/UIScrollView+TPKeyboardAvoidingAdditions.h index 56aaefc5..c136040f 100644 --- a/TPKeyboardAvoiding/UIScrollView+TPKeyboardAvoidingAdditions.h +++ b/TPKeyboardAvoiding/UIScrollView+TPKeyboardAvoidingAdditions.h @@ -19,4 +19,9 @@ - (void)TPKeyboardAvoiding_assignTextDelegateForViewsBeneathView:(UIView*)view; - (UIView*)TPKeyboardAvoiding_findFirstResponderBeneathView:(UIView*)view; -(CGSize)TPKeyboardAvoiding_calculatedContentSizeFromSubviewFrames; + +/// When set, apply an additional content offset to the offset +/// TPKeyboardAvoiding would apply normally. +- (void)TPKeyboardAvoiding_setAdditionalContentOffset:(CGPoint)contentOffset; + @end diff --git a/TPKeyboardAvoiding/UIScrollView+TPKeyboardAvoidingAdditions.m b/TPKeyboardAvoiding/UIScrollView+TPKeyboardAvoidingAdditions.m index 954b1eb1..f6df3074 100644 --- a/TPKeyboardAvoiding/UIScrollView+TPKeyboardAvoidingAdditions.m +++ b/TPKeyboardAvoiding/UIScrollView+TPKeyboardAvoidingAdditions.m @@ -26,6 +26,7 @@ @interface TPKeyboardAvoidingState : NSObject @property (nonatomic, assign) BOOL keyboardVisible; @property (nonatomic, assign) CGRect keyboardRect; @property (nonatomic, assign) CGSize priorContentSize; +@property (nonatomic, assign) CGPoint additionalContentOffset; @property (nonatomic) BOOL priorPagingEnabled; @@ -88,9 +89,10 @@ - (void)TPKeyboardAvoiding_keyboardWillShow:(NSNotification*)notification { self.contentInset = [self TPKeyboardAvoiding_contentInsetForKeyboard]; CGFloat viewableHeight = self.bounds.size.height - self.contentInset.top - self.contentInset.bottom; - [self setContentOffset:CGPointMake(self.contentOffset.x, + [self setContentOffset:CGPointMake(self.contentOffset.x + state.additionalContentOffset.x, [self TPKeyboardAvoiding_idealOffsetForView:firstResponder - withViewingAreaHeight:viewableHeight]) + withViewingAreaHeight:viewableHeight] + + state.additionalContentOffset.y) animated:NO]; self.scrollIndicatorInsets = self.contentInset; @@ -172,8 +174,10 @@ -(void)TPKeyboardAvoiding_scrollToActiveTextField { CGFloat visibleSpace = self.bounds.size.height - self.contentInset.top - self.contentInset.bottom; - CGPoint idealOffset = CGPointMake(0, [self TPKeyboardAvoiding_idealOffsetForView:[self TPKeyboardAvoiding_findFirstResponderBeneathView:self] - withViewingAreaHeight:visibleSpace]); + CGPoint idealOffset = CGPointMake(0 + state.additionalContentOffset.x, + [self TPKeyboardAvoiding_idealOffsetForView:[self TPKeyboardAvoiding_findFirstResponderBeneathView:self] + withViewingAreaHeight:visibleSpace] + + state.additionalContentOffset.y); // Ordinarily we'd use -setContentOffset:animated:YES here, but it interferes with UIScrollView // behavior which automatically ensures that the first responder is within its bounds @@ -182,6 +186,11 @@ -(void)TPKeyboardAvoiding_scrollToActiveTextField { }); } +- (void)TPKeyboardAvoiding_setAdditionalContentOffset:(CGPoint)contentOffset { + TPKeyboardAvoidingState *state = self.keyboardAvoidingState; + state.additionalContentOffset = contentOffset; +} + #pragma mark - Helpers - (UIView*)TPKeyboardAvoiding_findFirstResponderBeneathView:(UIView*)view {