我有一个带UISearchBar和UISearchDisplayController的UITableViewController。它存在于UIVavigationController中的UIViewController中的Container视图中。我制作了这张图片来帮助描述结构:
这就是它的真实情况:
当我点按搜索栏时,我必须隐藏导航栏。通常,这会自行发生,但由于我的UITableViewController在Container View中,我必须自己处理这个更改。这就是它的样子,注意状态栏是白色的,因为导航栏是白色的,即使它现在是隐藏的。
一旦我开始输入一些搜索文本,结果就会显示出来。如果我向上滚动这些结果,它们会在搜索栏下方传递,但它们与状态栏重叠,这非常没有吸引力。
如果没有涉及容器视图,那么这一切都按预期工作,并且表内容在状态栏下面传递,但是涉及到ContainerView时,表文本和状态栏会发生碰撞。
如何让状态栏下的文字正常运行?
答案 0 :(得分:35)
我已经搜索了几个小时,我的最终结果是将这一行放在viewDidLoad中:
self.extendedLayoutIncludesOpaqueBars = YES;
问题解决了:))
答案 1 :(得分:5)
尝试设置definesPresentationContext
viewDidLoad
中的TableViewController
夫特
override func viewDidLoad() {
super.viewDidLoad()
definesPresentationContext = true
}
目标-C
- (void)viewDidLoad {
[super viewDidLoad];
self.definesPresentationContext = YES;
}
答案 2 :(得分:4)
这对我有用:
DO:
- (UIBarPosition)positionForBar:(id<UIBarPositioning>)bar {
return UIBarPositionTopAttached;
}
DO NOT:
答案 3 :(得分:3)
我有UISearchBar和UISearchDisplayController。
在viewdidload中:
self.edgesForExtendedLayout = UIRectEdgeNone;
[searchDisplayController.searchBar setBackgroundImage:[self imageWithColor:ETSBaseColor] forBarPosition:0 barMetrics:UIBarMetricsDefault];
从UIColor获取图像的方法:
- (UIImage *)imageWithColor:(UIColor *)color
{
CGRect rect = CGRectMake(0.0f, 0.0f, 1.0f, 1.0f);
UIGraphicsBeginImageContext(rect.size);
CGContextRef context = UIGraphicsGetCurrentContext();
CGContextSetFillColorWithColor(context, [color CGColor]);
CGContextFillRect(context, rect);
UIImage *image = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
return image;
}
答案 4 :(得分:2)
基本上这是由于导航栏的交互性,通常是视图控制器修复重叠,通过更正拥有的视图或子视图的顶部插入(如果它们是(或继承)来自UIScrollView)。您有两个选项,一个是将导航栏的traslucency设置为no,另一个是将edgeForExtendedLayout
设置为none,只留下底部。
- (void)searchDisplayControllerWillBeginSearch:(UISearchDisplayController *)controller {
self.navigationController.navigationBar.translucent = YES;
}
- (void)searchDisplayControllerDidEndSearch:(UISearchDisplayController *)controller {
self.navigationController.navigationBar.translucent = NO;
}
如果您在设置这些属性之前部署较低目标检查,则这些建议仅适用于iOS7
另一种方法,但我没有测试可以读取--topLayoutGuide
长度,并在 - searchDisplayControllerWillBeginSearch
尝试设置相同长度的topInsets。这样你就应该保持半透明度。
答案 5 :(得分:0)
我遇到了同样的问题:
- (void)searchDisplayControllerWillBeginSearch:(UISearchDisplayController *)controller
{
controller.searchBar.searchBarStyle = UISearchBarStyleDefault; // Used to cover UIStatusBar
}
- (void)searchDisplayControllerWillEndSearch:(UISearchDisplayController *)controller
{
controller.searchBar.searchBarStyle = UISearchBarStyleMinimal; // Used not to show top and bottom separator lines
}
答案 6 :(得分:0)
在我的情况下,我不想隐藏UINavigationBar,但我有类似的问题与gapes和其他副作用。其中一个是UIVearchBar之间切换后丢失的UISearchBar,而UISearchDisplayController是可见的(我正在使用SWRevealViewController在UIViewController之间切换)。仅在iPad上出现此问题。结果是UISearchBar突然隐藏在UINavigationBar后面。现在我用UITontainerView中呈现的UITableViewController中的以下代码行解决了所有问题:
- (UINavigationController *)navigationController {
return nil;
}
这些行阻止UISearchDisplayController到达并更改我的UINavigationController。我还将此方法子类化为“MyContainerTableViewController”类,并将此类用于所有嵌入式UITableViewController。
我仍在使用UISearchDisplayController来支持iOS 7。
答案 7 :(得分:0)
以下黑客为我工作:
- (CGFloat)tableView:(UITableView *)tableView heightForHeaderInSection:(NSInteger)section
{
return (self.searchController.isActive && section == 0) ? 22.0f : 0.0f;
}