我有一个UIViewController
添加其他UIViewController
作为子项,以便我可以使用他们的view
来创建菜单层次结构。以下图像代表我当前的界面。
显示菜单前的界面:
显示菜单后的界面:
以下解释了我的层次结构:
在AppDelegate
中,我创建了一个MainContainerViewController
的实例,并将其设置为window
' s rootViewController
。视图控制器充当容器,允许我添加智能视图控制器。
在MainContainerViewController
中,我创建了CenterViewController
的实例,并将其添加为rootViewController
的{{1}}。我将导航控制器添加为子视图控制器,将导航控制器UINavigationController
添加为view
的子视图。我还创建了MainContainerViewController
的实例,将其添加为子视图控制器并将其视图插入导航控制器LeftMenuViewController
下方。这样,我就可以点按view
的{{1}}并通过向右滑动导航控制器UIBarButtonItem
来显示菜单。
我在导航控制器CenterViewController
中添加了view
,这样我就可以通过滑动UIScreenEdgePanGestureRecognizer
view
来显示菜单在右边。
我在导航控制器的视图中添加了CenterViewController
,这样我就可以通过点按导航控制器的视图来关闭菜单。
我希望能够使用view
允许用户以交互方式关闭菜单,类似于Slack允许的菜单,如果您熟悉他们的移动UI。
我将摇动手势识别器添加到导航控制器的UITapGestureRecognizer
,就像我使用上述两个手势识别器一样。但是,我无法让UIPanGestureRecognizer
和view
一起玩得很好。我尝试过实现UIScreenEdgePanGestureRecognizer
方法的组合而没有成功。我觉得手势识别器有点迷失,而且我不知道从哪里开始试图让这些手势识别器发挥得很好。
我已经按照Apple example进行了调整,以适应我的要求。如果未显示菜单,则UIPanGestureRecognizer
应允许UIGestureRecognizerDelegate
打开菜单。
UIPanGestureRecognizer
我的期望:
UIScreenEdgePanGestureRecognizer
func gestureRecognizer(_ gestureRecognizer: UIGestureRecognizer, shouldBeRequiredToFailBy otherGestureRecognizer: UIGestureRecognizer) -> Bool {
if leftMenuState == .hidden {
if gestureRecognizer == panGestureRecognizer && otherGestureRecognizer.view!.isDescendant(of: gestureRecognizer.view!) {
return true
}
}
return false
}
并关闭菜单UIScreenEdgePanGestureRecognizer
并关闭菜单会发生什么:
通过使用CenterViewController
进行平移无法打开菜单,因为CenterViewController
收到了活动
菜单由UIScreenEdgePanGestureRecognizer
菜单已由UIPanGestureRecognizer
或UIBarButtonItem
启用预期功能需要做些什么?