18

我(就像这里的其他人一样)遇到了和其他人一样的状态栏重叠问题,有点扭曲,这就是为什么我提出一个关于这个的新问题。

似乎有一些机制可以让 UISearchBar 知道将它自己定位在哪里,这完全不合时宜。

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

我仔细检查了我的应用程序中的每个 UIViewController 并进行了最轻微的修改。

在大多数情况下,我能够使用下面的代码解决问题,我在几个 SO 答案中找到了这些代码

// Do any additional setup after loading the view.
if ([self respondsToSelector:@selector(edgesForExtendedLayout)]){
    self.edgesForExtendedLayout = UIRectEdgeNone;
}

然而,无论我在 UINavigationBar 隐藏的特定视图中做什么,这都不起作用。

状态栏顶部的 UISearchBar

基于在 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

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

在此处输入图像描述

这使我得出这样的结论,即 UISearchBar 会尝试自行调整,巧合的是,它会自行调整与状态栏高度完全相同的量。

如果我不修改位置,一旦我进入搜索字段,这个自动调整就会将 UISearchBar 整齐地对齐在状态栏下方。

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

4

6 回答 6

27

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

self.edgesForExtendedLayout = UIRectEdgeNone;

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

通过将所有 UIView 元素移动 20pt 来调整它们

于 2013-10-04T09:33:18.553 回答
4

UISearchBar 有一个你想要的委托方法。只需将其放置在距顶部 20px 处。

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

不幸的是,它不能与 UISearchDisplayController 一起使用。

于 2013-09-27T10:39:32.993 回答
4

也在为这个问题苦苦挣扎。您需要将其放入您的 ViewControllers viewDidLoad 方法中。

if (floor(NSFoundationVersionNumber) > NSFoundationVersionNumber_iOS_6_1) {
    self.edgesForExtendedLayout = UIRectEdgeNone;
}

这应该解决它。iOS 7 过渡指南中也有说明。 https://developer.apple.com/library/ios/documentation/userexperience/conceptual/TransitionGuide/AppearanceCustomization.html#//apple_ref/doc/uid/TP40013174-CH15-SW1

于 2013-09-24T12:39:32.223 回答
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;
    }
于 2014-01-23T13:07:47.813 回答
2

如果有人想通过 AutoLayout 解决这个问题,而不是添加约束,而是向 topLayoutGuidesearchBar.top = self.view.top添加一个约束,如下所示:

searchBar.top = topLayoutGuide.bottom
于 2015-05-25T07:41:12.487 回答
0

我不太清楚搜索栏调整自己的高度 - 我的搜索栏不这样做吗?但。

您可以为搜索栏添加约束到 IB 中的顶部布局指南。这将导致它在 ios 6 和 ios 7 中都粘在状态栏的底部。如果您随后删除手动调整状态栏高度的代码。那应该照顾它。您可以在此处查看如何执行此操作的示例:https ://developer.apple.com/library/ios/qa/qa1797/_index.html

于 2013-09-25T14:56:31.557 回答