在iOS中,UISearchBar与状态栏重叠了。

18

我(就像这里的每个人一样)遇到了与所有人都相同的状态栏重叠问题,但有一点不同,这就是为什么我要在这里开一个新问题。

似乎有一些机制可以让UISearchBar知道自己的位置,但是它完全错了。

jaredsinclair在这里的答案(iOS 7状态栏回到iPhone应用程序中的iOS 6默认样式?)详细解释了苹果工程师如何允许我们引入逻辑来尽可能地融入用户的环境。

我通过仔细检查应用程序中的每个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的填充,从而使整个用户界面被偏移。

enter image description here

由此得出结论,UISearchBar试图进行调整,碰巧它调整的量与状态栏的高度相同。

如果我不“黑客”位置,在我进入搜索字段后,该自动调整将使UISearchBar整齐地对齐到状态栏下方。

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


这个问题解决了吗?我也遇到了完全相同的问题。我注意到你在截图中使用了某种滑动导航控制器,我也是,也许这就是问题的一部分? - Chilly
你好 @Chilly,很抱歉目前还没有解决方案。但是下周我们将开始另一轮UI迭代,并且我会更深入地研究这个问题。目前为止,我们已经发布了带有这个问题的版本,我会继续通知你最新情况。 - Fotis Paraskevopoulos
6个回答

27

如果navigationBar可见,在ViewDidLoad中执行以下操作:

self.edgesForExtendedLayout = UIRectEdgeNone;

如果navigationBar被隐藏,在ViewDidLoad中执行以下操作:

通过将所有的UIView元素向上偏移20pt来进行调整


非常好。如果您使用界面生成器,可以使用iOS6/7增量:首先,“视图为iOS 6.0”,然后设置“20”的增量以在iOS 7中实现+20的偏移(必须在所有需要下移的视图上设置)。 - William Denniss
我的搜索栏被隐藏了,我在导航栏中放置了一个切换按钮。在iOS 6中它运行良好,现在通过self.edgesforExtendedLayout设置在iOS中也可以正常工作。谢谢! - Ismael
请帮我解决如何移动所有的 UIView 元素。 - Anees

4

UISearchBar有一个代理方法可以满足您的需求。只需将其距离顶部20像素即可。

- (UIBarPosition)positionForBar:(id <UIBarPositioning>)bar
{
    return UIBarPositionTopAttached;
}

很遗憾,它无法与UISearchDisplayController一起使用。


4

谢谢Ben,如果你看到了我的问题,我已经尝试过了。即使它可以工作,也无法解决UISearchBar自动调整20像素的问题。 - Fotis Paraskevopoulos
很抱歉我无法帮助你。不过在我的应用程序中,当我设置了edgesForExtendedLayout时,搜索框的框架保持不变,就像它没有被激活一样。没有20像素的偏移量。 - Ben Lime

2
如果有人想通过AutoLayout解决这个问题,而不是添加一个约束searchBar.top = self.view.top,可以添加一个到topLayoutGuide的约束,如下所示:
searchBar.top = topLayoutGuide.bottom

2

我也遇到了同样的问题,根据像@Ben和这里的建议,最终我添加了以下代码,帮助我解决了问题:

- (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;
    }

我将它放在表格视图实现类中,希望这对你有用。 - malkoty

0

我对搜索栏自动调整高度的部分不是很清楚 - 我的搜索栏没有这样做?但是。

您可以在IB中为搜索栏添加一个与顶部布局指南相关的约束。这将导致它在iOS 6和iOS 7中都粘附在状态栏底部。然后,您可以删除手动调整状态栏高度的代码。那应该就没问题了。您可以在此处查看如何执行此操作的示例:https://developer.apple.com/library/ios/qa/qa1797/_index.html


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接