如何在Xamarin Forms中处理屏幕旋转/方向?

时间:2015-03-27 19:40:27

标签: xamarin cross-platform screen-orientation xamarin.forms

对于不同的视图和平台(Android,iOS,WinPhone),是否有(半)通用方法处理Xamarin Forms中的旋转/方向?

UI确实旋转,这很好,虽然它对我的布局造成了严重破坏(现在是绝对布局)。我认为使用Stacklayout我可以使它变得更灵活,但是当布局更复杂时,它会在其他地方遇到障碍物。

我可以以某种方式显示纵向和横向的不同视图,使用相同的ViewModel吗? (我使用的是基于XLAB的MVVM。)

我找到了可能的解决方案:

http://blog.rthand.com/post/2014/07/24/Different-XAML-layouts-for-different-device-orienations-in-XamarinForms.aspx缺少iOS,我想知道它是否能很好地处理MVVM,看起来很好,我现在正在调查它

http://www.jimbobbennett.io/orientation-with-xamarin-forms/听起来很有希望,但样本只是iOS,链接的GIT存储库根本没有文档,只是说“Xamarin Helpers”

http://www.sellsbrothers.com/posts/Details/13740也可能是以编程方式创建的视图。虽然在我的测试中我在旋转时没有得到尺寸更改事件(虽然我在不同的代码处听过)用于ios模拟器。 (解决方案基于尺寸更改来检测旋转。)

1 个答案:

答案 0 :(得分:1)

如果您已经在使用XLabs,那么您可以使用IXFormsApp和属性“Orientation”和事件处理程序“Rotation”。您必须在每个平台上添加本机观察器,并在那里设置IXFormsApp的“Orientation”,这将导致事件处理程序调用。

例如在iOS上:

    public override bool FinishedLaunching(UIApplication app, NSDictionary options)
    {
        var xapp = new XFormsAppiOS();
        xapp.Init(this);

        var resolverContainer = new SimpleContainer();
        resolverContainer.Register<IXFormsApp>(xapp);
        Resolver.SetResolver(resolverContainer.GetResolver());

        var a = new App();
        LoadApplication(a);

        UIDevice.Notifications.ObserveOrientationDidChange((s, e) =>
        {
            xapp.Orientation = ... // set orientation here
        });

现在,您可以通过解析IXFormsApp来监控方向更改:

        xapp = Resolver.Resolve<IXFormsApp>();
        if (xapp.Orientation == Orientation.Landscape) { ... } else { ... } 
        xapp.Rotation += (sender, args) =>
        {
            switch (args.Value)
            {
                case Orientation.LandscapeLeft:
                    break;
                default:
                    // etc.
                    break;
            }
        };

至于布局我会想象RelativeLayout是最方便的选择,因为你可以将方向放在Constraint中。在旋转时,布局会自行刷新。