Управление ориентацией одной страницы и поворотом просмотра в формах Xamarin - PullRequest
0 голосов
/ 21 сентября 2018

В нашем проекте мы собираемся заблокировать приложение в портретном режиме, пока проблем нет.Теперь мы хотели бы иметь возможность вращать только некоторые конкретные страницы или контент (для отображения больших графиков).Я погуглил множество тем по этой проблеме, но не нашел четкого решения.Есть ли какой-нибудь чистый способ указать ориентацию на основе страниц для Andoid и Ios?

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

rotatedView.WidthRequest = Height;
rotatedView.HeightRequest = Width;
rotatedView.Rotate(90)
contentView.Content = rotatedView;

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

rotatedView.WidthRequest = Width;
double ratio = Height / Width;
rotatedView.HeightRequest = Width / ratio;
rotatedView.Rotation = 90;
rotatedView.ScaleTo(ratio)
contentView.Content = graphRot;

Вид после поворотасохраняет то же соотношение сторон исходной страницы с шириной, равной высоте страницы и наоборот.

Любая подсказка будет высоко ценится

ОБНОВЛЕНИЕ

Относительно поворота просмотра я смогсделайте это, разместив все вещи в относительной схеме.Таким образом, я мог свободно определять размер вида, равный размеру повернутого контейнера.

1 Ответ

0 голосов
/ 21 сентября 2018

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

Для iOS :

Вам потребуется переопределить GetSupportedInterfaceOrientations в вашем AppDelegate.cs и добавьте немного логики.

public override UIInterfaceOrientationMask GetSupportedInterfaceOrientations(UIApplication application, UIWindow forWindow)
{
    UIInterfaceOrientationMask supportedOrientation;

    if (_AllowRotations == true)
    {
        supportedOrientation = UIInterfaceOrientationMask.AllButUpsideDown;
    }
    else
    {
        supportedOrientation = UIInterfaceOrientationMask.Portrait;
    }

    return supportedOrientation;
}

Для Android :

Чтобы установить правильные флаги на Android, вам понадобится метод в вашем LaunchActivity.cs , где вы устанавливаете соответствующие флаги.

if (allowRotations == true)
{
    RequestedOrientation = ScreenOrientation.Sensor;
}
else
{
    RequestedOrientation = ScreenOrientation.Portrait;
}

Я бы предложил поместить их в какой-то сервис зависимостей, если вы хотите вызывать их из Xamarin.Forms.Мои allowrotations переменные в каждом классе задаются из события, которое я использую из моего VideoPlayerRenderer, но вы также можете установить их из службы зависимостей.

...