Skip to content

Commit

Permalink
Fixed the window offset on iOS when resuming an app with a borderless…
Browse files Browse the repository at this point in the history
… or fullscreen window that has the on-screen keyboard visible.
  • Loading branch information
slime73 committed May 5, 2015
1 parent d603bb3 commit d1372bb
Show file tree
Hide file tree
Showing 2 changed files with 22 additions and 31 deletions.
47 changes: 16 additions & 31 deletions src/video/uikit/SDL_uikitviewcontroller.m
Expand Up @@ -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
Expand All @@ -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
Expand Down
6 changes: 6 additions & 0 deletions src/video/uikit/SDL_uikitwindow.m
Expand Up @@ -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];
}
Expand Down

0 comments on commit d1372bb

Please sign in to comment.