2016-11-10 1 views
1

J'essaie de ne verrouiller qu'un seul contrôleur de vue en mode portrait tout en permettant l'orientation de toutes les autres vues. C'est ce que j'ai essayé de mettre dans mon homeViewController (celui que je veux garder en portrait). J'essaye de faire ceci dans xamarin dans C#. Quelqu'un at-il des suggestions?Impossible de verrouiller un contrôleur de vue dans Portrait, xamarin IOS

+0

Votre code est bon pour un 'UIViewController' qui est' PresentViewController' un autre 'UIViewController' .... mais utilisez-vous' UINavigationController'? Et/ou est votre 'homeViewController' le premier VC qui est montré sur le lancement de l'application (?) Et doit être en portrait et tous les VC après que l'orientation est déverrouillée? – SushiHangover

+0

Oui j'utilise UINavigationController. Le homeViewController est le premier chargé. Je veux juste que cette vue soit verrouillée en portrait et le reste dans n'importe quelle orientation. –

Répondre

0

Je dérive mes contrôleurs d'une base. Je en ai besoin pour d'autres fins, mais aussi utiliser pour verrouiller l'orientation portrait

public class BaseView : UIViewController 
{ 

    static List<Type> SupportingLandscapeScreenTypes = new List<Type>() 
    { 
     typeof(TemperaturesHistoryView), 
     typeof(LoadSwitchConsumptionView), 
     typeof(HomeConsumptionGraphView) 

    }; 

    public override UIInterfaceOrientationMask GetSupportedInterfaceOrientations() 
    { 
     foreach (var screenType in SupportingLandscapeScreenTypes) 
     { 
      if (GetType() == screenType) 
       return UIInterfaceOrientationMask.Portrait | UIInterfaceOrientationMask.LandscapeLeft | UIInterfaceOrientationMask.LandscapeRight; 
     } 
     return UIInterfaceOrientationMask.Portrait; 
    } 

    public override UIInterfaceOrientation PreferredInterfaceOrientationForPresentation() 
    { 
     return UIInterfaceOrientation.Portrait; 
    } 

} 

public class MyEnergateAppNavigationController:UINavigationController 
{ 
    public MyEnergateAppNavigationController(UIViewController rootController) 
     :base (rootController) 
    { 
    } 

    public override bool ShouldAutorotate() 
    { 
     return true; 
    } 

    //[Obsolete ("Deprecated in iOS6. Replace it with both GetSupportedInterfaceOrientations and PreferredInterfaceOrientationForPresentation")] 
    //public override bool ShouldAutorotateToInterfaceOrientation(UIInterfaceOrientation toInterfaceOrientation) 
    //{ 
    // return TopViewController.ShouldAutorotateToInterfaceOrientation(toInterfaceOrientation); 
    //} 

    public override UIInterfaceOrientationMask GetSupportedInterfaceOrientations() 
    { 
     return TopViewController.GetSupportedInterfaceOrientations(); 
    } 

    public override UIInterfaceOrientation PreferredInterfaceOrientationForPresentation() 
    { 
     return TopViewController.PreferredInterfaceOrientationForPresentation(); 
    } 
} 
+0

vous pouvez également utiliser LINQ dans GetSupportedInterfaceOrientations si vous le souhaitez –

+0

Donc, c'est une classe complète différente? Je me demandais juste comme j'ai homeViewController au lancement de l'application et c'est un contrôleur de navigation. Dois-je mettre ce code dans cette classe ou en créer un autre? –

+0

Réponse mise à jour pour inclure le contrôleur de navigation. Tous les contrôleurs "internes" sont dérivés du contrôleur de base comme indiqué dans la réponse. Vous pouvez définir SupportingLandscapeScreenTypes comme statique pour éviter plusieurs instances. –

0

Ajouter à AppDelegate.cs Ce

public bool RestrictRotation 
    { 
     get; 
     set; 
    } 

Et Ajouter ce dans la même AppDelegate.cs mais après la méthode FinishedLaunching()

[Export("application:supportedInterfaceOrientationsForWindow:")] 
    public UIInterfaceOrientationMask GetSupportedInterfaceOrientations(UIApplication application, IntPtr 
     forWindow) 
    { 
     if (this.RestrictRotation) 
      return UIInterfaceOrientationMask.Portrait; 
     else 
      return UIInterfaceOrientationMask.All; 
    } 

Ajoutez la suite à tous les contrôleurs de vue que vous souhaitez réaliser Portrait

public override void ViewDidLoad() 
    { 
     base.ViewDidLoad(); 
     this.RestrictRotation(true); 
     // Perform any additional setup after loading the view, typically from a nib. 
    } 

    public override bool ShouldAutorotate() 
    { 
     return false; 
    } 

    public override UIInterfaceOrientationMask GetSupportedInterfaceOrientations() 
    { 
     return UIInterfaceOrientationMask.Portrait; 
    } 

    public override UIInterfaceOrientation PreferredInterfaceOrientationForPresentation() 
    { 
     return UIInterfaceOrientation.Portrait; 
    } 

    void RestrictRotation(bool restriction) 
    { 
     AppDelegate app = (AppDelegate)UIApplication.SharedApplication.Delegate; 
     app.RestrictRotation = restriction; 
    }