【发布时间】:2015-10-08 20:42:20
【问题描述】:
我正在尝试创建与 iOS 8 中的联系人应用类似的体验。其主要组成部分是:
- 将搜索栏固定在导航栏下方
- 在展示时将搜索栏附加到视图顶部(标准功能)。
然而,这说起来容易做起来难。在与tableHeaderView(不允许在表格视图前进行交互,并且与viewDidLayoutSubviews 定位很复杂)斗争一段时间之后,我决定在UIViewController 中嵌入UITableView,所以我可以将UISearchBar 添加为子视图。这工作得很好,并且允许在所有滚动位置与搜索栏进行交互,并且插图不难计算。
但是,当激活时,状态栏下方的搜索栏会被截断。 似乎是一个直截了当的问题——即使我没有经历过 完全相同的实现 em> 在UITableViewController。因此,我尝试确保在每个可能的视图控制器中我的所有属性都设置为对齐。
self.edgesForExtendedLayout = UIRectEdgeNone;
self.extendedLayoutIncludesOpaqueBars = YES;
self.automaticallyAdjustsScrollViewInsets = NO;
我已经尝试了所有可能的组合,包括 viewWillAppear 和 viewDidLoad,以及半透明导航栏和表格视图和搜索栏的不同起始帧。没有运气。因此,我尝试调整框架或约束,可能使用 topLayoutGuide 或仅使用 0。不幸的是,在任何 UISearchControllerDelegate 方法中调整框架实际上并没有调整其呈现的位置,并且在活动动画开始时添加约束立即崩溃(由于当时视图层次结构中不存在 super.top;删除 willPresent 中的约束绝对没有任何作用)。
在挣扎了一段时间后,我尝试将positionForBar 实现为UISearchBar 的代表:
- (UIBarPosition)positionForBar:(id <UIBarPositioning>)bar {
return UIBarPositionTopAttached;
}
这似乎调整了高度,但搜索栏飞离了视图的顶部。激活后,搜索栏似乎直接出现在可见区域的上方 .这甚至比它被夹在UIStatusBar 后面或下面更糟糕。我还尝试在搜索控制器激活时隐藏状态栏,但有条件地实现prefersStatusBarHidden 根本不起作用(在没有UISearchController 活动的情况下返回YES 效果很好,但是当活动时它再次显示状态栏或显示在其下方)。我认为这是因为UISearchController 拒绝遵守任何标准或规则,这一点现在非常清楚。
这几天我一直在尝试解决这个问题,除了完全重新实现 UISearchController 类/动画之外,我想不出解决方案。请帮忙!
【问题讨论】:
标签: ios objective-c uitableview uiviewcontroller uisearchcontroller