JVMenuPopover 1.5

JVMenuPopover 1.5

测试已测试
Lang语言 Obj-CObjective C
许可证 MIT
发布最后发布2019年8月

Jorge Valbuena 维护。




JVMenuPopover 版本 许可证 平台

这是一个简单的菜单控制器,我尝试模拟在 iOS 中切换应用的原生动画。它可以以许多不同方式使用,您也可以自定义它以使用自己的动画。

预览

• 滑入与 bounceAnimation 动画菜单

screenshot-1

• 具有滑动动画的菜单

screenshot-1

需求

使用iOS11+开发和测试

安装

JVMenuPopover可以通过CocoaPods获得。要安装它,请将以下行添加到您的Podfile中:

pod "JVMenuPopover"

使用

要运行示例项目,首先从示例目录运行克隆存储库,然后运行pod install

在您的项目中使用JVMenuPopover。

  • 在您的函数application: didFinishLaunchingWithOptions:中,我们需要设置我们的UIWindowJVMenuNavigationController以及您的根视图控制器。请随意遵循我的项目示例实现,我在其中为这些对象使用了懒加载。

    • 还要注意的是,设置我们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

  • 添加了横屏支持。请注意,您可能需要提供更大的图像以显示背景。