我正在构建一个仅限iOS 7的应用程序。我正在尝试将UISearchDisplayController设置到导航栏中。
我设置如下:在故事板中,我在视图控制器的视图中添加了“搜索栏和搜索显示控制器”,并将其设置为(0,0)相对于顶部布局指南。我设置约束来固定左,上,右。 (我玩限制,我完全删除它们,没关系)最重要的是我有我的表视图。当我将搜索栏添加到故事板中的视图时,它会自动为searchDisplayController和searchBar委托设置插座。在代码中我有self.searchDisplayController.displaysSearchBarInNavigationBar = YES;
我有两个问题:
1)没有为搜索栏显示任何按钮(界面构建器 - >选择搜索栏 - >选项:未选中),搜索栏位于屏幕中间:
如果我点击导航栏,它会开始编辑搜索栏:
另请注意,暗覆盖图似乎偏离导航栏。在我看来,空间与导航栏的高度相同。就像它已经被那么多下降了。此外,当它显示搜索结果时,内容视图的顶部向下移动相同的数量(更多图片跟随),这带来了第二个问题。
2)我搞砸了一会儿,决定检查选项让它显示取消按钮。现在我正确地在导航栏中嵌入了搜索栏,但叠加层仍然向下移动:
同样,当搜索结果表视图出现时,它会向下移动相同的数量(注意右侧的滚动条):
更奇怪的是,我在搜索显示控制器的tableview图层上设置了一个边框,看起来是正确的:
我以前从未使用过UISearchDisplayController而且我不熟悉如何设置它,但功能上它运行正常。我已经阅读了一些其他类似的帖子,但唯一的建议是通过调整帧和设置手动偏移来破解它。我更想知道造成这种情况的原因,这是一个错误吗?我做错了什么?如果这是一个错误,我可以等待修复。这似乎是一个基本的事情,千人一定没有任何问题,所以我觉得我不是以某种方式正确设置它。谢谢你输入。
答案 0 :(得分:28)
我记得遇到了你正在观察的同样问题。你可以尝试一些解决方案。
如果您使用的是故事板 您应该单击为tableview设置的视图控制器或TableView控制器,然后转到其属性检查器并查看ViewController部分,并将Extend Edges部分设置为Top Bars。
如果您不使用故事板,您可以使用viewcontrollers edgesForExtendedLayout属性手动设置设置,这应该可以解决问题。我在使用故事板。
答案 1 :(得分:16)
在我的情况下,使用故事板,我必须同时检查在顶部栏下和在不透明栏下并且不选中底部栏。
答案 2 :(得分:3)
在我的情况下,我实际上必须取消选中所有扩展边框(基本上与我在故事板中以编程方式将扩展边设置为UIRectEdgeNone
相同)以阻止我的搜索栏自行抵消。谢谢你们!
答案 3 :(得分:2)
definesPresentationContext = true
override func viewDidLoad() {
super.viewDidLoad()
searchController = UISearchController(searchResultsController: nil)
searchController.searchResultsUpdater = self
searchController.hidesNavigationBarDuringPresentation = false
searchController.dimsBackgroundDuringPresentation = true
searchController.searchBar.searchBarStyle = UISearchBarStyle.Prominent
self.tableView.tableHeaderView = searchController.searchBar
definesPresentationContext = true
或查看UISearchBar presented by UISearchController in table header view animates too far when active
答案 4 :(得分:1)
我遇到了同样的问题。我通过在tableview下添加视图对象解决了这个问题。
答案 5 :(得分:1)
我的行为非常相似。对我来说,解决方案是在父视图控制器的故事板设置中取消选中“在顶栏下扩展边缘”(我已关闭透明导航栏,不确定是否会影响任何内容)。如果你没有使用storyboard,你必须设置[UIViewController edgesForExtendedLayout]。
来自Apple文档:
此属性仅适用于嵌入容器的视图控制器,例如UINavigationController或UITabBarController。设置为根视图控制器的视图控制器不响应此属性。默认值为UIRectEdgeAll。
答案 6 :(得分:1)
我的问题只是调整滚动视图插入。更改为 false 后,我没有遇到问题
答案 7 :(得分:0)
不幸的是,上述解决方案都不适用于我,我使用UITableViewController
。
此链接有助于:
http://petersteinberger.com/blog/2013/fixing-uisearchdisplaycontroller-on-ios-7/
为方便起见,我在下面输入了代码:
static UIView *PSPDFViewWithSuffix(UIView *view, NSString *classNameSuffix) {
if (!view || classNameSuffix.length == 0) return nil;
UIView *theView = nil;
for (__unsafe_unretained UIView *subview in view.subviews) {
if ([NSStringFromClass(subview.class) hasSuffix:classNameSuffix]) {
return subview;
}else {
if ((theView = PSPDFViewWithSuffix(subview, classNameSuffix))) break;
}
}
return theView;
}
- (void)correctSearchDisplayFrames {
// Update search bar frame.
CGRect superviewFrame = self.searchDisplayController.searchBar.superview.frame;
superviewFrame.origin.y = 0.f;
self.searchDisplayController.searchBar.superview.frame = superviewFrame;
// Strech dimming view.
UIView *dimmingView = PSPDFViewWithSuffix(self.view, @"DimmingView");
if (dimmingView) {
CGRect dimmingFrame = dimmingView.superview.frame;
dimmingFrame.origin.y = self.searchDisplayController.searchBar.frame.size.height;
dimmingFrame.size.height = self.view.frame.size.height - dimmingFrame.origin.y;
dimmingView.superview.frame = dimmingFrame;
}
}
- (void)setAllViewsExceptSearchHidden:(BOOL)hidden animated:(BOOL)animated {
[UIView animateWithDuration:animated ? 0.25f : 0.f animations:^{
for (UIView *view in self.tableView.subviews) {
if (view != self.searchDisplayController.searchResultsTableView &&
view != self.searchDisplayController.searchBar) {
view.alpha = hidden ? 0.f : 1.f;
}
}
}];
}
// This fixes UISearchBarController on iOS 7. rdar://14800556
- (void)correctFramesForSearchDisplayControllerBeginSearch:(BOOL)beginSearch {
if (PSPDFIsUIKitFlatMode()) {
[self.navigationController setNavigationBarHidden:beginSearch animated:YES];
dispatch_async(dispatch_get_main_queue(), ^{
[self correctSearchDisplayFrames];
});
[self setAllViewsExceptSearchHidden:beginSearch animated:YES];
[UIView animateWithDuration:0.25f animations:^{
self.searchDisplayController.searchResultsTableView.alpha = beginSearch ? 1.f : 0.f;
}];
}
}
- (void)searchDisplayControllerWillBeginSearch:(UISearchDisplayController *)controller {
[self correctFramesForSearchDisplayControllerBeginSearch:YES];
}
- (void)searchDisplayControllerDidBeginSearch:(UISearchDisplayController *)controller {
[self correctSearchDisplayFrames];
}
- (void)searchDisplayControllerWillEndSearch:(UISearchDisplayController *)controller {
[self correctFramesForSearchDisplayControllerBeginSearch:NO];
}
- (void)searchDisplayController:(UISearchDisplayController *)controller didShowSearchResultsTableView:(UITableView *)tableView {
// HACK: iOS 7 requires a cruel workaround to show the search table view.
if (PSPDFIsUIKitFlatMode()) {
controller.searchResultsTableView.contentInset = UIEdgeInsetsMake(self.searchDisplayController.searchBar.frame.size.height, 0.f, 0.f, 0.f);
}
}
答案 8 :(得分:0)