【问题标题】:Grey bar appearing under Navigation bar after segues Swiftsegues Swift 后导航栏下出现灰色栏
【发布时间】:2016-02-19 14:15:42
【问题描述】:

当我转到特定的 VC 时,我的导航栏下方会出现一个与我的导航栏 + 状态栏大小完全相同的灰色栏。在另一个 VC 中,灰色条不存在,除非我打开 Youtube 然后使用 iOS 9“返回到 'App'”按钮。

这是它的样子:

从图片中可以看出,灰色条并未覆盖 YTPlayerView,而是将其向下推。

这是怎么回事?

编辑

为了清晰起见,我添加了视图层次结构。

编辑

我为有问题的YTPlayerView 添加了约束。

编辑

顶部布局指南的约束为 0

【问题讨论】:

  • 无论您在哪里设置主视图的上边距、插入或内边距(上面的黑色),在这些情况下都会调用两次,添加额外的内边距。您的视图是以编程方式还是在故事板中布局?您设置了哪些限制条件?
  • 什么?我没有为主视图设置任何东西。我编辑了我的帖子以显示视图层次结构这是在故事板上制作的。
  • 那么您在 ViewController 中绝对没有修改约束或框架的代码?
  • "frame" 和 "constraint" 不在此视图的 VC 类中。
  • 好的,这绝对是故事板的问题。我敢打赌这与视频比率限制有关。换句话说,也许视频没有填满视图,在播放的位置上方留下一个灰色条?

标签: ios uinavigationcontroller storyboard


【解决方案1】:

我不完全理解这里的问题,但它似乎是一个视图层次结构问题?

这是有缺陷的等级制度;我更改了 stackView 的颜色,看看它是否是罪魁祸首,但事实并非如此。

我做了更多测试,发现问题包含在 YTPlayerView 中。

YTPlayerView 开始时包含灰色空间,但在 Safari 中访问 Youtube.com 后,使用 iOS 9“返回应用程序”功能后,灰色条将视图推到了自身。

最终解决此问题的方法只是将YTPlayerView 设置为较低的层次结构,如下所示:

使用“返回应用”功能后不再出现灰条。

【讨论】:

    【解决方案2】:

    我曾经遇到过类似的问题。它与使用 segue 无关。问题很可能与您使用的约束有关。设置YTPlayerView 的顶部约束相对于顶部布局指南而不是超级视图的顶部(您当前可能已经完成)。除非我知道您提供的限制,否则我无法具体说明此问题的解决方案。当您“呈现”视图控制器并“关闭”它时,提供关于超级视图顶部的约束会导致此类问题,这类似于您使用 IOS 9 执行的操作返回到应用程序选项。只需尝试使用我提到的约束,如果它不能解决问题,请尝试提供有关您正在使用的约束的一些详细信息。

    编辑

    更具体地说,现在您必须将YTPlayerView的顶部约束设置为固定距离(等于导航栏加上状态栏的高度,64px我假设)到 superview 的顶部,这是 ViewController 的视图。这需要更改,并且需要将顶部约束设置为 0px顶部布局指南。这应该可以解决您的问题。

    编辑 2

    由于您仍然遇到问题,请尝试将顶部约束的 IBOutlet 连接到 ViewController,然后在视图控制器的 viewDidAppear 方法中将其设置为零。

    目标 C

    topConstraint.constant = 0;
    [self.view layoutSubviews];
    

    斯威夫特

    topConstraint.constant = 0
    self.view.layoutSubviews()
    

    确认一下,YTPlayerView 的超级视图是灰色的吧?

    【讨论】:

    • 我用约束更新了问题。不幸的是,我的YTPlayerView 已经对顶部布局指南有限制。
    • 顶部布局指南的顶部空间是多少?是零吗?
    • @WesleyCho 我已经编辑了我的答案,试试看它是否有效。
    • 顶部约束已经是 0 到顶部布局指南。我尝试了您提供的代码(我也连接了插座),但我仍然得到灰色条。
    • YTPlayerView 所在的View 是白色的。我将YTPlayerView 的背景更改为黑色,以与View 形成对比。
    【解决方案3】:

    Swift 3 中的另一种方式:

    func application(_ application: UIApplication, didFinishLaunchingWithOptions 
    launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {
    
         // Navigation bar will be black throughout the app
         UINavigationBar.appearance().barStyle = .blackOpaque
    
        return true
    }
    

    【讨论】:

      【解决方案4】:

      造成这种情况的原因是UIWebBrowserView没有填满YTPlayerView的整个UIWebViewScrollView

      如果您尝试打开视图调试器,您将看到以下内容:

      从视图调试器我们可以看到UIWebBrowserView 没有填充整个UIScrollView,因为确定调整后的内容偏移量的行为默认设置为automatic,文档说:

      var contentInsetAdjustmentBehavior: UIScrollView.ContentInsetAdjustmentBehavior { get set }

      此属性指定如何使用安全区域插入来修改滚动视图的内容 > 区域。该属性的默认值为 > UIScrollView.ContentInsetAdjustmentBehavior.automatic。

      要克服这种行为,只需将ContentInsetAdjustmentBehavior 设置为.never,这将告诉播放器webView 的UIScrollView 不要调整滚动视图插图。

          if #available(iOS 11.0, *) {
             *yourPlayerView*.webView?.scrollView.contentInsetAdjustmentBehavior = .never
          } else {
              // Fallback on earlier versions
          }
      

      【讨论】:

        【解决方案5】:

        您的视频视图被标记为限制您的屏幕尺寸和您希望用于视频源的 16:9 比例。我可以确认这会在视频源上方创建灰色条。您可以尝试不使用纵横比(在这种情况下,屏幕尺寸将自行设置)。

        【讨论】:

        • 不幸的是,即使我将高度设置为常数(除非使用底部 y 约束,否则需要),灰色条出现。我注意到的一件事是,当灰色条出现时,它会将视频视图压缩到一个较小的高度但相同的宽度。
        • 您是否按照我的建议尝试删除纵横比?
        • 是的,我将高度设置为常数,而不是纵横比。
        • 您说“除非使用底部 y 约束”,但底部 Y 不是固定在 Stack View 上吗?
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-01-31
        • 1970-01-01
        相关资源
        最近更新 更多