iOS 11 中的 SafeArea:如何在没有安全区域的情况下使用自定义导航栏在主屏幕上添加来自 Objective-c 代码的视图

Posted

技术标签:

【中文标题】iOS 11 中的 SafeArea:如何在没有安全区域的情况下使用自定义导航栏在主屏幕上添加来自 Objective-c 代码的视图【英文标题】:SafeArea in iOS 11: how add view on main screen with custom navigationBar without safeArea from code in objective-c 【发布时间】:2017-09-25 09:24:25 【问题描述】:

在我的 Objective-C mainScreen 项目中,自定义 NavigationBar(从代码创建):

mainNavigationController = [[NavigationController alloc] initWithRootViewController:mainMenuViewController];
mainNavigationController.navigationBar.barStyle = UIBarStyleBlackTranslucent;
mainNavigationController.delegate = self;
mainNavigationController.navigationBar.tintColor = [UIColor whiteColor];

UIWindow* window = self.window;
window.backgroundColor = [UIColor whiteColor];
window.rootViewController = mainNavigationController;
[window makeKeyAndVisible];

我改变 self.view 的大小 [UIScreen mainScreen].applicationFrame]:

UIView* mainView = [[[MainViewControllerView alloc] initWithFrame:[UIScreen mainScreen].applicationFrame] autorelease];
self.view = mainView;

在 mainScreenView 我添加滚动视图:

scrollView = [[UIScrollView alloc] initWithFrame:self.bounds];
scrollView.autoresizesSubviews = YES;
scrollView.autoresizingMask = UIViewAutoresizingNone;
scrollView.backgroundColor = [UIColor clearColor];
scrollView.bounces = NO;

并在 scrollView 中添加一些 subView:

[scrollView addSubview:myLogoView];
[scrollView addSubview:littleScrollView];
[scrollView addSubview:firstButton];
[scrollView addSubview:secondButton];
[scrollView addSubview:thirdButton];
[scrollView addSubview:fouthButton];
[scrollView addSubview:fifthButton];
[scrollView addSubview:sixthButton];
[scrollView addSubview:seventhButton];
[scrollView addSubview:activityIndicatorView];

https://www.dropbox.com/s/ttrkolgnch80kr9/safeArea.png?dl=0

如果使用 XCODE 8 和 ios XCode 9 和iOS 11 myLogoView 在我的自定义导航栏(高度 == 44)myLogoView Y == 64.0 在设备屏幕的绝对值坐标中的位置,在 iOS 10(在 xCode9 下)一切正常 - 添加在 mainScreen 上查看放置在屏幕的起始坐标中并忽略自定义 NavigationBar 的高度。

在 swift 和 storyboard 中,我知道它是如何在 iOS11 中轻松删除 safeArea 顶行的,但如何在 Objective-C 中删除 safeArea 从代码

如何解决这个问题?

【问题讨论】:

【参考方案1】:

iOS 11 中的安全区域是顶部和底部布局的替换,Apple 提供了更多详细信息,如下所示:

代表视图部分的布局指南 不受酒吧和其他内容的影响。在 iOS 11 中,Apple 正在弃用 顶部和底部布局指南,并用一个保险箱替换它们 区域布局指南。

所以基于这个现在的顶部和底部布局替换为单个 安全区域 但如果您不使用默认 NavigationBar 则重新开始,因此您可以禁用情节提要中的安全区域,如下所示:

您可以取消选中安全区域,它将恢复为顶部和底部布局。

参考之前和之后取消选中安全区域:

之前或默认:

取消选中安全区域或旧行为:

希望这将有助于了解与顶部和底部布局相关的新 iOS 11 更新,并根据此布局更改更改您的代码。

这里还有一篇很好的博客来解释更多关于安全区域布局的信息:Safe area

【讨论】:

对不起,但我提到的问题知道如何从 storyBoard 和 Swift 中做到这一点。感兴趣的是Objective-c 但是如果您从情节提要中禁用安全区域,它将解决您的问题,因为您提到安全区域正在为您的自定义导航栏造成问题,所以我认为禁用后不需要将任何内容更改为与 iOS 10 相同。 在我的项目中没有情节提要,我无法从设置面板禁用此安全区域... 好的,您可以在这里发布您的自定义导航条代码,以便我了解该布局有什么问题吗?还请分享屏幕截图它在 iOS 11 中的外观与安全区域。 dropbox.com/s/ttrkolgnch80kr9/safeArea.png?dl=0" >

以上是关于iOS 11 中的 SafeArea:如何在没有安全区域的情况下使用自定义导航栏在主屏幕上添加来自 Objective-c 代码的视图的主要内容,如果未能解决你的问题,请参考以下文章

在导航栏iOS 11安全区域下定位视图

如何在不使用 SafeArea 的情况下检查设备是不是有缺口?

以编程方式为 safeArea 调整 collectionView

在跨平台原生 Swift 应用程序中计算 SafeArea 常量

Unity SafeArea 在不同的起始轮换之间不一致

在 Flutter 中使用 SafeArea