iOS MapView 位于导航栏、状态栏和标签栏控制器下

Posted

技术标签:

【中文标题】iOS MapView 位于导航栏、状态栏和标签栏控制器下【英文标题】:iOS MapView goes under navigation bar, status bar, and tab bar controller 【发布时间】:2013-10-03 12:01:10 【问题描述】:

我有一个带有导航控制器和标签栏控制器的 ViewController。这个 ViewController 有 2 个按钮来切换滚动视图和地图视图的可见性。主要是让这 2 个按钮始终显示在同一个位置,无论方向或碰巧可见的视图如何。

我遇到的问题是 MapView 的大小不正确。如果我只是给它一个来自 self.view.bounds 的框架,它会在导航栏/标签栏下方 - 基本上占据了整个屏幕。这会抛出我的切换按钮的位置。

我注意到我的 ScrollView 做了同样的事情(使用背景颜色和半透明导航栏),但子视图的定位保持在可见区域内(导航栏和标签栏之间)。因此,当我添加切换按钮时,它们会显示在正确的位置。

当我按下切换按钮时,我只是将按钮的父视图重新分配给现在显示的视图(ScrollView 或 MapView)。这始终适用于滚动视图,但由于定位,当显示 MapView 时,它们最终会进入导航栏下方。

我曾尝试手动为 MapView 创建框架,但结果很奇怪。我将它用于框架:

CGRect mapFrame = CGRectMake(
    0,
    (self.navigationController.navigationBar.frame.size.height + [UIApplication sharedApplication].statusBarFrame.size.height),
    self.view.frame.size.width,
    (
     self.view.frame.size.height
     - (self.navigationController.navigationBar.frame.size.height + [UIApplication sharedApplication].statusBarFrame.size.height + self.tabBarController.tabBar.frame.size.height)
    )
);

然后我设置自动调整大小的蒙版

[self.mapView setAutoresizingMask:UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight | UIViewAutoresizingFlexibleTopMargin | UIViewAutoresizingFlexibleBottomMargin];

但是,如果我以横向模式进入视图控制器 - MapView 不在屏幕上。如果我以纵向模式进入然后旋转到横向,则顶部边距关闭但大约 10 个点,因此它仍然位于导航栏下方(并且在标签栏和地图视图底部之间有可见边距)。

如何让 MapView 子视图像 ScrollView 一样只显示在可见区域内?如果地图本身位于导航栏/标签栏下方,我并不介意

【问题讨论】:

【参考方案1】:

呃,我在几分钟前找到了答案。我不知道为什么这是 ios 7 上的默认行为,但唉,就是这样。

解决办法是把这个加到ViewController上的viewDidLoad中

[self setEdgesForExtendedLayout:UIRectEdgeNone];
[self setAutomaticallyAdjustsScrollViewInsets:NO];

非常感谢to the post here

【讨论】:

您也应该将此标记为答案。 :) 感谢您的帮助。 感谢您的解决方案。

以上是关于iOS MapView 位于导航栏、状态栏和标签栏控制器下的主要内容,如果未能解决你的问题,请参考以下文章

iOS导航栏和状态栏

iOS:状态栏和导航栏:空格或底层

iOS 获取状态栏、导航栏、tabBar高度

iOS-导航栏、状态栏及Tabbar高度(区分iPhone X与其他iPhone机型)

iOS 11、状态栏、导航栏和 UIScrollview

导航栏位于 iOS 应用程序中的状态栏下方