对于不同的视图和平台(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模拟器。 (解决方案基于尺寸更改来检测旋转。)
答案 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中。在旋转时,布局会自行刷新。