MvvmCross - 飞行导航,汉堡菜单,Android和iOS滑动菜单

时间:2014-04-04 00:12:12

标签: xamarin.ios xamarin.android xamarin mvvmcross

摘要

我希望为iOS和Android提供单一的MvvmCross解决方案,实现FlyoutNavigation /汉堡菜单/滑动菜单进行导航。

示例代码

https://github.com/benhysell/V.FlyoutTest

问题

Android项目没有问题,iOS项目正在采用视图并将帧大小加倍。我不确定它是否是因为我在iOS上使用FlyoutNavigation组件的方式,或者我在MvvmCross中使用FlyoutNavigation所做的事情。我没有运气就习惯使用自定义ViewPresenters。

详细问题说明

我已经看到了为MvvmCross实施FlyoutNavigation /汉堡菜单/滑动菜单的几种解决方案,但没有一种实现能够在统一解决方案中同时解决Android和iOS问题。每种方法都有自己的Core项目,然后是他们自己的想法,在哪里放置菜单数据,管理视图等。

因此,我开始创建一个统一的架构。

有关iOS和Android项目的单一解决方案的工作演示,请参阅https://github.com/benhysell/V.FlyoutTest,这两个项目都实现了FlyoutNavigation /汉堡菜单/滑动菜单。

我为Android项目找到并关注了http://motzcod.es/post/60427389481/effective-navigation-in-xamarin-android-part-1,来源:https://github.com/jamesmontemagno/Xam.NavDrawer,效果很好。 Android项目使用原生导航抽屉,片段和交换Views很好地进出。

在使用此架构的解决方案中,我有三个主要ViewModel s ... HomeViewModelEnterTimeViewModelCreateNewJobViewModelHomeViewModel保存滑动菜单数据,另外两个提供用户将与之交互的视图。在我的示例中,我创建了一个小时输入应用程序,因此用户可以输入作业时间或创建新作业。

要在iOS中使用我的ViewModel,我决定使用FlyoutNavigation组件https://github.com/Clancey/FlyoutNavigation。我试图使用http://slodge.blogspot.com/2013/07/awesome-sliding-menus-from-big-frank.html中描述的链接/项目,但没有成功使用已经建立的Android项目依赖的.Core项目来增强它们的实现。

我能够快速实现iOS FlyoutNavigation中的HomeView组件,我认为我是自由而明确的,但Views本身的大小是他们的2倍装置。在屏幕截图中,输入时间'并创造新工作'应该像MvvmCross中的任何其他标题一样居中,但是偏向右侧。查看'输入时间'的三个屏幕截图。查看,菜单打开,并创建新工作'视图。 ::我使用了“暂停”按钮来快速,肮脏'汉堡包' ::

enter image description here enter image description here enter image description here

感觉我错过了一些简单的东西/我需要为iOS实现自定义ViewPresenter,但我尝试关注其他人并未成功。关于我应该采取的方向的想法/我应该尝试的事情?

2 个答案:

答案 0 :(得分:1)

发现它! @Stuart指出我正确的方向!

我不宣称这是Android和iOS菜单最干净的解决方案......但这是一个开始。

要解决我的调整大小问题,我更改了FlyoutNavigation中将View.Frame View.BoundsViewWillAppear设置为HomeView的位置。

public override void ViewWillAppear(bool animated) { base.ViewWillAppear(animated); navigation.View.Frame = UIScreen.MainScreen.Bounds; navigation.View.Bounds = UIScreen.MainScreen.Bounds; }

更新的代码发布到github https://github.com/benhysell/V.FlyoutTest

答案 1 :(得分:0)

我认为问题在于您将FlyoutNavigationController置于ViewController内,而NavigationController本身已在FlyoutNavigationController内。

我的猜测是因为FlyoutNavigationController可能会获得更大的宽度。

查看来源 - https://github.com/Clancey/FlyoutNavigation/blob/master/FlyoutNavigation/FlyoutNavigationController.cs#L248 - 看起来View.Bounds.Width使用Bounds来布局它的子视图 - 所以如果你有可能让当前代码正常工作调整弹出框Frame以及{{1}}。

总的来说,我建议您查看像Frank这样的机制 - http://slodge.blogspot.com/2013/07/awesome-sliding-menus-from-big-frank.html - 或者像回归基础https://github.com/sequence/MonoTouch.SlidingControls一样(不确定目前是否构建) 。我发现使用这些并且使用自定义演示器对我来说效果很好。

最后一件事......干得好 - 我喜欢在Droid和iOS上看到统一的样本:)