iOS7 Facebook 应用程序有一个右侧菜单,可以通过从右向左滑动或单击右上角的按钮来显示。打开此菜单时,会出现颜色过渡在整个关闭时状态栏从蓝色变为黑色,反之亦然。
此图像并排显示两个状态栏 https://i.stack.imgur.com/B6quS.jpg
对于带有侧边菜单的 iOS 应用程序来说,这看起来是一个非常好的解决方案。
关于如何实现这一目标有什么想法或方法吗?
我目前正在使用JA侧面板 https://github.com/gotosleep/JASidePanels。
谢谢!
我设法找到了一种非常简单、优雅的方法来做到这一点,它完美地模仿了 Facebook 应用程序的功能。
这是我的方法:
- 创建带有状态栏框架的视图
- 将视图背景颜色设置为黑色,不透明度设置为 0
- 将视图作为子视图添加到任何根视图(您需要一个覆盖中心视图和菜单的视图,这样它就不会局限于任何单个视图 - 一个不错的选择是菜单控制器实现使用的容器视图控制器)
- 在菜单控制器实现的菜单动画方法中设置视图的不透明度
这是我的具体实现,使用MMD抽屉控制器 https://github.com/mutualmobile/MMDrawerController:
我对 MMDrawerController 进行了子类化(实际上我已经有一个子类用于使用带故事板的 MMDrawerController https://github.com/mutualmobile/MMDrawerController/issues/74),并将此代码添加到类的init
method:
// Setup view behind status bar for fading during menu drawer animations
if (OSVersionIsAtLeastiOS7()) {
self.statusBarView = [[UIView alloc] initWithFrame:[[UIApplication sharedApplication] statusBarFrame]];
[self.statusBarView setBackgroundColor:[UIColor blackColor]];
[self.statusBarView setAlpha:0.0];
[self.view addSubview:self.statusBarView];
}
// Setup drawer animations
__weak __typeof(&*self) weakSelf = self; // Capture self weakly
[self setDrawerVisualStateBlock:^(MMDrawerController *drawerController, MMDrawerSide drawerSide, CGFloat percentVisible) {
MMDrawerControllerDrawerVisualStateBlock block;
block = (drawerSide == MMDrawerSideLeft) ? [MMDrawerVisualState parallaxVisualStateBlockWithParallaxFactor:15.0] : nil; // Right side animation : Left side animation
if(block){
block(drawerController, drawerSide, percentVisible);
}
[weakSelf.statusBarView setAlpha:percentVisible]; // THIS IS THE RELEVANT CODE
}];
我还添加了self.statusBarView
作为私有财产。
代码的第一部分创建一个视图,配置它,并将其添加为 MMDrawerController 子类视图的子视图。这OSVersionIsAtLeastiOS7()
方法是一种自定义方法,可简化检查设备是否正在运行 iOS 7(如果不是,您的自定义视图将显示在状态栏下方,这是您不希望看到的)。
第二段代码是MMDrawerController的setDrawerVisualStateBlock
方法,设置打开和关闭菜单时要执行的动画代码。前几行代码是样板代码,它将预构建的动画块之一设置到每个菜单(我想要左侧有视差,但右侧没有视差)。相关代码是该块的最后一行:[weakSelf.statusBarView setAlpha:percentVisible];
,它设置状态栏视图的不透明度以匹配菜单当前打开的百分比。这允许您在 Facebook 应用程序中看到流畅的交叉动画。你还会注意到我已经分配了self
到一个变量weakSelf
,从而避免“保留循环”编译器警告。
这是我使用 MMDrawerController 和子类的具体方法,我这样做更多是为了方便,因为我已经有了子类,而不是因为它必然是最好的方法或唯一的方法。它可能可以通过其他几种方式实现,使用没有子类的 MMDrawerController,或使用任何其他侧抽屉菜单实现。
最终结果是状态栏后面的动画平滑淡入黑色,正如您在新的 Facebook 应用程序中看到的那样。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)