这是一个简单的菜单控制器,我尝试模拟在 iOS 中切换应用的原生动画。它可以以许多不同方式使用,您也可以自定义它以使用自己的动画。
预览
• 滑入与 bounceAnimation 动画菜单
• 具有滑动动画的菜单
需求
使用iOS11+开发和测试
安装
JVMenuPopover可以通过CocoaPods获得。要安装它,请将以下行添加到您的Podfile中:
pod "JVMenuPopover"
使用
要运行示例项目,首先从示例目录运行克隆存储库,然后运行pod install
。
在您的项目中使用JVMenuPopover。
-
在您的函数
application: didFinishLaunchingWithOptions:
中,我们需要设置我们的UIWindow
、JVMenuNavigationController
以及您的根视图控制器。请随意遵循我的项目示例实现,我在其中为这些对象使用了懒加载。- 还要注意的是,设置我们
UIWindow
的背景图像对于能够使用背景图像实现我们的菜单效果至关重要。
- 还要注意的是,设置我们
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
// setting up app window
[self setupCustomWindow];
return YES;
}
#pragma mark - Custom Accessors
- (JVMenuRootViewController *)rootViewController
{
if (!_rootViewController)
{
_rootViewController = [[JVMenuRootViewController alloc] init];
}
return _rootViewController;
}
- (JVMenuNavigationController *)navigationController
{
if (!_navigationController)
{
_navigationController = [[JVMenuNavigationController alloc] initWithRootViewController:self.rootViewController transparentNavBar:YES];
}
return _navigationController;
}
#pragma mark - UIWindow Customization
- (void)setupCustomWindow
{
self.window = [[UIWindow alloc] init];
self.window.rootViewController = self.navigationController;
self.window.backgroundColor = [UIColor colorWithPatternImage:[[UIImage imageNamed:@"app_bg1.jpg"] imageScaledToWidth:self.window.frame.size.width]];
[self.window makeKeyAndVisible];
[self.window addSubview:self.navigationController.view];
}
- 然后,在我们的根控制器中,我们需要使用
JVMenuItems
类来设置我们的菜单数据模型,该类持有所有菜单图像、标题和关闭按钮图像进行显示。我们还可以设置我们首选的菜单动画。并且我们需要创建JVMenuPopoverView
,这是实际带菜单项的菜单。注意:在这里采用同样的懒加载方法。
- (JVMenuItems *)menuItems
{
if(!_menuItems)
{
_menuItems = [[JVMenuItems alloc] initWithMenuImages:@[[UIImage imageNamed:@"home-48"],
[UIImage imageNamed:@"about-48"],
[UIImage imageNamed:@"settings-48"],
[UIImage imageNamed:@"business_contact-48"],
[UIImage imageNamed:@"ask_question-48"]]
menuTitles:@[@"Home",
@"About Us",
@"Our Service",
@"Contact Us",
@"Help?"]
menuCloseButtonImage:[UIImage imageNamed:@"cancel_filled-50"]];
_menuItems.menuSlideInAnimation = YES;
}
return _menuItems;
}
- (JVMenuPopoverView *)menuPopover
{
if(!_menuPopover)
{
_menuPopover = [[JVMenuPopoverView alloc] initWithFrame:self.view.frame menuItems:self.menuItems];
_menuPopover.backgroundColor = [[UIColor blackColor] colorWithAlphaComponent:0.5];
_menuPopover.delegate = self;
}
return _menuPopover;
}
- 然后,我们需要设置我们的菜单栏按钮,使用我们喜欢的图像,并设置目标来显示菜单。
- (void)viewDidLoad
{
[super viewDidLoad];
// creating menu
self.menuPopover = [self menuPopover];
// setting up menu bar button
self.navigationItem.leftBarButtonItem = [[UIBarButtonItem alloc] initWithImage:[UIImage imageNamed:@"menu_black-48"] style:UIBarButtonItemStylePlain target:self action:@selector(showMenu)];
self.navigationItem.leftBarButtonItem.tintColor = [UIColor blackColor];
}
- 最后,我们将我们的菜单栏按钮设置为调用的
JVMenuPopoverView
辅助函数,并设置我们的菜单代理,以了解用户选择了哪个菜单项以及展示新的视图控制器等。**注意**:iOS 9之后,我们不能再在我们的根控制器上显示self,因此您可能需要有一个rootController的属性,并用它来代替。
#pragma mark - Menu Helper Functions
- (void)showMenu
{
[self.menuPopover showMenuWithController:self];
}
#pragma mark - Menu Delegate
- (void)menuPopoverDidSelectViewControllerAtIndexPath:(NSIndexPath *)indexPath
{
if(indexPath.row == 0)
{
[self.navigationController setViewControllers:@[self.rootController]; // this is a temporary fix for the issue on iOS 9 not able to set 'self' as the current view controller
}
else if(indexPath.row == 1)
{
[self.navigationController setViewControllers:@[self.secondController]];
}
}
作者 & 支持
如果您发现任何错误或潜在改进空间,请与我联系,我确信肯定会有的。Jorge Valbuena (@JV17),[email protected]。顺便说一句!欢迎您为此库提供支持或进行改进。
许可协议
JVMenuPopover遵循MIT许可协议。有关更多信息,请参阅LICENSE文件。
发布说明
版本 1.4
- 改进了横屏支持。现在,在旋转之前菜单先关闭,以避免图像尺寸问题。
- 在菜单视图中添加了新的委托,可在菜单视图将显示或隐藏时通知您。
- 在菜单视图中添加了一个新属性,表示视图是否隐藏。
- 在rootController上添加了可选函数来隐藏和显示导航项按钮(菜单按钮),请参考示例项目。
版本 1.3
- 添加了横屏支持。请注意,您可能需要提供更大的图像以显示背景。