From 3d0f521be5da5b08e5942849bbb9e95def06834c Mon Sep 17 00:00:00 2001 From: Alex Szpakowski Date: Fri, 18 Aug 2017 23:23:30 -0300 Subject: [PATCH] iOS 10: Work around screen bounds orientation bug. Fixes bugs #3465 and #3505. --- src/video/uikit/SDL_uikitvideo.m | 27 +++++++++++++++++++++-- src/video/uikit/SDL_uikitviewcontroller.m | 3 ++- 2 files changed, 27 insertions(+), 3 deletions(-) diff --git a/src/video/uikit/SDL_uikitvideo.m b/src/video/uikit/SDL_uikitvideo.m index 496cb1f27b6d2..617ce093b3078 100644 --- a/src/video/uikit/SDL_uikitvideo.m +++ b/src/video/uikit/SDL_uikitvideo.m @@ -176,16 +176,39 @@ static void UIKit_DeleteDevice(SDL_VideoDevice * device) CGRect UIKit_ComputeViewFrame(SDL_Window *window, UIScreen *screen) { + CGRect frame = screen.bounds; + #if !TARGET_OS_TV && (__IPHONE_OS_VERSION_MIN_REQUIRED < __IPHONE_7_0) BOOL hasiOS7 = UIKit_IsSystemVersionAtLeast(7.0); /* The view should always show behind the status bar in iOS 7+. */ if (!hasiOS7 && !(window->flags & (SDL_WINDOW_BORDERLESS|SDL_WINDOW_FULLSCREEN))) { - return screen.applicationFrame; + frame = screen.applicationFrame; + } +#endif + +#if !TARGET_OS_TV + /* iOS 10 seems to have a bug where, in certain conditions, putting the + * device to sleep with the a landscape-only app open, re-orienting the + * device to portrait, and turning it back on will result in the screen + * bounds returning portrait orientation despite the app being in landscape. + * This is a workaround until a better solution can be found. + * https://bugzilla.libsdl.org/show_bug.cgi?id=3505 + * https://bugzilla.libsdl.org/show_bug.cgi?id=3465 + * https://forums.developer.apple.com/thread/65337 */ + if (UIKit_IsSystemVersionAtLeast(8.0)) { + UIInterfaceOrientation orient = [UIApplication sharedApplication].statusBarOrientation; + BOOL isLandscape = UIInterfaceOrientationIsLandscape(orient); + + if (isLandscape != (frame.size.width > frame.size.height)) { + float height = frame.size.width; + frame.size.width = frame.size.height; + frame.size.height = height; + } } #endif - return screen.bounds; + return frame; } /* diff --git a/src/video/uikit/SDL_uikitviewcontroller.m b/src/video/uikit/SDL_uikitviewcontroller.m index 513da8779655f..6c3c23bbe2c50 100644 --- a/src/video/uikit/SDL_uikitviewcontroller.m +++ b/src/video/uikit/SDL_uikitviewcontroller.m @@ -293,8 +293,9 @@ - (void)keyboardWillShow:(NSNotification *)notification - (void)keyboardWillHide:(NSNotification *)notification { - if (!rotatingOrientation) + if (!rotatingOrientation) { SDL_StopTextInput(); + } [self setKeyboardHeight:0]; }