控制Xamarin表单中的单页方向和视图旋转

时间:2018-09-21 15:41:00

标签: xamarin.forms orientation

在我们的项目中,我们将以纵向模式锁定应用程序,到目前为止没有问题。 现在,我们希望可以只旋转某些特定页面或内容(以显示更大的图)。我已经在这个问题上搜索了很多主题 但没有找到明确的解决方案。有什么干净的方法可以为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 :(得分:0)

我已经在正在处理的应用程序中实现了一个解决方案。我的用例是我想以纵向锁定,除非我在视频播放器中。下面的代码是我如何完成此任务的方法。

对于 iOS

您将需要在 AppDelegate.cs 中覆盖mocha,并在其中添加一些逻辑。

GetSupportedInterfaceOrientations

对于 Android

要在Android上设置正确的标志,您将需要在 LaunchActivity.cs 中设置相应标志的方法。

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

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

    return supportedOrientation;
}

如果您想从if (allowRotations == true) { RequestedOrientation = ScreenOrientation.Sensor; } else { RequestedOrientation = ScreenOrientation.Portrait; } 调用它们,我建议将它们放在某种依赖服务中。我在每个类中的 allowrotations 变量是根据我在Xamarin.Forms中使用的事件设置的,但是您也可以从依赖项服务中进行设置。