2016-11-10 7 views
1

Я пытаюсь сделать только один контроллер вида заблокированным в портрете, позволяя любой другой вид быть любой ориентацией. Это то, что я пытался поместить в мой homeViewController (тот, который я хочу сохранить в портрете).Невозможно заблокировать один контроллер вида в портрете, xamarin IOS

public override UIInterfaceOrientationMask GetSupportedInterfaceOrientations() 
    { 
     return UIInterfaceOrientationMask.Portrait; 
    } 
    public override UIInterfaceOrientation PreferredInterfaceOrientationForPresentation() 
    { 
     return UIInterfaceOrientation.Portrait; 
    } 
    public override bool ShouldAutorotate() 
    { 
     return false; 
    } 

Я пытаюсь сделать это в xamarin в C#. У кого-нибудь есть предложения?

+0

Ваш код является правильным для 'UIViewController', который является' PresentViewController', чем другой 'UIViewController' .... но используете ли вы' UINavigationController'? И/Или ваш 'homeViewController' первый VC, который отображается при запуске приложения (?) И должен быть в портрете, и все VC после этого будут разблокированы? – SushiHangover

+0

Да, я использую UINavigationController. Первый загрузчик HomeViewController загружен. Я просто хочу, чтобы этот взгляд был заперт в портрете, а остальное - в любой ориентации. –

ответ

0

Я получаю свои контроллеры с одной базы. Мне это нужно для других целей, но и использовать для блокировки портретной ориентации

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

вы также можете использовать LINQ в GetSupportedInterfaceOrientations, если хотите. –

+0

Итак, это совершенно другой класс? Просто интересно, как у меня есть homeViewController при запуске приложения, и это навигационный контроллер. Должен ли я поместить этот код в этот класс или создать другой? –

+0

Обновленный ответ, чтобы включить контроллер навигации. Все «внутренние» контроллеры производятся от базового контроллера, как показано в ответе. Вы можете определить SupportingLandscapeScreenTypes как статические, чтобы избежать нескольких экземпляров. –

0

Добавить этот в AppDelegate.cs

public bool RestrictRotation 
    { 
     get; 
     set; 
    } 

И Добавьте это в том же AppDelegate.cs, но после того, как метод FinishedLaunching()

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

Добавить в список наблюдения, который вы хотите сделать:

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; 
    }