12

我已经实现了 UISearchController 并且它工作得很好,除了......

当我单击搜索栏时,导航栏按预期消失。当我将手机旋转到横向视图时,我得到了这个有意义的视图。

在此处输入图像描述

但是,当我将手机旋转回纵向视图(仍在搜索类型区域中选择)时,我得到以下视图。

在此处输入图像描述

您可以看到导航栏永远不会再次出现。我觉得我正在实现一个基本的搜索控制器。这可能是什么原因造成的?

self.venueSearchController = [[UISearchController alloc] initWithSearchResultsController:nil];
self.venueSearchController.searchResultsUpdater = self;
self.venueSearchController.searchBar.delegate = self;
self.venueSearchController.dimsBackgroundDuringPresentation = NO;
self.venueSearchController.hidesNavigationBarDuringPresentation = YES;
self.venueSearchController.searchBar.frame = CGRectMake(self.venueSearchController.searchBar.frame.origin.x, self.venueSearchController.searchBar.frame.origin.y, self.venueSearchController.searchBar.frame.size.width, 44.0);

self.definesPresentationContext = YES;

self.navigationController.navigationBar.translucent = YES;
self.venueSearchController.searchBar.translucent = YES;

self.tableView.tableHeaderView = self.venueSearchController.searchBar;
4

5 回答 5

15

当状态栏重新出现时,它看起来像UISearchController忘记重置框架。searchBar我认为这可能是一个错误UISearchController雷达中似乎列出了一些。似乎 searchBar 的超级视图(在 UISearchController 内部)以错误的高度结束。这很令人烦恼,因为解决方案因此涉及进入 searchController 的视图层次结构,Apple 可以更改它......您可能想要添加对 iOS 版本的检查,以便它仅针对指定版本运行。

如果您将以下代码添加到您的视图控制器,它将在特征集合更改时被调用。它检查 a) 搜索控制器是否处于活动状态,b) 状态栏未隐藏,以及 c) searchBar origin-y 为 0,如果是这样,它会将超级视图的高度增加状态栏的高度,它移动searchBar 向下。

override func traitCollectionDidChange(previousTraitCollection: UITraitCollection?) {
    let app = UIApplication.sharedApplication()
    if searchController!.active && !app.statusBarHidden && searchController?.searchBar.frame.origin.y == 0 {
        if let container = self.searchController?.searchBar.superview {
            container.frame = CGRectMake(container.frame.origin.x, container.frame.origin.y, container.frame.size.width, container.frame.size.height + app.statusBarFrame.height)
        }
    }
}

目标 C

- (void) traitCollectionDidChange: (UITraitCollection *) previousTraitCollection {

    [super traitCollectionDidChange: previousTraitCollection];

    if(self.venueSearchController.active && ![UIApplication sharedApplication].statusBarHidden && self.venueSearchController.searchBar.frame.origin.y == 0)
    {
        UIView *container = self.venueSearchController.searchBar.superview;

        container.frame = CGRectMake(container.frame.origin.x, container.frame.origin.y, container.frame.size.width, container.frame.size.height + [UIApplication sharedApplication].statusBarFrame.size.height);
    }
}
于 2015-02-25T15:04:23.137 回答
10

您可能需要UIBarPositioningDelegate在您的视图控制器中实现。

self.venueSearchController.searchBar.delegate = self;

searchBar 正在寻找其代表的响应。

@protocol UISearchBarDelegate <UIBarPositioningDelegate> 

将以下内容添加到您的self(我假设它是 ViewController)

#pragma mark - <UIBarPositioningDelegate>

// Make sure NavigationBar is properly top-aligned to Status bar
- (UIBarPosition)positionForBar:(id<UIBarPositioning>)bar
{
    if (bar == self.venueSearchController.searchBar) {
        return UIBarPositionTopAttached;
    }
    else { // Handle other cases
        return UIBarPositionAny;
    }
}
于 2015-02-24T14:29:30.403 回答
1

我相信这可能是 UITableViewController 布局处理导航栏的方式的问题,而不是在您旋转的情况下出现导航栏时没有导航栏。

我认为您可以通过将 UITableViewController 替换为您将 UITableView 放入其中的 UIViewController 来解决此问题。然后将表格视图的顶部约束设置为顶部布局指南。将边约束设置为 0 的左、右、下。

这应该确保表格始终位于状态栏下方,并且在导航栏移动和返回时仍能正确移动。

请参阅此讨论:iOS 7:UITableView 显示在状态栏下

于 2015-02-23T22:32:35.877 回答
0

我在UISearchController使用它时遇到了类似的问题navigationItem。它看起来不同,但由相同的问题引起:状态栏重新出现时UISearchController不更新框架。searchBar

但是,与其手动调整视图层次结构的框架,不如简单地通过在或旋转期间searchBar来回切换来强制它更新布局:hidesNavigationBarDuringPresentationtraitCollectionDidChangeviewWillTransition(to size: CGSize, with cooridnator: UIViewControllerTransitionCoordinator)

所以修复看起来像这样:

 override func traitCollectionDidChange(_ previousTraitCollection: UITraitCollection?) {
    super.traitCollectionDidChange(previousTraitCollection)
    if #available(iOS 11, *) {
        navigationItem.hidesSearchBarWhenScrolling.toggle()
        navigationItem.hidesSearchBarWhenScrolling.toggle()
    }
}

这是原始问题的样子。

在没有状态栏的横向搜索

然后旋转并得到这个:

状态栏重新出现后纵向搜索

于 2019-08-20T09:40:37.107 回答
-6

我通过关闭设置中的“隐藏状态栏”暂时“修复”了这个问题。

在此处输入图像描述

于 2015-02-24T14:21:09.580 回答