1
0
Fork 0
mirror of https://github.com/juce-framework/JUCE.git synced 2026-01-10 23:44:24 +00:00

UIViewComponentPeer: Fix bug where onscreen keyboard would fail to follow view orientation

The important part seems to be initialising the UIWindow directly with
the UIWindowScene, instead of initialising it with a frame and then
assigning a scene later on.
This commit is contained in:
reuk 2025-10-30 20:03:25 +00:00
parent d66ca542b8
commit 514718e037
No known key found for this signature in database

View file

@ -544,19 +544,62 @@ private:
[controller setNeedsStatusBarAppearanceUpdate]; [controller setNeedsStatusBarAppearanceUpdate];
} }
void windowSceneChanged() override void updateSceneForWindow()
{ {
if (isSharedWindow) if (isSharedWindow)
return; return;
auto* newWindow = std::invoke ([&]() -> JuceUIWindow*
{
if (@available (iOS 13, *)) if (@available (iOS 13, *))
{ {
window.windowScene = windowSceneTracker->getWindowScene(); if (auto* scene = windowSceneTracker->getWindowScene())
return [[JuceUIWindow alloc] initWithWindowScene: scene];
}
else if (window == nil)
{
auto r = convertToCGRect (component.getBounds());
r.origin.y = [UIScreen mainScreen].bounds.size.height - (r.origin.y + r.size.height);
return [[JuceUIWindow alloc] initWithFrame: r];
} }
return nil;
});
if (newWindow == nil)
return;
if (window != nil)
{
[(JuceUIWindow*) window setOwner: nullptr];
if (@available (iOS 13, *))
window.windowScene = nil;
[window release];
window = nil;
}
[newWindow setOwner: this];
newWindow.rootViewController = controller;
newWindow.hidden = ! isShowing();
newWindow.opaque = component.isOpaque();
newWindow.backgroundColor = [[UIColor blackColor] colorWithAlphaComponent: 0];
if (component.isAlwaysOnTop())
newWindow.windowLevel = UIWindowLevelAlert;
window = newWindow;
updateScreenBounds(); updateScreenBounds();
} }
void windowSceneChanged() override
{
updateSceneForWindow();
}
//============================================================================== //==============================================================================
class AsyncRepaintMessage final : public CallbackMessage class AsyncRepaintMessage final : public CallbackMessage
{ {
@ -1768,27 +1811,12 @@ UIViewComponentPeer::UIViewComponentPeer (Component& comp,
r = convertToCGRect (component.getBounds()); r = convertToCGRect (component.getBounds());
r.origin.y = [UIScreen mainScreen].bounds.size.height - (r.origin.y + r.size.height); r.origin.y = [UIScreen mainScreen].bounds.size.height - (r.origin.y + r.size.height);
window = [[JuceUIWindow alloc] initWithFrame: r];
if (@available (iOS 13, *))
{
window.windowScene = windowSceneTracker->getWindowScene();
}
[((JuceUIWindow*) window) setOwner: this];
controller = [[JuceUIViewController alloc] init]; controller = [[JuceUIViewController alloc] init];
controller.view = view; controller.view = view;
window.rootViewController = controller;
window.hidden = true;
window.opaque = component.isOpaque();
window.backgroundColor = [[UIColor blackColor] colorWithAlphaComponent: 0];
if (component.isAlwaysOnTop())
window.windowLevel = UIWindowLevelAlert;
view.frame = CGRectMake (0, 0, r.size.width, r.size.height); view.frame = CGRectMake (0, 0, r.size.width, r.size.height);
updateSceneForWindow();
} }
setTitle (component.getName()); setTitle (component.getName());
@ -1811,7 +1839,7 @@ UIViewComponentPeer::~UIViewComponentPeer()
[view release]; [view release];
[controller release]; [controller release];
if (! isSharedWindow) if (! isSharedWindow && window != nil)
{ {
[((JuceUIWindow*) window) setOwner: nil]; [((JuceUIWindow*) window) setOwner: nil];
@ -1825,7 +1853,7 @@ UIViewComponentPeer::~UIViewComponentPeer()
//============================================================================== //==============================================================================
void UIViewComponentPeer::setVisible (bool shouldBeVisible) void UIViewComponentPeer::setVisible (bool shouldBeVisible)
{ {
if (! isSharedWindow) if (! isSharedWindow && window != nil)
window.hidden = ! shouldBeVisible; window.hidden = ! shouldBeVisible;
view.hidden = ! shouldBeVisible; view.hidden = ! shouldBeVisible;
@ -1854,7 +1882,9 @@ void UIViewComponentPeer::setBounds (const Rectangle<int>& newBounds, const bool
} }
else else
{ {
if (window != nil)
window.frame = convertToCGRect (newBounds); window.frame = convertToCGRect (newBounds);
view.frame = CGRectMake (0, 0, (CGFloat) newBounds.getWidth(), (CGFloat) newBounds.getHeight()); view.frame = CGRectMake (0, 0, (CGFloat) newBounds.getWidth(), (CGFloat) newBounds.getHeight());
handleMovedOrResized(); handleMovedOrResized();
@ -1894,6 +1924,7 @@ Point<float> UIViewComponentPeer::globalToLocal (Point<float> screenPosition)
void UIViewComponentPeer::setAlpha (float newAlpha) void UIViewComponentPeer::setAlpha (float newAlpha)
{ {
if (view.window != nil)
[view.window setAlpha: (CGFloat) newAlpha]; [view.window setAlpha: (CGFloat) newAlpha];
} }
@ -1972,7 +2003,7 @@ bool UIViewComponentPeer::contains (Point<int> localPos, bool trueIfInAChildWind
bool UIViewComponentPeer::setAlwaysOnTop (bool alwaysOnTop) bool UIViewComponentPeer::setAlwaysOnTop (bool alwaysOnTop)
{ {
if (! isSharedWindow) if (! isSharedWindow && window != nil)
window.windowLevel = alwaysOnTop ? UIWindowLevelAlert : UIWindowLevelNormal; window.windowLevel = alwaysOnTop ? UIWindowLevelAlert : UIWindowLevelNormal;
return true; return true;