在iOS 7中隐藏状态栏时防止UINavigationController调整原点
Posted
技术标签:
【中文标题】在iOS 7中隐藏状态栏时防止UINavigationController调整原点【英文标题】:Preventing UINavigationController from adjusting origin when status bar is hidden in iOS 7 【发布时间】:2014-02-03 09:14:36 【问题描述】:我在UITabBar
控制器中有一系列UINavigationControllers
。我想隐藏状态栏。但是,当我这样做时,导航栏会自行调整以变短:
Problem Image
我怎样才能防止这种情况并得到如下图所示的东西?
desired outcome
目前我只是使用[[UIApplication sharedApplication] setStatusBarHidden:YES withAnimation:UIStatusBarAnimationNone];
隐藏状态栏
【问题讨论】:
【参考方案1】:使用自定义 sizeThatFits 创建自定义 UINavigationBar。
@implementation UINavigationBar (customNavigationBar)
- (CGSize)sizeThatFits:(CGSize)size
CGSize newSize = CGSizeMake(self.frame.size.width,64);
return newSize;
@end
如果有任何疑问请联系我们
【讨论】:
将高度设置为64-[UIApplication sharedApplication].statusBarFrame.size.height
似乎可行,但在更改状态栏时会导致一些卡顿
将高度设置为不在状态栏中的导航栏
不,我明白这一点。但是当状态栏不隐藏时,使用 64 的固定高度会导致 84px 高的导航栏。因此,我们需要减去状态栏的高度以获得一致的 64px
上帝 ios 7 会很烦人
为什么要增加导航栏尺寸【参考方案2】:
您可以在 Storyboard 中创建一个容器视图并设置一个固定的顶部空间(与状态栏相同)。你可以在这个视图中嵌入你的NavigationController
。
Image 1
Image 2
我希望这会有所帮助。
编辑:添加图片
【讨论】:
你的意思是嵌入UITabBarController吗? 这个,或者特定的 UINavigationController。这取决于您的需求。这只是一个想法,也许有更好的解决方案。 这不能使用 Autolayout 解决吗? 在您的图片中,导航栏的高度仍然为 44px,而不是所需的 64。您只是将 20px 的间隙从底部移到顶部【参考方案3】:在 appDelegate.m - 创建导航控制器并将其设置为根视图控制器
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
UIStoryboard *storyBoard = [UIStoryboard storyboardWithName:@"Main" bundle:[NSBundle mainBundle]];
HomeViewController *homeViewController = (HomeViewController *)[storyboard instantiateViewControllerWithIdentifier:@"HomeViewController"];
self.navigationController = [[UINavigationController alloc] initWithRootViewController:homeViewController];
[self.navigationController setNavigationBarHidden:YES];
self.window.rootViewController = self.navigationController;
return YES;
然后,您可以使用 UIImageView + 标签 + 按钮等重新创建导航栏,而不是导航栏... 然后您需要提供正确的自动调整大小掩码,以便 UIImageView 正确调整自身
【讨论】:
【参考方案4】:这是 codercat 答案的修改版本。隐藏状态栏时,导航栏的origin.y
为0。本例中,我设置它的高度为64。当状态栏不隐藏时,保持默认高度44。
@implementation UINavigationBar (customNavigationBar)
- (CGSize)sizeThatFits:(CGSize)size
CGPoint originInWindow = [self.window convertPoint:CGPointZero fromView:self];
CGFloat height = originInWindow.y > 1 ? 44 : 64;
return CGSizeMake(self.frame.size.width, height);
@end
【讨论】:
以上是关于在iOS 7中隐藏状态栏时防止UINavigationController调整原点的主要内容,如果未能解决你的问题,请参考以下文章