From d1372bb92c5ee036a9fdb72f76f993a6e6994f1b Mon Sep 17 00:00:00 2001 From: Alex Szpakowski Date: Tue, 5 May 2015 16:20:11 -0300 Subject: [PATCH] Fixed the window offset on iOS when resuming an app with a borderless or fullscreen window that has the on-screen keyboard visible. --- src/video/uikit/SDL_uikitviewcontroller.m | 47 ++++++++--------------- src/video/uikit/SDL_uikitwindow.m | 6 +++ 2 files changed, 22 insertions(+), 31 deletions(-) diff --git a/src/video/uikit/SDL_uikitviewcontroller.m b/src/video/uikit/SDL_uikitviewcontroller.m index af1f68dc11cd1..7ebc1173c7a48 100644 --- a/src/video/uikit/SDL_uikitviewcontroller.m +++ b/src/video/uikit/SDL_uikitviewcontroller.m @@ -212,28 +212,12 @@ - (void)hideKeyboard - (void)keyboardWillShow:(NSNotification *)notification { CGRect kbrect = [[notification userInfo][UIKeyboardFrameBeginUserInfoKey] CGRectValue]; - UIView *view = self.view; - int height = 0; - - /* The keyboard rect is in the coordinate space of the screen, but we want - * its height in the view's coordinate space. */ -#ifdef __IPHONE_8_0 - if ([view respondsToSelector:@selector(convertRect:fromCoordinateSpace:)]) { - UIScreen *screen = view.window.screen; - kbrect = [view convertRect:kbrect fromCoordinateSpace:screen.coordinateSpace]; - height = kbrect.size.height; - } else -#endif - { - /* In iOS 7 and below, the screen's coordinate space is never rotated. */ - if (UIInterfaceOrientationIsLandscape([UIApplication sharedApplication].statusBarOrientation)) { - height = kbrect.size.width; - } else { - height = kbrect.size.height; - } - } - [self setKeyboardHeight:height]; + /* The keyboard rect is in the coordinate space of the screen/window, but we + * want its height in the coordinate space of the view. */ + kbrect = [self.view convertRect:kbrect fromView:nil]; + + [self setKeyboardHeight:(int)kbrect.size.height]; } - (void)keyboardWillHide:(NSNotification *)notification @@ -243,28 +227,29 @@ - (void)keyboardWillHide:(NSNotification *)notification - (void)updateKeyboard { - SDL_Rect textrect = self.textInputRect; CGAffineTransform t = self.view.transform; CGPoint offset = CGPointMake(0.0, 0.0); + CGRect frame = UIKit_ComputeViewFrame(window, self.view.window.screen); if (self.keyboardHeight) { - int rectbottom = textrect.y + textrect.h; - int kbottom = self.view.bounds.size.height - self.keyboardHeight; - if (kbottom < rectbottom) { - offset.y = kbottom - rectbottom; + int rectbottom = self.textInputRect.y + self.textInputRect.h; + int keybottom = self.view.bounds.size.height - self.keyboardHeight; + if (keybottom < rectbottom) { + offset.y = keybottom - rectbottom; } } - /* Put the offset into the this view transform's coordinate space. */ + /* Apply this view's transform (except any translation) to the offset, in + * order to orient it correctly relative to the frame's coordinate space. */ t.tx = 0.0; t.ty = 0.0; offset = CGPointApplyAffineTransform(offset, t); - t.tx = offset.x; - t.ty = offset.y; + /* Apply the updated offset to the view's frame. */ + frame.origin.x += offset.x; + frame.origin.y += offset.y; - /* Move the view by applying the updated transform. */ - self.view.transform = t; + self.view.frame = frame; } - (void)setKeyboardHeight:(int)height diff --git a/src/video/uikit/SDL_uikitwindow.m b/src/video/uikit/SDL_uikitwindow.m index 4010ca68c7239..8647fce359e1f 100644 --- a/src/video/uikit/SDL_uikitwindow.m +++ b/src/video/uikit/SDL_uikitwindow.m @@ -273,6 +273,12 @@ static int SetupWindowData(_THIS, SDL_Window *window, UIWindow *uiwindow, SDL_bo /* Update the view's frame to account for the status bar change. */ viewcontroller.view.frame = UIKit_ComputeViewFrame(window, data.uiwindow.screen); + +#ifdef SDL_IPHONE_KEYBOARD + /* Make sure the view is offset correctly when the keyboard is visible. */ + [viewcontroller updateKeyboard]; +#endif + [viewcontroller.view setNeedsLayout]; [viewcontroller.view layoutIfNeeded]; }