嵌入导航栏时,iOS 7中的奇怪UISearchDisplayController视图偏移行为

时间:2013-12-22 16:13:17

标签: uitableview ios7 interface-builder uisearchdisplaycontroller

我正在构建一个仅限iOS 7的应用程序。我正在尝试将UISearchDisplayController设置到导航栏中。

我设置如下:在故事板中,我在视图控制器的视图中添加了“搜索栏和搜索显示控制器”,并将其设置为(0,0)相对于顶部布局指南。我设置约束来固定左,上,右。 (我玩限制,我完全删除它们,没关系)最重要的是我有我的表视图。当我将搜索栏添加到故事板中的视图时,它会自动为searchDisplayController和searchBar委托设置插座。在代码中我有self.searchDisplayController.displaysSearchBarInNavigationBar = YES;我有两个问题:

1)没有为搜索栏显示任何按钮(界面构建器 - >选择搜索栏 - >选项:未选中),搜索栏位于屏幕中间:

enter image description here

如果我点击导航栏,它会开始编辑搜索栏:

enter image description here

另请注意,暗覆盖图似乎偏离导航栏。在我看来,空间与导航栏的高度相同。就像它已经被那么多下降了。此外,当它显示搜索结果时,内容视图的顶部向下移动相同的数量(更多图片跟随),这带来了第二个问题。

2)我搞砸了一会儿,决定检查选项让它显示取消按钮。现在我正确地在导航栏中嵌入了搜索栏,但叠加层仍然向下移动:

enter image description here

同样,当搜索结果表视图出现时,它会向下移动相同的数量(注意右侧的滚动条):

enter image description here

更奇怪的是,我在搜索显示控制器的tableview图层上设置了一个边框,看起来是正确的:

enter image description here

我以前从未使用过UISearchDisplayController而且我不熟悉如何设置它,但功能上它运行正常。我已经阅读了一些其他类似的帖子,但唯一的建议是通过调整帧和设置手动偏移来破解它。我更想知道造成这种情况的原因,这是一个错误吗?我做错了什么?如果这是一个错误,我可以等待修复。这似乎是一个基本的事情,千人一定没有任何问题,所以我觉得我不是以某种方式正确设置它。谢谢你输入。

9 个答案:

答案 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下添加视图对象解决了这个问题。

  1. 在故事板上添加新的ViewController
  2. 将TableView拖到新VC
  3. 将表格单元格拖到TableView
  4. 为TableView DataSource建立连接,将TableView委托给新VC

答案 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)

  1. 转到故事板。
  2. 单击视图控制器。
  3. 转到ViewController部分下的属性检查器。
  4. 将“延伸边缘”部分设置为“顶部条形图”和“不透明条形条形图”。
  5. 请务必取消选中Under Bottom Bars。