Objective-C旧项目适配iPhone X时UINavigationBar出现额外黑条求助
嘿,我之前也踩过类似的适配坑,给你几个针对性的排查和解决思路,应该能帮你搞定这个黑条问题:
检查导航栏背景相关设置
旧项目常通过setBackgroundImage:或shadowImage:自定义导航栏,iPhone X的导航栏高度从44pt变成了88pt,旧的背景图尺寸不匹配就容易出现拉伸或黑边。你可以先重置这两个属性试试:[self.navigationController.navigationBar setBackgroundImage:nil forBarMetrics:UIBarMetricsDefault]; [self.navigationController.navigationBar setShadowImage:nil];如果需要自定义背景,建议用颜色(
barTintColor)而非固定尺寸的图片,或者制作适配88pt高度的背景图。排查安全区域约束和启动页
虽然你用了Safe Area,但可能存在约束关联错误。打开Xcode的Debug View Hierarchy,查看导航栏内部的视图布局,看看有没有视图超出导航栏边界,或者约束没正确绑定到Safe Area。
另外一定要确认LaunchScreen.storyboard已经适配了iPhone X的尺寸,不要用旧的Launch Image——如果启动页没适配,系统会按兼容模式处理,直接导致布局异常。调整导航栏的
translucent属性
如果导航栏设置为NO(不透明),iPhone X上状态栏和导航栏的合并逻辑容易出问题。可以先尝试开启透明:self.navigationController.navigationBar.translucent = YES;要是你需要不透明导航栏,就手动自定义背景视图,让它覆盖整个88pt高度:
UIView *customBackground = [[UIView alloc] initWithFrame:CGRectMake(0, 0, [UIScreen mainScreen].bounds.size.width, 88)]; customBackground.backgroundColor = [UIColor whiteColor]; // 替换成你的导航栏颜色 [self.navigationController.navigationBar insertSubview:customBackground atIndex:0];检查
edgesForExtendedLayout属性
旧项目可能设置了edgesForExtendedLayout = UIRectEdgeNone,这会让视图不延伸到导航栏下方,在iPhone X上就容易出现黑条。改回默认值试试:self.edgesForExtendedLayout = UIRectEdgeAll;
如果这些方法都没解决问题,你可以把Debug View Hierarchy里的导航栏视图层级截图发出来,或者贴出相关的导航栏自定义代码,这样能更精准定位问题~
内容的提问来源于stack exchange,提问作者Er. Vihar

