首页 文章

如何防止UINavigationBar覆盖iOS 7中的顶部?

提问于
浏览
95

更新到Xcode 5后,我所有应用程序视图中的导航栏都向下移动 . 下面是一些截图,第一个显示视图中的所有内容,因为它被拉下来,第二个显示所有内容都未触及 . 搜索栏应从导航栏开始 .

All Content

All Content on Idle

有谁知道如何解决这个问题?

编辑:我之前尝试过这个建议:

if ([self respondsToSelector:@selector(edgesForExtendedLayout)])
        self.edgesForExtendedLayout = UIRectEdgeNone;

但它产生了非常奇怪的结果 .

Solution Attempt

这可能是因为我在此视图控制器下面有一个“幻灯片菜单”,由于导航栏的透明度而出现 .

11 回答

  • 222

    设置 navigation bar's translucent property to NO

    self.navigationController.navigationBar.translucent = NO;
    

    这将修复视图在导航栏和状态栏下面的框架 .

    如果您必须显示和隐藏导航栏,请使用

    if ([self respondsToSelector:@selector(edgesForExtendedLayout)])
        self.edgesForExtendedLayout = UIRectEdgeNone;   // iOS 7 specific
    

    在你的 viewDidLoad 方法中 .

  • 10

    iOS 7 中默认为 all Controller translucent property value is YES, so you set translucent property NO ,用于此问题 .

    self.navController.navigationBar.translucent = NO;
    
  • 3

    您可以在此屏幕的View Controller的属性检查器中禁用“扩展边缘”(如下图所示):

    enter image description here

  • 8

    这适用于iOS 8.1上的swift

    navigationController?.navigationBar.translucent = false
    
  • 29

    如果你想在你的 navigationBarviewDidLoadviewWillAppear 的末尾保持半透明度,请添加以下代码:

    [self.view sendSubviewToBack:self.tableView]
    

    不知何故,如果您的 scrollView 子类( UITableViewUICollectionView 等)在当前视图 subviews 中位于 index 0,它将根据您的 navigationBar 自动调整插入 . 它也不应该影响iOS7之前版本的UI .

    EDIT 如果以编程方式初始化 UITableView ,则最好使用此 [self.view insertSubview:self.tableView atIndex:0]; 将其添加到视图中

  • -3

    您可以将此方法添加到视图控制器中,如URL所示:

    -(void)viewDidLayoutSubviews
    {
        [super viewDidLayoutSubviews];
        self.searchBar.frame = 
        CGRectMake(0, self.topOfViewOffset, self.searchBar.frame.size.width, self.searchBar.frame.size.height);
    }
    
  • 3

    Swift 4

    在viewDidLoad方法中设置以下代码行:

    self.navigationController?.navigationBar.isTranslucent = false
    
  • 20

    另一种方法是在视图控制器上设置 self.automaticallyAdjustsScrollViewInsets = YES; . 默认情况下启用此选项 . 但在你的情况下:

    我看到你正在使用EGORefreshHeaderView . 它使用UITableView的contentInset . 因此,当您释放它时, Headers 将重置顶部插入而不是恢复以前的值 .

  • 0

    上述答案可能会解决您的问题,但会引发许多其他问题,例如:自定义视图不以Y为中心,因为导航栏变得不透明,因此它会压低您的所有视图 .

    拥有半透明导航栏不会导致此问题,也不会导致您在iOS 11中发布的问题 . 但是我没有找到解决办法让它适用于从iOS 9开始的所有iOS平台 .

  • 2

    如果你想完全控制视图并避免错误调整iOS,可以在UITableView子类中调整insets(滚动和指示符) - (void)willMoveToWindow:(UIWindow *)newWindow . 适合我 .

  • -1

    另一个选项是以源代码模式打开Info.plist文件并输入以下信息:

    <key>UIViewControllerBasedStatusBarAppearance</key>
    <false/>
    <key>UIStatusBarHidden</key>
    <true/>
    

    希望这可以帮助 .

相关问题