Fixed the window offset on iOS when resuming an app with a borderless or fullscreen window that has the on-screen keyboard visible.
authorAlex Szpakowski <slime73@gmail.com>
Tue, 05 May 2015 16:20:11 -0300
changeset 9585 8339700453c6
parent 9584 fceb5503cadf
child 9586 037074526d4c
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
src/video/uikit/SDL_uikitwindow.m
--- a/src/video/uikit/SDL_uikitviewcontroller.m	Tue May 05 16:16:10 2015 -0300
+++ b/src/video/uikit/SDL_uikitviewcontroller.m	Tue May 05 16:20:11 2015 -0300
@@ -212,28 +212,12 @@
 - (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;
-        }
-    }
+    /* 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:height];
+    [self setKeyboardHeight:(int)kbrect.size.height];
 }
 
 - (void)keyboardWillHide:(NSNotification *)notification
@@ -243,28 +227,29 @@
 
 - (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
--- a/src/video/uikit/SDL_uikitwindow.m	Tue May 05 16:16:10 2015 -0300
+++ b/src/video/uikit/SDL_uikitwindow.m	Tue May 05 16:20:11 2015 -0300
@@ -273,6 +273,12 @@
 
     /* 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];
 }