【问题标题】:iOS 7 Navigation Bar Hiding ContentiOS 7 导航栏隐藏内容
【发布时间】:2013-09-29 18:29:01
【问题描述】:

我有一个在 iOS 6 中开发的应用程序。但现在在 iOS 7 中,甚至我的应用程序为 iOS 6 编译,但在 iOS 7 设备上运行顶部导航栏(iOS 7 中的新巨人)我的内容是隐藏的。顶部导航栏覆盖它。如果我使用 CGRect 手动将其向下移动,它在 iOS 7 中看起来不错,但现在 iOS 6 看起来很糟糕(上面有很多空间)。

该应用是在关闭自动布局的情况下构建的,因为自动布局很难正确设置。

我的问题是,有没有一种简单的方法可以只为 iOS 7 下移内容?我真的不想重新打开自动布局并花费一个月的时间来尝试让所有 UI 元素恢复原状。该应用程序非常复杂,有 30 多个屏幕和许多屏幕上的动画视图。

【问题讨论】:

标签: ios objective-c ios7


【解决方案1】:

我认为,即使 iOS 7 在一年多前推出,这个布局问题仍然存在一些误解。所以我最终决定进一步阐述我的答案。

事情是这样的。

因为automaticallyAdjustsScrollViewInsets'默认值是YES,一个非常简单的解决方案可能是添加以下代码:

if ([self respondsToSelector:@selector(setEdgesForExtendedLayout:)]) { // if iOS 7
    self.edgesForExtendedLayout = UIRectEdgeNone; //layout adjustements
}

进入 ViewController 的 -viewDidLoad 方法。

如果你想删除状态栏的怪癖(由于栏是半透明的,所以这并不奇怪)添加self.navigationController.navigationBar.translucent = NO。默认值为YES注意:这与内容无关,因为半透明而与内容有关,但这是一个完全不同的故事!

因为extendedLayoutIncludesOpaqueBars默认是NO,所以self.navigationController.navigationBar.translucent = NO的意思是基本有

self.edgesForExtendedLayout = UIRectEdgeLeft | UIRectEdgeRight| UIRectEdgeBottom; 

或者,更一般地说,类似的东西(就像伪代码给出一个想法......)

BOOL enableTopEdge =  extendedLayoutIncludesOpaqueBars && !navigationBarIsTranslucent
self.edgesForExtendedLayout = (enableTopEdge & UIRectEdgeTop) | UIRectEdgeLeft | UIRectEdgeRight | UIRectEdgeBottom; 

【讨论】:

  • 当我在最新版本的 xcode 中使用它时,为什么会出现“使用未声明的标识符 'UIRectEdgeNone'”?当我看到这个答案时,似乎没有其他人提到这个问题。
  • @James 因为您没有 iOS 7 SDK。你需要升级你的 XCode 才能为 iOS 7 开发。
  • @Pwner 我已经升级了它。这就是为什么我很困惑。我那天早些时候下载并安装了它。它被设置为使用 IOS7 作为我的基础 SDK。
  • 当我这样做时,我得到一个奇怪的效果,状态和导航栏的背景从白色变成深灰色再到浅灰色。这是个常见的问题吗?有谁知道如何阻止它发生?
  • @ThomasW 你需要将状态栏半透明设置为NO
【解决方案2】:

您也可以尝试设置navigationBar.translucent = NO,如this answer 中所述。

【讨论】:

  • @HepaKKes 我不明白反对意见。如果您将半透明设置为否,并且在情节提要的导航控制器中未选中“在不透明条下延伸边缘”,则这是一个有效的答案。见:stackoverflow.com/a/18775241/953105
  • 我还在为SDK 6.1编译,设置edgeForExtendedLayout对我没有影响,但是设置导航栏半透明解决了问题。
【解决方案3】:

隐藏导航栏,请将以下内容添加到您的 UIViewController:

- (void)viewWillAppear:(BOOL)animated
{
    [super viewWillAppear:animated];
    // Hide the top navigation bar.
    [self.navigationController.navigationBar setBackgroundImage:[UIImage new] forBarMetrics:UIBarMetricsDefault];
    self.navigationController.navigationBar.shadowImage = [UIImage new];
    self.navigationController.navigationBar.translucent = YES;
}

显示导航栏,请使用以下命令:

- (void)viewWillAppear:(BOOL)animated
{
    [super viewWillAppear:animated];
    // Show the top navigation bar.
    self.navigationController.navigationBar.translucent = NO;
}

以下是 iOS7 上的结果:

左边的截图是隐藏了导航栏,而右边的图片是显示了导航栏——表格的内容正确地隐藏在导航栏下。

希望这会有所帮助!

【讨论】:

  • 感谢您的代码,我注意到的一件事是您无法单击任何内容,因为导航栏在技术上是不可见的(但未删除)
【解决方案4】:

放 self.edgesForExtendedLayout = UIRectEdgeNone;

在您的 ViewDidLoad 方法中

【讨论】:

    猜你喜欢
    • 2014-10-26
    • 2014-01-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-11-15
    • 2020-08-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多