2016-11-10 4 views
1

하나의보기 컨트롤러 만 세로로 잠그고 다른 모든보기는 모든 방향으로 허용하려고합니다. 이것은 내가 homeViewController (세로로 유지하려는 하나)에 넣으려고 시도한 것입니다.하나의보기 컨트롤러를 Portrait, xamarin으로 잠글 수 없습니다. IOS

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

저는 이것을 C#의 xamarin에서 수행하려고합니다. 누구 제안이 있습니까?

+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

원하는 경우 GetSupportedInterfaceOrientations에서 LINQ를 사용할 수도 있습니다. –

+0

그래서 완전히 다른 클래스입니까? 그냥 응용 프로그램 시작에 homeViewController가 있고 Navigation Controller 인 것처럼 궁금합니다. 이 코드를 해당 클래스에 넣거나 다른 클래스를 만들어야합니까? –

+0

내비게이션 컨트롤러를 포함하도록 답변이 업데이트되었습니다. 모든 "내부"컨트롤러는 응답에 표시된대로 기본 컨트롤러에서 파생됩니다. SupportingLandscapeScreenTypes를 static으로 정의하여 여러 인스턴스를 피할 수 있습니다. –

0

public bool RestrictRotation 
    { 
     get; 
     set; 
    } 

AppDelegate.cs

이 추가와 같은 AppDelegate.cs이 추가하지만 FinishedLaunching() 메소드 이후에 다른 목적이 필요뿐만 아니라 세로 방향을 고정하는 데 사용

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

원하는 모든 viewcontroller에 다음을 추가하십시오. 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; 
    }