有效地将UISearchController与UICollectionView结合使用

使用UITableView可以轻松集成UISearchController,而使用UICollectionView则不容易

问题

苹果公司的iOS类UITableView与UISearchController及其UISearchBar配合得很好,但是,几乎所有开发人员在尝试将搜索栏与UICollectionView对象进行可视化集成时都举手示意。

在开发负责显示大型组织的REST服务的照片缩略图的应用程序时,我发现了这个问题,并且我希望拥有与UITableView相同的布局。 基于StackOverflow和其他发布内容,大多数人要么不理会试图直观地集成类,要么重载了节标题。

解决方案

由于我希望搜索栏以动画方式显示和隐藏,并在UICollectionViewController的上下文中与相关的集合视图保持正确的尺寸,因此这比我期望支持iOS 9的工作量要多得多和10,但我确实为我的需要制定了解决方案。

为了实现这一点,我编写了一个名为DSSSearchController的UISearchController子类,该子类添加了许多用于显示和隐藏搜索栏的方法。 我将其设计为可与任何视图一起使用,但仅使用特定的集合视图对其进行了测试。 在下面,您将找到Objective-C标头和源代码以及Swift中的版本。

如您所见,需要大量代码来确保搜索栏相对于集合视图的大小正确。 在iOS 9和10中,Apple似乎不将AutoLayout与由UICollectionViewController管理的集合视图一起使用,因此这就是为什么使用框架进行大量计算的原因-试图使用AutoLayout被证明是有问题的。 早期,我发现某些动画会产生一些我不喜欢的搜索栏重影或覆盖,因此这就是为什么某些操作按其原样进行排序的原因。

为了使用我的类,我编写了一个名为configureSearchController的方法,该方法在viewDidLoad期间调用以初始化该类并在搜索栏上设置一些选项。 在我的原始代码中,获得searchBar属性后,将其barTintColor更改为深海蓝色,将tintColor更改为白色,并将其搜索字段的tintColor更改为深海蓝色。 另外,我的导航栏的barStyle属性具有UIBarStyleBlack。

当用户点击导航栏中的放大镜图标时,将调用toggleSearchBar:方法。

我发现当我要展示一个视图控制器时,我需要知道我的搜索控制器是否是要展示的控制器,这是在搜索字段具有焦点时发生的。

我确定我的解决方案可以改进,并且可能会在更高版本的iOS中中断,但目前可以使用。 希望iOS 10的后继版本将内置一个解决方案。