gpt4 book ai didi

iOS 7 状态栏在 iPhone 应用程序中恢复为 iOS 6 默认样式?

转载 作者:行者123 更新时间:2023-12-03 04:01:29 26 4
gpt4 key购买 nike

在 iOS 7 中 UIStatusBar以一种与 View 合并的方式设计,如下所示:

GUI designed by Tina Tavčar
(GUI 由 Tina Tavčar 设计)

  • 这很酷,但是当您的 View 顶部有一些东西时,它会有点弄乱您的 View ,并且它会与状态栏重叠。
  • 是否有一个简单的解决方案(例如在 info.plist 中设置一个属性)可以将其工作方式 [不重叠] 改回 iOS6 中的方式?
  • 我知道一个更直接的解决方案是让 self.view.center.x每个 View Controller + 20 点,但更改它们会搞砸其他维度(具有不同的 self.view.center.x 可能会导致自定义转场出现问题等),并且突然它变成了最好避免的乏味工作。
  • 如果有人可以为此提供单行解决方案,我会很高兴。

  • 附言我知道我可以通过做一些事情来隐藏状态栏
    [[UIApplication sharedApplication] setStatusBarHidden:YES withAnimation:UIStatusBarAnimationNone];

    didFinishLaunchingWithOptions方法,但这是一种解决方法,是避免问题的捷径,所以我认为这不是真正的解决方案。

    最佳答案

    这是从 a blog post I wrote 交叉发布的,但这里是 iOS 7 上状态栏、导航栏和容器 View Controller 的完整概要:

  • 没有办法保留 iOS 6 风格的状态栏布局。状态栏将始终与您在 iOS 7 上的应用程序重叠
  • 不要将状态栏外观与状态栏布局混淆。外观(浅色或默认)不会影响状态栏的布局(框架/高度/重叠)。还需要注意的是,系统状态栏不再有任何背景颜色。当 API 引用 UIStatusBarStyleLightContent 时,它们表示清晰背景上的白色文本。 UIStatusBarStyleDefault 是清晰背景上的黑色文本。
  • 状态栏外观是沿着两个互斥的基础路径之一控制的:您可以以传统方式以编程方式设置它们,或者 UIKit 将根据 UIViewController 的一些新属性为您更新外观。后一个选项默认开启。检查您的应用程序的“基于 ViewController 的状态栏外观”的 plist 值,以查看您使用的是哪一个。如果将此值设置为 YES,则应用中的每个顶级 View Controller (标准 UIKit 容器 View Controller 除外)都需要覆盖 preferredStatusBarStyle,返回默认样式或灯光样式。如果将 plist 值编辑为 NO,则可以使用熟悉的 UIApplication 方法管理状态栏外观。
  • UINavigationController 会将其 UINavigationBar 的高度更改为 44 点或 64 点,具体取决于一组相当奇怪且未记录的约束。如果 UINavigationController 检测到其 View 框架的顶部与其 UIWindow 的顶部在视觉上是连续的,则它会绘制高度为 64 点的导航栏。如果其 View 的顶部与 UIWindow 的顶部不连续(即使仅偏离一点),则它会以“传统”方式绘制导航栏,高度为 44 点。 该逻辑由 UINavigationController 执行,即使它在应用程序的 View Controller 层次结构内有几个子级。 没有办法阻止这种行为。
  • 如果您提供只有 44 磅(88 像素)高的自定义导航栏背景图像,并且 UINavigationController 的 View 边界与 UIWindow 的边界匹配(如#4 中所述),则 UINavigationController 将在框架中绘制您的图像(0,20,320 ,44),在自定义图像上方留下 20 点的不透明黑色空间。这可能会让您误以为自己是绕过规则 #1 的聪明开发人员,但您错了。导航栏仍然是 64 点高。在幻灯片显示样式 View 层次结构中嵌入 UINavigationController 使这一点非常清楚。
  • 请注意 UIViewController 名称困惑的 edgeForExtendedLayout 属性。在大多数情况下,调整edgesForExtendedLayout 没有任何作用。 UIKit 使用此属性的唯一方法是,如果您将 View Controller 添加到 UINavigationController,则 UINavigationController 使用 edgeForExtendedLayout 来确定其 subview Controller 是否应在导航栏/状态栏区域下方可见。在 UINavigationController 本身上设置 edgeForExtendedLayout 不会改变 UINavigationController 是否具有 44 点或 64 点高的导航栏区域。有关该逻辑,请参阅 #4。使用工具栏或 UITabBarController 时,类似的布局逻辑适用于 View 的底部。
  • 如果您想要做的只是防止您的自定义 subview Controller 在 UINavigationController 内部重叠导航栏,则将 edgeForExtendedLayout 设置为 UIRectEdgeNone(或至少是一个不包括 UIRectEdgeTop 的掩码)。在 View Controller 的生命周期中尽早设置此值。
  • UINavigationController 和 UITabBarController 还将尝试在其 subview 层次结构中填充表 View 和集合 View 的 contentInsets。它以类似于 #4 中的状态栏逻辑的方式执行此操作。有一种防止这种情况的编程方法,通过将表 View 和集合 View 的自动调整 ScrollView 插入设置为否(默认为是)。这给 Whisper 和 Riposte 带来了一些严重的问题,因为我们使用 contentInset 调整来控制表格 View 的布局以响应工具栏和键盘移动。
  • 重申:没有办法回到 iOS 6 风格的状态栏布局逻辑。为了接近这一点,您必须将应用程序的所有 View Controller 移动到一个容器 View 中,该 View 从屏幕顶部偏移 20 点,在状态栏后面留下一个有意的黑色 View 以模拟旧外观。这是我们最终在 Riposte 和 Whisper 中使用的方法。
  • Apple 正在非常努力地确保您不会尝试去做 #9。他们希望我们重新设计所有应用程序以覆盖状态栏。然而,出于用户体验和技术原因,有许多令人信服的论点,为什么这并不总是一个好主意。您应该做最适合您的用户的事情,而不是简单地遵循平台的奇思妙想。
  • 关于iOS 7 状态栏在 iPhone 应用程序中恢复为 iOS 6 默认样式?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18294872/

    26 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com