首页 文章

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

提问于
浏览
2

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

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 回答

  • 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中 . 在旋转时,布局会自行刷新 .

相关问题