UISearchBar重叠iOS中的状态栏

时间:2013-09-24 07:54:47

标签: uisearchbar ios7 overlap uistatusbar

我(就像其他人一样)遇到了与其他人一样的状态栏重叠问题,稍微扭曲一下,这就是为什么我打开一个关于此问题的新问题。

似乎有一些机制让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的特定视图中做什么,这都行不通。

UISearchBar on top of status bar

基于在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 像素向下推“取决于”状态栏的高度。

这个效果在这里显示

Hacked position UISearchBar

问题是当我进入搜索字段时,UISearchBar会在顶部添加一个20px的填充,从而抵消整个UI。

enter image description here

这使我得出结论,UISearchBar试图调整自己,巧合的是它调整自己与状态栏高度完全相同的数量。

如果我不破解该位置,一旦我进入搜索字段,此自动调整就会将UISearchBar整齐地排列在状态栏下方。

我希望我详细说明了我的困惑,我想知道是否有人对解决方案有任何想法。

6 个答案:

答案 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