我试图创建类似于iOS 8中的联系人应用程序的体验。其主要组件包括:
- 使搜索栏固定在导航栏下方
- 在展示时,将搜索栏附加到视图顶部(标准功能)。
然而,这比说起来容易得多。经过一段时间与tableHeaderView(不允许在表视图前进行交互,并且使用viewDidLayoutSubviews定位复杂)的斗争后,我决定在UIViewController中嵌入UITableView,以便可以将UISearchBar添加为子视图。这个方法效果还不错,可以在所有滚动位置与搜索栏进行交互,并且插图并不难计算。
但是,当激活时,搜索栏会被状态栏下面裁剪。这似乎是一个简单的问题,即使我在UITableViewController中的完全相同的实现中也没有遇到过这个问题。因此,我尝试确保在每个可能的视图控制器中设置了所有属性以进行对齐。
self.edgesForExtendedLayout = UIRectEdgeNone;
self.extendedLayoutIncludesOpaqueBars = YES;
self.automaticallyAdjustsScrollViewInsets = NO;
我已经尝试了所有可能的组合,包括在viewWillAppear和viewDidLoad中使用半透明导航栏、调整表格视图和搜索框的起始位置。但是没有成功。所以,我尝试调整框架或约束,也许使用topLayoutGuide或者只是0。然而,在任何一个UISearchControllerDelegate方法中调整框架实际上都没有调整其呈现的位置,而在活动动画开始时添加约束会立即崩溃(由于此时超级顶部在视图层次结构中不存在;在willPresent中删除约束完全没有效果)。
在挣扎了一段时间后,我尝试将positionForBar作为UISearchBar的委托实现:
- (UIBarPosition)positionForBar:(id <UIBarPositioning>)bar {
return UIBarPositionTopAttached;
}
这似乎调整了高度,但搜索栏飞到了视图的顶部。当激活时,搜索栏似乎直接出现在可见区域的上方。这甚至比它被裁剪在UIStatusBar
后面或下面更糟糕。我还尝试在搜索控制器变为活动状态时只隐藏状态栏,但是条件实现prefersStatusBarHidden
根本不起作用(在没有UISearchController
活动时返回YES
非常好,但当活动时它会再次显示状态栏,或者显示在其下面)。我认为这是因为UISearchController
拒绝遵守任何标准或规则,现在这一点已经非常明显了。
我已经尝试了几天来解决这个问题,除了重新实现UISearchController
类/动画之外,我想不到其他的解决办法。请帮忙!
tableHeaderView
,那可能有意义,但那个解决方案也不完美(触摸会穿过)。如果你也许是指搜索结果表视图的y-平移,那似乎也太晚了:最终,我需要在任何滚动之前进行框架调整(在任何搜索之前它都会变暗,直到搜索完成(标准的UISearchController
),并且没有didScroll发生)。 - insanj