Uitableview iOS 7中嵌入导航栏时出现奇怪的UISearchDisplayController视图偏移行为
我正在构建一个iOS 7-only应用程序。我正在尝试将UISearchDisplayController设置到导航栏中 我的设置如下:在故事板中,我在视图控制器的视图中添加了“搜索栏和搜索显示控制器”,并将其设置为相对于顶部布局指南的(0,0)。我将约束设置为固定到左侧、顶部和右侧。(我玩过约束,我完全删除了它们,这没关系)除此之外,我还有我的表视图。当我将搜索栏添加到情节提要中的视图时,它会自动为searchDisplayController和searchBar委派设置出口。在代码中,我有self.searchDisplayController.displaysSearchBarInNavigationBar=YES代码>我有两个问题: < P > 1)没有任何按钮显示搜索栏(界面生成器>选择搜索栏>选项:没有选择)搜索栏在屏幕中部: 如果单击导航栏,它将开始编辑搜索栏: 还请注意,暗覆盖似乎从导航栏偏移。在我看来,空间与导航栏的高度相同。好像它已经被调低了那么多。另外,当它显示搜索结果时,内容视图的顶部向下移动了相同的量(后面会有更多的图片),这就引出了第二个问题 2) 我把它弄乱了一段时间,决定选中这个选项,让它显示取消按钮。现在,我已将搜索栏正确嵌入导航栏,但覆盖仍向下移动: 同样,当搜索结果表视图出现时,其下移量相同(请注意右侧的滚动条): 更奇怪的是,我在search display controller的tableview层上设置了一个边框,它看起来是正确的:Uitableview iOS 7中嵌入导航栏时出现奇怪的UISearchDisplayController视图偏移行为,uitableview,ios7,interface-builder,uisearchdisplaycontroller,Uitableview,Ios7,Interface Builder,Uisearchdisplaycontroller,我正在构建一个iOS 7-only应用程序。我正在尝试将UISearchDisplayController设置到导航栏中 我的设置如下:在故事板中,我在视图控制器的视图中添加了“搜索栏和搜索显示控制器”,并将其设置为相对于顶部布局指南的(0,0)。我将约束设置为固定到左侧、顶部和右侧。(我玩过约束,我完全删除了它们,这没关系)除此之外,我还有我的表视图。当我将搜索栏添加到情节提要中的视图时,它会自动为searchDisplayController和searchBar委派设置出口。在代码中,我有s
我以前从未使用过UISearchDisplayController,我不熟悉如何设置它,但在功能上它工作得很好。我读过一些其他类似的帖子,但唯一的建议是通过调整帧和设置手动偏移来修改它。我想知道是什么原因造成的,这是一个bug吗?我做错什么了?如果是bug,我可以等待修复。这似乎是一件很基本的事情,一千个人都做了,没有任何问题,所以我觉得我没有正确地设置它。谢谢你的意见。我记得我遇到了与你观察到的完全相同的问题。你可以尝试几种解决方案
- 如果您正在使用故事板 您应该单击为TableView设置的视图控制器或TableView控制器,转到其属性检查器,查看“视图控制器”部分,并将“延伸边”部分设置为位于顶部栏下
- 如果不使用故事板可以使用viewcontrollers edgesForExtendedLayout属性手动设置设置,这应该可以实现。我用的是故事板
UIRectEdgeNone
我相信)在我的故事板,以阻止我的搜索栏抵消自己。谢谢你们 不幸的是,上述解决方案都不适用于我,我使用的是UITableViewController
此链接有助于:
为了方便起见,我将代码放在下面:
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);
}
}
我也有同样的问题。我通过在tableview下添加view对象来解决这个问题
我也有过类似的行为。对我来说,解决方案是在父视图控制器的情节提要设置中取消选中“在顶部栏下延伸边”(我已关闭透明导航栏,不确定这是否会产生任何影响)。如果不使用故事板,则必须设置[UIViewController edgesForExtendedLayout] 从苹果文档: 此属性仅应用于嵌入到容器中的视图控制器,如UINavigationController或UITabBarController。设置为根视图控制器的视图控制器不会对此属性作出反应。默认值为UIRectEdgeAll
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
或者参见我的问题只是调整滚动视图插入。更改为false后我没有问题
谢谢,成功了。我仍然希望我能弄清楚为什么没有取消按钮搜索栏就不能工作,但这很接近。我没有取消按钮,搜索栏就不能工作,当你没有添加取消按钮时到底发生了什么。真奇怪,最后,我将带有searchdisplay controller的搜索栏从viewcontroller的视图中删除,并将其完全置于视图层次结构之外,从而使其正常工作。我以前从来没有这样做过,但它奏效了。这还增加了一种效果,即在表视图中添加某种自动填充,使其位于导航栏下方。否则,我必须自己添加填充(64px)以偏移导航栏。另外,不要忘记查看ExtendedLayoutCludeSopaqueBars是否适用于您的特定情况。如果导航栏设置为不透明,请勾选