Как изменить ориентацию с Портрета на Все (Пейзаж / Портрет оба) для одного ContentPage в xamarin.forms для IOS? - PullRequest
0 голосов
/ 26 октября 2018

Я хочу изменить ориентацию одной страницы. Все мое приложение должно быть запущено в портретной ориентации, но я хочу сделать одну страницу как альбомную / портретную (обе)

Я взял ссылку ниже ссылки

http://www.appliedcodelog.com/2017/05/force-landscape-or-portrait-for-single.html

Код работает нормально в Android, но не в IOS.

AppDelegate.cs

public override UIInterfaceOrientationMask GetSupportedInterfaceOrientations(UIApplication application, [Transient] UIWindow forWindow)
{
    var mainPage = Xamarin.Forms.Application.Current.MainPage;

    if (mainPage is CartoonDetail_demo2 ||
            (mainPage is NavigationPage && ((NavigationPage)mainPage).CurrentPage is CartoonDetail_demo2) ||
            (mainPage.Navigation != null && mainPage.Navigation.NavigationStack.LastOrDefault() is CartoonDetail_demo2))
    {
        return UIInterfaceOrientationMask.All;
    }

    return UIInterfaceOrientationMask.Portrait;
}

Но это условие никогда не будет верным в любом случае. В конце концов я не могу получить страницу из стека навигации.

Итак, я использую простой способ сделать то же самое,

Я хочу сделать "CartoonDetail_demo2" этой страницей как Пейзаж / Портрет.

  1. В методе OnAppearing () страницы "CartoonDetail_demo2" я установил один флаг как true.

  2. И метод OnDisappering () страницы "CartoonDetail_demo2" Я установил один флаг как ложный.

  3. используйте этот флаг в AppDelegate.cs.

public override UIInterfaceOrientationMask 
GetSupportedInterfaceOrientations(UIApplication application, [Transient] 
UIWindow forWindow)
{
    if (AppConstants.IsOrientationAll)
    {
      return UIInterfaceOrientationMask.All;
    }
    return UIInterfaceOrientationMask.Portrait;
 }

Теперь условие становится истинным, когда я захожу на страницу "CartoonDetail_demo2".

Но это не работает, и моя страница всегда в книжной ориентации .

  1. Когда я просто вызываю этот метод без каких-либо условий, все приложение переходит в ориентацию «Все» (альбомная / книжная).

    public override UIInterfaceOrientationMask GetSupportedInterfaceOrientations (приложение UIApplication, [Transient] UIWindow forWindow) { return UIInterfaceOrientationMask.All; }

  2. По умолчанию все мое приложение в книжной ориентации.

Я также попробовал несколько других демо, но ни одна из них не будет работать

https://xamarindevelopervietnam.wordpress.com/2017/05/23/how-to-rotate-specific-page-in-xamarin-forms/

я должен использовать плагин Plugin.DeviceOrientation?

1 Ответ

0 голосов
/ 29 октября 2018

в AppDelegate.cs

public bool allowRotation; 

и переписать метод

public override UIInterfaceOrientationMask GetSupportedInterfaceOrientations(UIApplication application, [Transient] UIWindow forWindow)
{
   if(allowRotation==true)
   {
    return UIInterfaceOrientationMask.Landscape;
   }

   else
   {
    return UIInterfaceOrientationMask.Portrait;
   }
} 

Затем вы можете вызвать следующий метод в службе зависимостей

в iOS

public class OrientationService : IOrientationService
{
    public void Landscape()
    {
        AppDelegate appDelegate = (AppDelegate)UIApplication.SharedApplication.Delegate;
        appDelegate.allowRotation = true;

        UIDevice.CurrentDevice.SetValueForKey(new NSNumber((int)UIInterfaceOrientation.LandscapeLeft), new NSString("orientation"));   
    }

    public void Portrait()
    {
        AppDelegate appDelegate = (AppDelegate)UIApplication.SharedApplication.Delegate;
        appDelegate.allowRotation = true;

        UIDevice.CurrentDevice.SetValueForKey(new NSNumber((int)UIInterfaceOrientation.Portrait), new NSString("orientation"));
    }
}

в Android

public class OrientationService : IOrientationService
{
    public void Landscape()
    {
        ((Activity)Forms.Context).RequestedOrientation = ScreenOrientation.Landscape;
    }

    public void Portrait()
    {
        ((Activity)Forms.Context).RequestedOrientation = ScreenOrientation.Portrait;
    }
}

Более подробно вы можете обратиться к аналогичной проблеме .

...