Вращающаяся ориентация устройства в Xamarin.Forms: подробное руководство

В Xamarin.Forms поворот ориентации устройства является распространенным требованием для создания адаптивных и удобных для пользователя приложений. В этой статье блога мы рассмотрим различные методы достижения поворота ориентации устройства в Xamarin.Forms, а также приведем примеры кода. Итак, приступим!

Метод 1: DependencyService
DependencyService позволяет Xamarin.Forms получать доступ к функциям, зависящим от платформы. Мы можем использовать эту функцию для обработки изменений ориентации устройства. Вот пример:

  1. Создайте интерфейс в общем проекте Xamarin.Forms:

    public interface IOrientationService
    {
    void SetOrientation(LandScapeOrientation orientation);
    }
  2. Реализовать интерфейс в проектах для конкретной платформы:
    Android:

    [assembly: Dependency(typeof(OrientationService))]
    namespace YourAppName.Droid.Services
    {
    public class OrientationService : IOrientationService
    {
        public void SetOrientation(LandScapeOrientation orientation)
        {
            var activity = (Activity)Forms.Context;
            activity.RequestedOrientation = orientation == LandScapeOrientation.Landscape ? ScreenOrientation.Landscape : ScreenOrientation.Portrait;
        }
    }
    }

iOS:

[assembly: Dependency(typeof(OrientationService))]
namespace YourAppName.iOS.Services
{
    public class OrientationService : IOrientationService
    {
        public void SetOrientation(LandScapeOrientation orientation)
        {
            var appDelegate = UIApplication.SharedApplication.Delegate as AppDelegate;
            appDelegate.OrientationLock = orientation == LandScapeOrientation.Landscape ? UIInterfaceOrientationMask.Landscape : UIInterfaceOrientationMask.Portrait;
        }
    }
}
  1. Используйте DependencyService в своем коде Xamarin.Forms:
    void RotateButton_Clicked(object sender, EventArgs e)
    {
    DependencyService.Get<IOrientationService>().SetOrientation(LandScapeOrientation.Landscape);
    }

Метод 2: собственный модуль визуализации
Другой подход заключается в создании собственного модуля визуализации для каждой платформы для обработки изменений ориентации устройства. Вот пример:

  1. Создайте собственный модуль визуализации в проектах для конкретной платформы:
    Android:
    [assembly: ExportRenderer(typeof(ContentPage), typeof(CustomPageRenderer))]
    namespace YourAppName.Droid.Renderers
    {
    public class CustomPageRenderer : PageRenderer
    {
        protected override void OnElementChanged(ElementChangedEventArgs<Page> e)
        {
            base.OnElementChanged(e);
            if (e.NewElement != null)
            {
                var activity = (Activity)Context;
                activity.RequestedOrientation = ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE;
            }
        }
    }
    }

iOS:

[assembly: ExportRenderer(typeof(ContentPage), typeof(CustomPageRenderer))]
namespace YourAppName.iOS.Renderers
{
    public class CustomPageRenderer : PageRenderer
    {
        public override void ViewWillAppear(bool animated)
        {
            base.ViewWillAppear(animated);
            AppDelegate appdelegate = (AppDelegate)UIApplication.SharedApplication.Delegate;
            appdelegate.OrientationLock = UIInterfaceOrientationMask.Landscape;
        }
    }
}
  1. Используйте собственный модуль визуализации в коде Xamarin.Forms:
    void RotateButton_Clicked(object sender, EventArgs e)
    {
    Navigation.PushAsync(new CustomPage());
    }

Метод 3: MessagingCenter
Используя MessagingCenter, вы можете отправить сообщение из Xamarin.Forms в проекты для конкретной платформы для обработки изменений ориентации устройства. Вот пример:

  1. Определите сообщение в общем проекте Xamarin.Forms:

    public class OrientationMessage
    {
    public LandScapeOrientation Orientation { get; set; }
    }
  2. Подписаться на рассылку в проектах для конкретной платформы:
    Android:

    MessagingCenter.Subscribe<object, OrientationMessage>(this, "OrientationMessage", (sender, args) =>
    {
    var activity = (Activity)Forms.Context;
    activity.RequestedOrientation = args.Orientation == LandScapeOrientation.Landscape ? ScreenOrientation.Landscape : ScreenOrientation.Portrait;
    });

iOS:

MessagingCenter.Subscribe<object, OrientationMessage>(this, "OrientationMessage", (sender, args) =>
{
    var appDelegate = UIApplication.SharedApplication.Delegate as AppDelegate;
    appDelegate.OrientationLock = args.Orientation == LandScapeOrientation.Landscape ? UIInterfaceOrientationMask.Landscape : UIInterfaceOrientationMask.Portrait;
});
  1. Опубликуйте сообщение в своем коде Xamarin.Forms:
    void RotateButton_Clicked(object sender, EventArgs e)
    {
    MessagingCenter.Send<object, OrientationMessage>(this, "OrientationMessage", new OrientationMessage { Orientation = LandScapeOrientation.Landscape });
    }

В этой статье мы рассмотрели три различных метода изменения ориентации устройства в Xamarin.Forms: использование DependencyService, пользовательских средств визуализации и MessagingCenter. Каждый метод имеет свои преимущества и может быть выбран в зависимости от конкретных требований вашего приложения. Используя эти методы, вы можете создавать адаптивные приложения Xamarin.Forms, которые легко адаптируются к различным ориентациям устройств.