2016-11-11 9 views
1

Ich möchte eine App um eine tabletfreundliche Benutzeroberfläche erweitern. Da die Benutzeroberfläche des Telefons im Hochformat viel besser funktioniert, ist die vorhandene App im Hochformat gesperrt. Die Tablet-Version hat diese Einschränkung nicht.Idiomspezifische Geräteausrichtung in Xamarin Forms auf iOS

Dies funktioniert gut auf Android; Die Hauptaktivität entscheidet beim Start, ob alle Geräteorientierungen (auf Tablets) zugelassen werden sollen oder ob die App im Hochformat (auf Telefonen) gespeichert werden soll. Das Problem liegt darin, die Orientierungslogik auch auf iOS zu implementieren.

Ich weiß, dass Xamarin.Forms eine bug hat, die verhindert, dass die Geräteausrichtung von Code auf iOS-Geräten gesteuert wird. Wir haben eine mögliche Problemumgehung gefunden: Alle Build-Ziele werden dupliziert (mit einer Instanz für Telefone und die andere für Tablets) und die Telefon- und Tablet-Builds werden separat in den App Store hochgeladen.

Ist das wirklich der eleganteste Weg, eine Idiom-spezifische Geräteausrichtung zu erreichen, oder gibt es eine Möglichkeit, diesen Xamarin.Forms-Fehler ohne großen Aufwand zu umgehen? Hier

Antwort

0

ist die Magie:

AppDelegate.cs

public override UIInterfaceOrientationMask GetSupportedInterfaceOrientations(UIApplication application, UIWindow forWindow) 
    { 
     //Tablet orientation adjustment 
     if (Device.Idiom == TargetIdiom.Tablet) 
      return UIInterfaceOrientationMask.Landscape; 
     else 
      return UIInterfaceOrientationMask.Portrait; 
    } 

Dann erstellen Sie eine Custom für ContentPage und außer Kraft setzen OnElementChangedMethod:

protected override void OnElementChanged(VisualElementChangedEventArgs e) 
    { 
     base.OnElementChanged(e); 
     if (e.NewElement != null) 
     { 
      Page _page = Element as Page; 
      _page.Appearing += (s, ea) => 
      { 
       UIInterfaceOrientation orientain = Device.Idiom == TargetIdiom.Phone ? UIInterfaceOrientation.Portrait : UIInterfaceOrientation.LandscapeLeft; 

       NSNumber number = NSNumber.FromInt32((int)orientain); 
       UIDevice.CurrentDevice.SetValueForKey(number, new NSString("orientation")); 
       UIViewController.AttemptRotationToDeviceOrientation(); 
      }; 
     } 

    }