在 iOS 7 中添加 MKMapView 会导致状态栏问题
Posted
技术标签:
【中文标题】在 iOS 7 中添加 MKMapView 会导致状态栏问题【英文标题】:Adding MKMapView Causes Status Bar Issue in iOS 7 【发布时间】:2014-03-03 08:49:01 【问题描述】:我正在使用
解决 ios 7 中的状态栏问题if(st.version == 7)
CGRect screen = [[UIScreen mainScreen] bounds];
CGRect frame = self.navigationController.view.frame;
frame.origin.y = 20;
frame.size.height = screen.size.height - 20;
self.navigationController.view.frame = frame;
因为我使用导航控制器并使用[self.navigationController pushViewController:newone animated:YES];
从一个推到另一个。它在所有视图控制器中都能正常工作。但是,如果viewcontroller在xib中有mkmapview,就会出现ios 7的状态栏问题。
如果我删除 mapview 表单 xib 并推送到该视图控制器意味着,它会像,
如果我通过下面的代码添加地图视图,
mapView = [[MKMapView alloc] initWithFrame:CGRectMake(0, 100, 320, 100)];
[self.view addSubview:self.mapView];
看起来,
如何解决?
【问题讨论】:
我无法在我的 macine 中重现此问题,您能否在 github 中提供一些示例项目。我将帮助您轻松解决问题。 你试过了吗,mapview的clipsToBounds 哪个设备是 3.5 和 4 英寸或两者都有 但是你的图片是用 ios 6 后退按钮样式表示的原因 我只是在 xib 中取消选中useAutolayout
并将 Autoresizing
用于地图,但没有遇到此问题。我已经通过Autoresizing
从顶部和左侧修复了我的地图。
【参考方案1】:
if(st.version == 7)
mapView = [[MKMapView alloc] initWithFrame:CGRectMake(0, 120, 320, 100)];
else
mapView = [[MKMapView alloc] initWithFrame:CGRectMake(0, 100, 320, 100)];
【讨论】:
这个答案是错误的,问题与mapview的框架无关。【参考方案2】:如果您在 viewWillAppear
中添加 mapView,请在 viewDidAppear
中替换它。
也许您遇到这个问题是因为您在视图完全设置之前对视图的框架进行了操作
【讨论】:
【参考方案3】:我强烈建议不要这样做。
如果您使用的是界面生成器,请根据您希望应用程序的外观添加约束,框架会自动调整。
如果你不使用界面生成器,那么仍然使用约束,但获得一个关于以编程方式制作约束的好教程(因为我自己不知道如何去做)。
编辑:我强烈建议不要使用硬编码数字的原因是,使用 iOS 6/7 Landscape/Portrait 3.5/4 英寸屏幕会很痛苦。那是 8 例。
【讨论】:
App只有一个方向,也支持ios 5,我们不能使用自动布局。 Zsolt,您介意将此迁移到评论中吗?我同意 Daij-Djan 的观点,这不是一个答案。【参考方案4】:我认为你有一些调整你的导航 Y 位置设置 -20px。这样它就会覆盖。使用此代码您的 ViewController
CGRect screen = [[UIScreen mainScreen] bounds];
CGRect frame = self.navigationController.view.frame;
frame.origin.y =0;
frame.size.height = screen.size.height;
self.navigationController.view.frame = frame;
或者你可能在项目中的某个地方使用了 wantFullScreenLayout
setWantsFullScreenLayout = YES:
statusbar部分定位到(0,0)点捕捉。 Statusbar 的大小与当前视图的大小一样,增加 mainScreen 的值来改变大小的界限。 状态栏样式改成半透明样式。
这个下面的链接你可以清楚地了解你的问题
How do I get the navigation bar in a UINavigationController to update its position when the status bar is hidden?
【讨论】:
wantsFullScreenLayout 在 iOS 7 中已弃用 查看问题图片iOS6中的问题。观看导航返回按钮,您了解问题引发的版本。 @安迪 不是,我相信问题图片是在iOS 7中捕获的。导航栏中的后退按钮在iOS 7中可以自定义为iOS 6样式。但状态栏无法自定义为iOS 6 中的 iOS 7 风格。 请看标签栏,它看起来像 ios6 @lancy 如果他在 ios 6 中使用黑色半透明,就像上面的图片@lancy【参考方案5】:覆盖视图控制器中的-edgesForExtendedLayout
方法
-(UIRectEdge)edgesForExtendedLayout
return UIRectEdgeNone;
【讨论】:
【参考方案6】:如果您想从特定视图中隐藏状态栏,请在该特定 view.m
文件中添加此方法
- (BOOL)prefersStatusBarHidden
return YES;
【讨论】:
他没有,地图视图搞砸了操作【参考方案7】:在视图控制器的 viewDidLoad 或 IB 中设置 self.automaticallyAdjustsScrollViewInsets = NO;
怎么样?
【讨论】:
查看问题图片iOS6中的问题。观看导航返回按钮您了解问题引发的版本。 @iDev 根据作者指定的图像和标签,它是 iOS 7。后退按钮也不是来自 iOS 6,因为它是自定义的。另一方面,此类问题基本上不会发生在 iOS 6 上,因为它不支持扩展边缘。【参考方案8】:-
尝试自动设置 MapView(ScrollView)AdjustsScrollViewInsets = NO;
尝试将edgesForExtendedLayout设置为UIRectEdgeNone;
尝试使用 UIViewController.topLayoutGuide,查看苹果关于此问题的问答:Preventing the Status Bar from Covering Your Views。
尝试使用bar位置委托,见UIBarPositioningDelegate Protocol Reference
根据您的描述和屏幕截图,您正在尝试将整个 UINavigationController.view.frame 移动 20 pt,并且 MapView(ScrollView) 做了一些事情来防止它发生(或重新设置),放置一些断点并登录到跟踪 UINavigationController.view.frame 的框架发生了变化。
能否提供一个示例项目?我很好奇到底发生了什么。
【讨论】:
【参考方案9】:试试这个
- (void)viewWillAppear:(BOOL)animated
self.navigationController.navigationBar.translucent = NO;
- (void)viewDidAppear:(BOOL)animated
self.navigationController.navigationBar.translucent = YES;
【讨论】:
我希望添加地图视图后视图看起来像this。这个答案不能解决问题【参考方案10】:- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
[application setStatusBarHidden:YES];
return YES;
请将此行添加到您的代码中。这将在您的应用中隐藏状态栏。
【讨论】:
他并没有试图隐藏栏。地图视图搞砸了他的布局【参考方案11】:如果您有 xib。您是否尝试在模拟指标中启用顶栏?
【讨论】:
不会真正影响输出。尤其是在以编程方式添加地图视图时以上是关于在 iOS 7 中添加 MKMapView 会导致状态栏问题的主要内容,如果未能解决你的问题,请参考以下文章
MKMapView 平移导致父 UIScrollView 滚动