Xamarin.Forms - изменение ориентации устройства в зависимости от разрешения устройства. - PullRequest
0 голосов
/ 12 июля 2020

есть ли шанс принудительно изменить разрешение экрана устройства на основе ориентации экрана?

Есть приложение для планшетов, но я хочу запустить приложение и на мобильном устройстве. У меня есть несколько страниц, на которых мне нужно изменить ориентацию на альбомную на телефоне, потому что тогда мой список будет немного запутанным.

Спасибо за любой совет, и я прошу прощения за плохой Engli sh :)

Ответы [ 2 ]

1 голос
/ 13 июля 2020

Для этого можно использовать MessagingCenter .

Например, при переходе с MainPage на PageTwo в Forms страница содержимого PageTwo выглядит следующим образом:

public partial class PageTwo : ContentPage
{
    public PageTwo()
    {
        InitializeComponent();
    }

    protected override void OnAppearing()
    {
        base.OnAppearing();
        MessagingCenter.Send(this, "allowLandScape");
    }
    //during page close setting back to portrait
    protected override void OnDisappearing()
    {
        base.OnDisappearing();
        MessagingCenter.Send(this, "quitLandScape");
    }
}

В Android, необходимо изменить MainActivity следующим образом:

[Activity(Label = "ForceOrientation", Icon = "@mipmap/icon", Theme = "@style/MainTheme", MainLauncher = true, ConfigurationChanges = ConfigChanges.ScreenSize | ConfigChanges.Orientation, ScreenOrientation = ScreenOrientation.Portrait)]
public class MainActivity : global::Xamarin.Forms.Platform.Android.FormsAppCompatActivity
{
    //allowing the device to change the screen orientation based on the rotation

    protected override void OnCreate(Bundle savedInstanceState)
    {
        TabLayoutResource = Resource.Layout.Tabbar;
        ToolbarResource = Resource.Layout.Toolbar;

        base.OnCreate(savedInstanceState);

        Xamarin.Essentials.Platform.Init(this, savedInstanceState);
        global::Xamarin.Forms.Forms.Init(this, savedInstanceState);
        LoadApplication(new App());

        MessagingCenter.Subscribe<PageTwo>(this, "allowLandScape", sender =>
        {
            RequestedOrientation = ScreenOrientation.Landscape;
        });

        //during page close setting back to portrait
        MessagingCenter.Subscribe<PageTwo>(this, "quitLandScape", sender =>
        {
            RequestedOrientation = ScreenOrientation.Portrait;
        });
    }
}

In iOS, нам нужно создать PageTwoRenderer следующим образом:

[assembly: ExportRenderer(typeof(PageTwo), typeof(PageTwoRenderer))]
namespace ForceOrientation.iOS
{
    public class PageTwoRenderer : PageRenderer
    {

        public PageTwoRenderer()
        {
            MessagingCenter.Subscribe<PageTwo>(this, "allowLandScape", sender =>
            {
                UIDevice.CurrentDevice.SetValueForKey(NSNumber.FromNInt((int)(UIInterfaceOrientation.LandscapeLeft)), new NSString("orientation"));
            });

            //during page close setting back to portrait
            MessagingCenter.Subscribe<PageTwo>(this, "quitLandScape", sender =>
            {
                UIDevice.CurrentDevice.SetValueForKey(NSNumber.FromNInt((int)(UIInterfaceOrientation.Portrait)), new NSString("orientation"));
            });
        }
      
    }
}

================ ============== Обновление =============================

Мы можем использовать Xamarin.Essentials: Device Information , чтобы проверить, является ли устройство Phone, Tablet или другими устройствами .

DeviceInfo.Idiom коррелирует постоянную строку, которая соответствует типу устройства, на котором работает приложение. Значения можно проверить с помощью структуры DeviceIdiom:

  • DeviceIdiom.Phone - Phone
  • DeviceIdiom.Tablet - Tablet
  • DeviceIdiom.Desktop - Desktop
  • DeviceIdiom.TV - TV
  • DeviceIdiom.Watch - Watch
  • DeviceIdiom.Unknown - Unknown

Modiied PageTwo следующим образом:

protected override void OnAppearing()
{
    base.OnAppearing();

    var idiom = DeviceInfo.Idiom;

    if (idiom == DeviceIdiom.Phone)
    {
        MessagingCenter.Send(this, "allowLandScape");
    }
       
}
//during page close setting back to portrait
protected override void OnDisappearing()
{
    base.OnDisappearing();
    var idiom = DeviceInfo.Idiom;

    if (idiom == DeviceIdiom.Phone)
    {
        MessagingCenter.Send(this, "quitLandScape");
    }
       
}
0 голосов
/ 12 июля 2020

Вы можете принудительно установить ориентацию на этих нескольких страницах

// on IOS -> AppDelegate.cs

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

// and on Android -> MainActivity.cs do the same if else in here

protected override void OnCreate(Bundle savedInstanceState)       
{
    if (Device.Idiom == TargetIdiom.Phone)
    {
        RequestedOrientation = ScreenOrientation.Landscape; 
    }
    else
    {
        RequestedOrientation = ScreenOrientation.Portrait;
    }

}

Подробнее о классе устройства можно узнать в документации https://docs.microsoft.com/en-us/xamarin/xamarin-forms/platform/device#deviceidiom

...