我(就像其他人一样)遇到了与其他人一样的状态栏重叠问题,稍微扭曲一下,这就是为什么我打开一个关于此问题的新问题。
似乎有一些机制让UISearchBar知道在哪里定位它自己,这是完全的重击。
jaredsinclair在这里回答(iOS 7 status bar back to iOS 6 default style in iPhone app?),详细解释了Apple工程师如何允许我们为我们的应用程序引入逻辑,以便尽可能地融入用户的环境。
我仔细检查了我的应用程序中的每个UIViewController,并进行了最轻微的修改。
在大多数情况下,我能够使用下面的代码解决问题,我在几个SO答案中找到了
// Do any additional setup after loading the view.
if ([self respondsToSelector:@selector(edgesForExtendedLayout)]){
self.edgesForExtendedLayout = UIRectEdgeNone;
}
无论我在隐藏UINavigationBar的特定视图中做什么,这都行不通。
基于在SO上找到的解决方案,我能够通过向这个特定的UIViewController添加以下逻辑来解决这个问题
if ([[[UIDevice currentDevice] systemVersion] floatValue] >= 7.0) {
CGRect statusBarFrame = [[UIApplication sharedApplication] statusBarFrame];
viewFrame.origin.y = viewFrame.origin.y+statusBarFrame.size.height;
}
这会将UIViewController n 像素向下推“取决于”状态栏的高度。
这个效果在这里显示
问题是当我进入搜索字段时,UISearchBar会在顶部添加一个20px的填充,从而抵消整个UI。
这使我得出结论,UISearchBar试图调整自己,巧合的是它调整自己与状态栏高度完全相同的数量。
如果我不破解该位置,一旦我进入搜索字段,此自动调整就会将UISearchBar整齐地排列在状态栏下方。
我希望我详细说明了我的困惑,我想知道是否有人对解决方案有任何想法。
答案 0 :(得分:27)
如果navigationBar可见,请在ViewDidLoad中执行以下操作:
self.edgesForExtendedLayout = UIRectEdgeNone;
如果导航栏被隐藏,请在ViewDidLoad中执行以下操作:
通过移动20pt
来调整所有UIView元素答案 1 :(得分:4)
也讨论这个问题。您需要将它放入ViewControllers viewDidLoad方法。
if (floor(NSFoundationVersionNumber) > NSFoundationVersionNumber_iOS_6_1) {
self.edgesForExtendedLayout = UIRectEdgeNone;
}
这应该解决它。它也在iOS 7 Transition Guide中说明。 https://developer.apple.com/library/ios/documentation/userexperience/conceptual/TransitionGuide/AppearanceCustomization.html#//apple_ref/doc/uid/TP40013174-CH15-SW1
答案 2 :(得分:4)
UISearchBar有你想要的委托方法。只需将它从顶部放置20px。
- (UIBarPosition)positionForBar:(id <UIBarPositioning>)bar
{
return UIBarPositionTopAttached;
}
不幸的是它不能与UISearchDisplayController一起使用。
答案 3 :(得分:2)
我遇到了完全相同的问题,基于像@ Ben和here这样的建议,我最后添加了以下代码,这些代码帮助了我:
- (void) viewDidLayoutSubviews
{
if(floor(NSFoundationVersionNumber) > NSFoundationVersionNumber_iOS_6_1)
{
CGRect viewBounds = self.view.bounds;
CGFloat topBarOffset = self.topLayoutGuide.length;
viewBounds.origin.y = topBarOffset * -1;
self.view.bounds = viewBounds;
self.edgesForExtendedLayout = UIRectEdgeNone;
}
}
或者这个代码也有效
if ([[[UIDevice currentDevice] systemVersion] floatValue] >= 7) {
self.automaticallyAdjustsScrollViewInsets=YES;
self.edgesForExtendedLayout = UIRectEdgeNone;
self.navigationController.view.backgroundColor = [UIColor whiteColor];
self.navigationController.navigationBar.translucent = YES;
}
答案 4 :(得分:2)
如果有人想通过AutoLayout解决此问题,而不是添加约束searchBar.top = self.view.top
,请向topLayoutGuide添加约束,如下所示:
searchBar.top = topLayoutGuide.bottom
答案 5 :(得分:0)
关于搜索栏调整自己的高度,我不是很清楚 - 我的搜索栏不这样做?但
您可以在IB的顶部布局指南中为搜索栏添加约束。这将导致它粘在ios 6和ios 7中状态栏的底部。如果您随后删除了手动调整状态栏高度的代码。那应该照顾它。您可以在此处查看如何执行此操作的示例:https://developer.apple.com/library/ios/qa/qa1797/_index.html