Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Cross-Platform-Entwicklung (https://www.delphipraxis.net/91-cross-platform-entwicklung/)
-   -   Kann man die ScreenOrientation per Runtime festlegen ? (https://www.delphipraxis.net/185743-kann-man-die-screenorientation-per-runtime-festlegen.html)

Rollo62 3. Jul 2015 16:53

Kann man die ScreenOrientation per Runtime festlegen ?
 
Hallo zusammen,

ich möchte in meiner Fmx App (RadStudio XE8 Pro, Upd1), für verschiedene Views verschiederne ScreenOrientations festlegen.

Dazu gibe es einen ScreenService, der das wie folgt machen soll:

Code:
// Sets the possible Screen orientations (Portrait, Landscape, InvertedPortrait, InvertedLandscape);
procedure Screen_Orientation_Set(const orientSet : TScreenOrientations );
var
  ScreenService: IFMXScreenService;

begin
  if TPlatformServices.Current.SupportsPlatformService(IFMXScreenService, IInterface(ScreenService)) then
  begin
    ScreenService.SetScreenOrientation(orientSet);
  end;
end;
Damit das funktinoiert (auch die Events bei OnOrientationChange übrigens), muss wohl in
den Options\Application\Orientation die Liste der Kandidaten angeclickt sein.


Soweit, so gut.
Aber wenn ich weiter in die Sourcen schaue sieht es bei iOS so aus:

Code:
procedure TPlatformCocoaTouch.SetScreenOrientation(
  AOrientations: TScreenOrientations);
begin
  // Not needed for iOS
end;
Das ist offenbar nie dafür gedacht gewesen die ScreenOrientation mal eben per Runtime festzulegen,
sondern einmal für die ganze App.

Bei Android gibt es etwas im Sourcecode, das muss ich noch ausprobieren,
aber ich möchte das halt für beide gleich haben.

Ich möchte halt die eine View so festlegen:
Code:
Screen_Orientation_Set([Portrait, Landscape, InvertedPortrait, InvertedLandscape] );
und die andere View z.B. so:
Code:
Screen_Orientation_Set([Portrait, InvertedPortrait, ] );
Geht das überhaupt, und wenn ja wie ?

Der ScreenOrientation Service scheint jedenfalls nicht dafür zu gebrauchen zu sein (wofür er
dann überhaupt da ist wäre noch eine andere Frage ...).

Rolf

Rollo62 3. Jul 2015 17:36

AW: Kann man die ScreenOrientation per Runtime festlegen ?
 
ich habe nach ein bischen Recherche noch ältere Beiträge dazu gefunden, aber
insbesondere beim Checken der Soureces bin ich auf einen Weg gestossen der viel einfacher ist.

Ob das unter Android läuft weiss ich noch nicht, unter iOS scheint es jedenfalls gut zu laufen:

Es reicht offenar einfach die Orientation im Application Object per FormFaktor zu setzen,
dann wird das von den iOS Routinen korrekt verarbeitet.


Code:
procedure Update_FormFactor(FormFactor: TFormFactor; const orientSet : TScreenOrientations);
begin

  FormFactor.Orientations := orientSet;

end;

procedure Form_Orientation_Set(const orientSet : TScreenOrientations );
var
 ScreenService: IFMXScreenService;

begin
{$IFDEF IOS}
  Update_FormFactor(Application.FormFactor, orientSet);
{$ELSE IOS}

  if TPlatformServices.Current.SupportsPlatformService(IFMXScreenService) then
  begin
    ScreenService := TPlatformServices.Current.GetPlatformService(IFMXScreenService) as IFMXScreenService;
    ScreenService.SetScreenOrientation(OrientSet);
   end;

{$ENDIF IOS}

end;
Ist vielleicht ein "Hack", aber ein recht schöner :stupid:
Mit etwas Glück reicht das so auch für Android aus, dann kann ich die Platformservides wieder rausschmeissen.

Rollo


Alle Zeitangaben in WEZ +1. Es ist jetzt 10:23 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz