UISearchBar 与 iOS 中的状态栏重叠

Posted

技术标签:

【中文标题】UISearchBar 与 iOS 中的状态栏重叠【英文标题】:UISearchBar overlaps status bar in iOS 【发布时间】:2013-09-29 08:00:00 【问题描述】:

我(就像这里的其他人一样)遇到了与其他人一样的状态栏重叠问题,只是有点扭曲,这就是我提出一个新问题的原因。

似乎有某种机制可以让 UISearchBar 知道将它自己定位在哪里,这完全不正常。

jaredsinclair answer here (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 整齐地对齐在状态栏下方。

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

【问题讨论】:

这个问题有运气吗?我有完全相同的问题。我在您的屏幕截图中注意到您正在使用某种滑出式导航。控制器。我也是,也许这是问题的一部分? 你好 @Chilly 很遗憾目前还没有解决方案,但是下周,我们将开始 UI 的另一次迭代,我将更多地研究这个问题,目前我们发布的那个麻烦,我会继续你摆姿势 【参考方案1】:

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

self.edgesForExtendedLayout = UIRectEdgeNone;

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

调整所有 UIView 元素,将它们移动 20pt

【讨论】:

正确。如果你使用Interface builder,你可以使用iOS6/7 deltas:首先,“view as iOS 6.0”,然后设置一个delta为“20”来实现iOS 7中的+20偏移(必须在所有需要bumping的views上设置)下)。 我的搜索栏被隐藏了,我在导航栏中放了一个切换开关。在 iOS 6 中它运行良好,现在它在 iOS 中使用 self.edgesforExtendedLayout 设置运行良好。谢谢! 请帮我看看如何移动所有的 UIView 元素【参考方案2】:

也在这个问题上苦苦挣扎。你需要把它放到你的 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

【讨论】:

谢谢 Ben,如果您阅读了我的问题,我已经尝试过了。即使它有效,它也不能解决 UISearchBar 的自动调整 20px 对不起,我帮不了你。无论如何,在我的应用程序中它起作用了,当我设置 edgesForExtendedLayout 时,搜索字段框架保持不变。没有 20px 偏移。【参考方案3】:

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

- (UIBarPosition)positionForBar:(id <UIBarPositioning>)bar

    return UIBarPositionTopAttached;

很遗憾,它不能与 UISearchDisplayController 一起使用。

【讨论】:

【参考方案4】:

我遇到了完全相同的问题,根据@Ben's 和 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;
    

【讨论】:

我把它放在了我的表格查看器的实现类中,希望有用。【参考方案5】:

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

searchBar.top = topLayoutGuide.bottom

【讨论】:

【参考方案6】:

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

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

【讨论】:

以上是关于UISearchBar 与 iOS 中的状态栏重叠的主要内容,如果未能解决你的问题,请参考以下文章

UISearchBar 与状态栏动画过渡错误 ios7

如何修复 iOS 7 中的状态栏重叠问题

iOS11中没有状态栏的导航栏与安全区域重叠

让导航栏与iOS 7中的状态栏重叠

在 iOS 7 中让导航栏与状态栏重叠

ios 7子视图UINavigationBar与状态栏重叠..任何简单的解决方案..?