From da7942e72057bf904a32d3162f3704915fa626a4 Mon Sep 17 00:00:00 2001 From: Mads Marquart Date: Tue, 10 Sep 2024 10:13:48 +0200 Subject: [PATCH] Fix SurfaceResized on iOS --- src/changelog/unreleased.md | 1 + src/platform_impl/apple/uikit/view.rs | 40 ++++++++----------------- src/platform_impl/apple/uikit/window.rs | 11 ++----- 3 files changed, 17 insertions(+), 35 deletions(-) diff --git a/src/changelog/unreleased.md b/src/changelog/unreleased.md index 2f1dfa9673..7e69b14ca6 100644 --- a/src/changelog/unreleased.md +++ b/src/changelog/unreleased.md @@ -157,3 +157,4 @@ changelog entry. ### Fixed - On Orbital, `MonitorHandle::name()` now returns `None` instead of a dummy name. +- On iOS, fixed `SurfaceResized` and `Window::surface_size` not reporting the size of the actual surface. diff --git a/src/platform_impl/apple/uikit/view.rs b/src/platform_impl/apple/uikit/view.rs index 20a185b957..b0b97b1eb4 100644 --- a/src/platform_impl/apple/uikit/view.rs +++ b/src/platform_impl/apple/uikit/view.rs @@ -6,10 +6,10 @@ use objc2::runtime::{NSObjectProtocol, ProtocolObject}; use objc2::{declare_class, msg_send, msg_send_id, mutability, sel, ClassType, DeclaredClass}; use objc2_foundation::{CGFloat, CGPoint, CGRect, MainThreadMarker, NSObject, NSSet, NSString}; use objc2_ui_kit::{ - UICoordinateSpace, UIEvent, UIForceTouchCapability, UIGestureRecognizer, - UIGestureRecognizerDelegate, UIGestureRecognizerState, UIKeyInput, UIPanGestureRecognizer, - UIPinchGestureRecognizer, UIResponder, UIRotationGestureRecognizer, UITapGestureRecognizer, - UITextInputTraits, UITouch, UITouchPhase, UITouchType, UITraitEnvironment, UIView, + UIEvent, UIForceTouchCapability, UIGestureRecognizer, UIGestureRecognizerDelegate, + UIGestureRecognizerState, UIKeyInput, UIPanGestureRecognizer, UIPinchGestureRecognizer, + UIResponder, UIRotationGestureRecognizer, UITapGestureRecognizer, UITextInputTraits, UITouch, + UITouchPhase, UITouchType, UITraitEnvironment, UIView, }; use super::app_state::{self, EventWrapper}; @@ -69,26 +69,15 @@ declare_class!( let mtm = MainThreadMarker::new().unwrap(); let _: () = unsafe { msg_send![super(self), layoutSubviews] }; - let window = self.window().unwrap(); - let window_bounds = window.bounds(); - let screen = window.screen(); - let screen_space = screen.coordinateSpace(); - let screen_frame = self.convertRect_toCoordinateSpace(window_bounds, &screen_space); - let scale_factor = screen.scale(); + let frame = self.frame(); + let scale_factor = self.contentScaleFactor() as f64; let size = crate::dpi::LogicalSize { - width: screen_frame.size.width as f64, - height: screen_frame.size.height as f64, - } - .to_physical(scale_factor as f64); - - // 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 = self.frame(); - if view_frame != window_bounds { - self.setFrame(window_bounds); + width: frame.size.width as f64, + height: frame.size.height as f64, } + .to_physical(scale_factor); + let window = self.window().unwrap(); app_state::handle_nonuser_event( mtm, EventWrapper::StaticEvent(Event::WindowEvent { @@ -123,13 +112,10 @@ declare_class!( "invalid scale_factor set on UIView", ); let scale_factor = scale_factor as f64; - let bounds = self.bounds(); - let screen = window.screen(); - let screen_space = screen.coordinateSpace(); - let screen_frame = self.convertRect_toCoordinateSpace(bounds, &screen_space); + let frame = self.frame(); let size = crate::dpi::LogicalSize { - width: screen_frame.size.width as f64, - height: screen_frame.size.height as f64, + width: frame.size.width as f64, + height: frame.size.height as f64, }; let window_id = RootWindowId(window.id()); app_state::handle_nonuser_events( diff --git a/src/platform_impl/apple/uikit/window.rs b/src/platform_impl/apple/uikit/window.rs index e859ae561a..234bb01b73 100644 --- a/src/platform_impl/apple/uikit/window.rs +++ b/src/platform_impl/apple/uikit/window.rs @@ -527,14 +527,9 @@ impl Window { let scale_factor = view.contentScaleFactor(); let scale_factor = scale_factor as f64; if scale_factor != 1.0 { - let bounds = view.bounds(); - let screen = window.screen(); - let screen_space = screen.coordinateSpace(); - let screen_frame = view.convertRect_toCoordinateSpace(bounds, &screen_space); - let size = LogicalSize { - width: screen_frame.size.width as f64, - height: screen_frame.size.height as f64, - }; + let frame = view.frame(); + let size = + LogicalSize { width: frame.size.width as f64, height: frame.size.height as f64 }; let window_id = CoreWindowId(window.id()); app_state::handle_nonuser_events( mtm,