当状态栏被隐藏或显示时,视图会更改自己的框架

时间:2013-12-04 16:27:56

标签: ios layout statusbar

我需要隐藏并显示我的应用程序中的状态栏,但是当我使用setStatusBarHidden执行此操作时,我的导航栏会更改它自己的框架(它以20pt向上移动)。内容视图相应地改变它自己的框架(它以20pt向上移动并增加自己的高度)。如何在显示或隐藏状态栏时更改此行为并让我的栏和内容保持不变?

我试图观察statusBarHidden并强制更改导航栏和内容视图的框架,但我认为这不是UI可扩展性的最佳方式。也许有更好的方法?

- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context
{
    if ([keyPath isEqualToString:@"statusBarHidden"]){
        if ([change[NSKeyValueChangeNewKey]  isEqual: @(1)]){
            self.navigationBar.frame = ({CGRect newFrame = self.navigationBar.frame; newFrame.origin.y = 20; newFrame;});
        }else {
            self.navigationBar.frame = ({CGRect newFrame = self.navigationBar.frame; newFrame.origin.y = 20; newFrame;});
        }
    }
}

UPD

尝试在我的内容视图控制器中使用这些设置:

self.edgesForExtendedLayout = UIRectEdgeNone;

...

-(BOOL)automaticallyAdjustsScrollViewInsets{
    return NO;
}
-(BOOL)prefersStatusBarHidden{
    return NO;
}
-(CGSize)preferredContentSize {
    return CGSizeMake(320, 504);
}

根本没有帮助

1 个答案:

答案 0 :(得分:0)

看起来我找到了最好的解决方案。 我不会使用setStatusBarHidden隐藏状态栏 我会将它与新的不透明窗口重叠:

overlayWin = [[UIWindow alloc] init];
overlayWin.backgroundColor = NAVBAR_COLOR;
overlayWin.windowLevel = UIWindowLevelStatusBar+1.f;
overlayWin.frame = [UIApplication sharedApplication].statusBarFrame;
overlayWin.userInteractionEnabled = NO;

其他视图的布局没有不必要的副作用。尼斯!