ios - 当状态栏被隐藏或显示时, View 会改变自己的框架

标签 ios layout statusbar

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

我试着观察 statusBarHidden并强制更改导航栏和内容 View 的框架,但我认为这不是 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

尝试在我的内容 View Controller 中使用这些设置:
self.edgesForExtendedLayout = UIRectEdgeNone;

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

根本没有帮助

最佳答案

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

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

与其他 View 的布局没有不必要的副作用。好的!

关于ios - 当状态栏被隐藏或显示时, View 会改变自己的框架,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20380676/

相关文章:

ios - 带有选项问题的 StringByReplacingOccurrencesOfString

html - 在同一行问题中布置具有不同高度的不同列

javascript - 仅当div高于一定高度时才在div底部显示 "expand"按钮

android - 如何在android通知中增加remoteview的高度

iphone - 如何在 iPhone 应用程序上获得黑色状态栏?

ios - AF网络 : Getting "finished with error - code: -999" warning

ios - Button.center 不适用于 Swift 3/4 中的所有屏幕

ios - Swift 的 NSURLRequest 问题

java - 在将 swt 中的组的可见性设置为 false 后如何重新布局 swt 中的对话框

macos - 操作系统状态栏上的 "disabled"图标规范