转场后导航栏下出现灰色条 Swift
Grey bar appearing under Navigation bar after segues Swift
当我转到特定 VC 时,导航栏下方会出现一个与我的导航栏大小完全相同的灰色条 + 状态栏。在另一个 VC 中,灰色条不存在,除非我打开 Youtube 然后使用 iOS 9 "back to 'App'" 按钮。
这是它的样子:
从图中可以看出,灰色条没有覆盖 YTPlayerView,而是将其向下推。
这是怎么回事?
编辑
为了清楚起见,我添加了视图层次结构。
编辑
我为有问题的 YTPlayerView
添加了约束。
编辑
顶部布局指南的约束为 0
我曾经遇到过类似的问题。它与使用 segues 无关。问题很可能与您使用的约束有关。将 YTPlayerView
的顶部约束设置为相对于顶部布局指南而不是超级视图的顶部(您当前可能已经完成)。除非我知道您提供的限制,否则我不能具体说出解决此问题的方法。当您是 "Presenting" 视图控制器和 "Dismissing" 它时,提供关于超级视图顶部的约束会导致此类问题,这类似于您对 [=54= 执行的操作] 9回到app选项。尝试使用我提到的约束,如果它不能解决问题,请尝试提供有关您正在使用的约束的一些详细信息。
编辑
更具体地说,现在您必须将 YTPlayerView
的顶部约束设置为固定距离(等于导航栏的高度加上状态栏, 64px 我假设)到 superview 的顶部,这是 ViewController 的 view。这需要更改,顶部约束需要设置为 0px 到 top layout guide。那应该可以解决您的问题。
编辑 2
由于您仍然遇到问题,请尝试将顶部约束的 IBOutlet
连接到 ViewController,然后在视图控制器的 viewDidAppear
方法中将其设置为零。
Objective C:
topConstraint.constant = 0;
[self.view layoutSubviews];
Swift:
topConstraint.constant = 0
self.view.layoutSubviews()
确认一下,YTPlayerView
的父视图是灰色的对吗?
您的视频观看被标记为限制屏幕大小和您想要的视频供稿的 16:9 比例。我可以确认这会在视频源上方创建灰色条。您可以尝试不设置宽高比(在这种情况下屏幕尺寸将自行设置)。
我不完全理解这里的问题,但它似乎是视图层次结构问题?
这是有缺陷的层次结构;我更改了 stackView 的颜色以查看它是否是罪魁祸首,但事实并非如此。
我做了一些更多的测试,发现问题包含在 YTPlayerView
.
YTPlayerView
开始包括灰色 space 但在 Safari 中进入 Youtube.com 后使用 iOS 9 "Back to App" 功能灰色条将视图向下推入自身。
最终解决此问题的只是将 YTPlayerView
设置在层次结构中较低的位置,如下所示:
使用"Back to App"功能后灰色条不再出现。
Swift3 中的另一种方式:
func application(_ application: UIApplication, didFinishLaunchingWithOptions
launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {
// Navigation bar will be black throughout the app
UINavigationBar.appearance().barStyle = .blackOpaque
return true
}
原因是UIWebBrowserView
没有填满YTPlayerView
的整个UIWebViewScrollView
如果您尝试打开视图调试器,您将看到以下内容:
从视图调试器我们可以看到 UIWebBrowserView
没有填充整个 UIScrollView
因为确定调整后的内容偏移量的行为默认设置为 automatic
,文档说:
var contentInsetAdjustmentBehavior: UIScrollView.ContentInsetAdjustmentBehavior { get set }
This property specifies how the safe area insets are used to modify the content > area of the scroll view. The default value of this property is > UIScrollView.ContentInsetAdjustmentBehavior.automatic.
要克服此行为,只需将 ContentInsetAdjustmentBehavior
设置为 .never
,这将告诉播放器 webView 的 UIScrollView
不要调整滚动视图插入。
if #available(iOS 11.0, *) {
*yourPlayerView*.webView?.scrollView.contentInsetAdjustmentBehavior = .never
} else {
// Fallback on earlier versions
}
当我转到特定 VC 时,导航栏下方会出现一个与我的导航栏大小完全相同的灰色条 + 状态栏。在另一个 VC 中,灰色条不存在,除非我打开 Youtube 然后使用 iOS 9 "back to 'App'" 按钮。
这是它的样子:
从图中可以看出,灰色条没有覆盖 YTPlayerView,而是将其向下推。
这是怎么回事?
编辑
为了清楚起见,我添加了视图层次结构。
编辑
我为有问题的 YTPlayerView
添加了约束。
编辑
顶部布局指南的约束为 0
我曾经遇到过类似的问题。它与使用 segues 无关。问题很可能与您使用的约束有关。将 YTPlayerView
的顶部约束设置为相对于顶部布局指南而不是超级视图的顶部(您当前可能已经完成)。除非我知道您提供的限制,否则我不能具体说出解决此问题的方法。当您是 "Presenting" 视图控制器和 "Dismissing" 它时,提供关于超级视图顶部的约束会导致此类问题,这类似于您对 [=54= 执行的操作] 9回到app选项。尝试使用我提到的约束,如果它不能解决问题,请尝试提供有关您正在使用的约束的一些详细信息。
编辑
更具体地说,现在您必须将 YTPlayerView
的顶部约束设置为固定距离(等于导航栏的高度加上状态栏, 64px 我假设)到 superview 的顶部,这是 ViewController 的 view。这需要更改,顶部约束需要设置为 0px 到 top layout guide。那应该可以解决您的问题。
编辑 2
由于您仍然遇到问题,请尝试将顶部约束的 IBOutlet
连接到 ViewController,然后在视图控制器的 viewDidAppear
方法中将其设置为零。
Objective C:
topConstraint.constant = 0;
[self.view layoutSubviews];
Swift:
topConstraint.constant = 0
self.view.layoutSubviews()
确认一下,YTPlayerView
的父视图是灰色的对吗?
您的视频观看被标记为限制屏幕大小和您想要的视频供稿的 16:9 比例。我可以确认这会在视频源上方创建灰色条。您可以尝试不设置宽高比(在这种情况下屏幕尺寸将自行设置)。
我不完全理解这里的问题,但它似乎是视图层次结构问题?
这是有缺陷的层次结构;我更改了 stackView 的颜色以查看它是否是罪魁祸首,但事实并非如此。
我做了一些更多的测试,发现问题包含在 YTPlayerView
.
YTPlayerView
开始包括灰色 space 但在 Safari 中进入 Youtube.com 后使用 iOS 9 "Back to App" 功能灰色条将视图向下推入自身。
最终解决此问题的只是将 YTPlayerView
设置在层次结构中较低的位置,如下所示:
使用"Back to App"功能后灰色条不再出现。
Swift3 中的另一种方式:
func application(_ application: UIApplication, didFinishLaunchingWithOptions
launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {
// Navigation bar will be black throughout the app
UINavigationBar.appearance().barStyle = .blackOpaque
return true
}
原因是UIWebBrowserView
没有填满YTPlayerView
UIWebViewScrollView
如果您尝试打开视图调试器,您将看到以下内容:
从视图调试器我们可以看到 UIWebBrowserView
没有填充整个 UIScrollView
因为确定调整后的内容偏移量的行为默认设置为 automatic
,文档说:
var contentInsetAdjustmentBehavior: UIScrollView.ContentInsetAdjustmentBehavior { get set }
This property specifies how the safe area insets are used to modify the content > area of the scroll view. The default value of this property is > UIScrollView.ContentInsetAdjustmentBehavior.automatic.
要克服此行为,只需将 ContentInsetAdjustmentBehavior
设置为 .never
,这将告诉播放器 webView 的 UIScrollView
不要调整滚动视图插入。
if #available(iOS 11.0, *) {
*yourPlayerView*.webView?.scrollView.contentInsetAdjustmentBehavior = .never
} else {
// Fallback on earlier versions
}