我在XCode 5.0中有一个iOS 7应用程序,当点击搜索栏(UISearchBar
)时会出现一些奇怪的行为。
我的应用程序有一个导航控制器和一个标签栏控制器。以下是我的Main.Storyboard的示例:
[Navigation Controller] -> [Tab Bar Controller] -> [Tab Item #1]
|
-------------> [Tab Item #2]
Each [] is a view controller
当我启动我的应用程序时,我会看到Tab Item 1
与UISearchBar
,如下面的屏幕截图所示:
当我点按UISearchBar
时,搜索栏会向上滑动到屏幕顶部,但导航栏不会隐藏,并且视图不会“向上滑动”。这会导致应用看起来像这样:
当我从故事板中删除Tab Bar Controller
并将Navigation Controller
直接连接到Tab Item #1
时,导航栏会按预期隐藏。
点击搜索栏时如何隐藏导航栏?有关我希望重现的功能的示例,请单击默认iOS7“电话”应用程序的“联系人”选项卡下的搜索栏。
答案 0 :(得分:4)
您可以使用UISearchBar委托方法来决定何时将导航栏移出屏幕。
-(void)searchBarTextDidBeginEditing:(UISearchBar *)searchBar{
[UIView animateWithDuration:0.2 animations:^{
CGRect statusBarFrame = [[UIApplication sharedApplication] statusBarFrame];
double yDiff = self.navigationController.navigationBar.frame.origin.y - self.navigationController.navigationBar.frame.size.height - statusBarFrame.size.height;
self.navigationController.navigationBar.frame = CGRectMake(0, yDiff, 320, self.navigationController.navigationBar.frame.size.height);
}];
}
-(void)searchBarTextDidEndEditing:(UISearchBar *)searchBar{
[UIView animateWithDuration:0.2 animations:^{
CGRect statusBarFrame = [[UIApplication sharedApplication] statusBarFrame];
double yDiff = self.navigationController.navigationBar.frame.origin.y + self.navigationController.navigationBar.frame.size.height + statusBarFrame.size.height;
self.navigationController.navigationBar.frame = CGRectMake(0, yDiff, 320, self.navigationController.navigationBar.frame.size.height);
}];
}
答案 1 :(得分:4)
对于 swift 开发者:
func searchBarTextDidBeginEditing(_ searchBar: UISearchBar) {
navigationController?.setNavigationBarHidden(true, animated: true)
}
func searchBarTextDidEndEditing(_ searchBar: UISearchBar) {
navigationController?.setNavigationBarHidden(false, animated: true)
}
这将在搜索栏处于活动状态时隐藏导航栏,并在搜索栏处于非活动状态时再次显示。
答案 2 :(得分:2)
您可以将导航控制器中的顶部栏设置为无,然后将其添加到tabBarController代码中:
self.navigationController.navigationBar.translucent= NO;
在viewDidLoad方法
中答案 3 :(得分:1)
您可以使用UISearchDisplayController方法执行此操作;
-(void)searchDisplayControllerWillBeginSearch:(mySearchDisplayController *)controller
{
self.searchResultsDataSource = self;
self.searchResultsTableView.delegate = self;
if (floor(NSFoundationVersionNumber) > NSFoundationVersionNumber_iOS_6_1)
{
CGRect statusBarFrame = [[UIApplication sharedApplication] statusBarFrame];
[UIView animateWithDuration:0.01 animations:^{
for (UIView *subview in self.searchBar.subviews)
subview.transform = CGAffineTransformMakeTranslation(0, statusBarFrame.size.height);
}];
}
}
-(void)searchDisplayControllerWillEndSearch:(mySearchDisplayController *)controller
{
if (floor(NSFoundationVersionNumber) > NSFoundationVersionNumber_iOS_6_1)
{
[UIView animateWithDuration:0.01 animations:^{
for (UIView *subview in self.searchBar.subviews)
subview.transform = CGAffineTransformIdentity;
}];
}
}
不要忘记创建一个新类作为UISearchDisplayController的类型并在其中实现该代码。
答案 4 :(得分:0)
以下行将在激活搜索栏时动态隐藏导航栏。
self.searchController.hidesNavigationBarDuringPresentation = true
答案 5 :(得分:-1)
我意识到这可能为时已晚,无法帮助你,但今天我遇到了同样的问题!
我通过修复搜索栏的约束来解决它。确保搜索栏的直接顶级邻居(导航栏)的约束为0px。还要确保搜索栏下方的tableview对其直接顶级邻居(搜索栏)的约束为0px。
不确定您面临的确切问题,但是我已经解决了这个问题。
答案 6 :(得分:-1)
我通过在搜索栏上添加约束来解决问题,并将其值设置为0并向搜索栏添加垂直间距约束并将其值设置为0;