From 9f863b1fd80ee412eb2c9b32754e82210b1a15ce Mon Sep 17 00:00:00 2001 From: Michael Hills Date: Sat, 12 Sep 2020 01:43:38 +1000 Subject: [PATCH] Fix view frame in portrait when starting iOS app in landscape --- CHANGELOG.md | 1 + src/platform_impl/ios/ffi.rs | 6 +++--- src/platform_impl/ios/view.rs | 13 +++++++++++-- 3 files changed, 15 insertions(+), 5 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index dce45aa1a3..85f14fe6be 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -33,6 +33,7 @@ - On macOS, updated core-* dependencies and cocoa. - Bump `parking_lot` to 0.11 - On Android, bump `ndk`, `ndk-sys` and `ndk-glue` to 0.2. Checkout the new ndk-glue main proc attribute. +- On iOS, fixed starting the app in landscape where the view still had portrait dimensions. # 0.22.2 (2020-05-16) diff --git a/src/platform_impl/ios/ffi.rs b/src/platform_impl/ios/ffi.rs index 071b586795..726723f30b 100644 --- a/src/platform_impl/ios/ffi.rs +++ b/src/platform_impl/ios/ffi.rs @@ -29,14 +29,14 @@ pub struct NSOperatingSystemVersion { } #[repr(C)] -#[derive(Debug, Clone)] +#[derive(Debug, Clone, Copy, PartialEq)] pub struct CGPoint { pub x: CGFloat, pub y: CGFloat, } #[repr(C)] -#[derive(Debug, Clone)] +#[derive(Debug, Clone, Copy, PartialEq)] pub struct CGSize { pub width: CGFloat, pub height: CGFloat, @@ -52,7 +52,7 @@ impl CGSize { } #[repr(C)] -#[derive(Debug, Clone)] +#[derive(Debug, Clone, Copy, PartialEq)] pub struct CGRect { pub origin: CGPoint, pub size: CGSize, diff --git a/src/platform_impl/ios/view.rs b/src/platform_impl/ios/view.rs index 5481b8eff5..bd6b1d32fa 100644 --- a/src/platform_impl/ios/view.rs +++ b/src/platform_impl/ios/view.rs @@ -123,17 +123,26 @@ unsafe fn get_view_class(root_view_class: &'static Class) -> &'static Class { let window: id = msg_send![object, window]; assert!(!window.is_null()); - let bounds: CGRect = msg_send![window, bounds]; + let window_bounds: CGRect = msg_send![window, bounds]; let screen: id = msg_send![window, screen]; let screen_space: id = msg_send![screen, coordinateSpace]; let screen_frame: CGRect = - msg_send![object, convertRect:bounds toCoordinateSpace:screen_space]; + msg_send![object, convertRect:window_bounds toCoordinateSpace:screen_space]; let scale_factor: CGFloat = msg_send![screen, scale]; let size = crate::dpi::LogicalSize { width: screen_frame.size.width as f64, height: screen_frame.size.height as f64, } .to_physical(scale_factor.into()); + + // If the app is started in landscape, the view frame and window bounds can be mismatched. + // The view frame will be in portrait and the window bounds in landscape. So apply the + // window bounds to the view frame to make it consistent. + let view_frame: CGRect = msg_send![object, frame]; + if view_frame != window_bounds { + let () = msg_send![object, setFrame: window_bounds]; + } + app_state::handle_nonuser_event(EventWrapper::StaticEvent(Event::WindowEvent { window_id: RootWindowId(window.into()), event: WindowEvent::Resized(size),