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 中的状态栏重叠的主要内容,如果未能解决你的问题,请参考以下文章