iOS 11search栏跳转到屏幕顶部

我有一个UITableView,我把它的标题设置为一个search栏。

tableView.tableHeaderView = searchController.searchBar 

一切工作按计划,直到你点击它,它似乎从tableView分离并跳转到屏幕的顶部。 tableView行留在原地。 任何理由会在iOS 11而不是iOS 10中做到这一点?

鼓励在iOS 11上应用新的方式显示search栏/search控制器。以下是我所做的:

  if #available(iOS 11.0, *) { navigationItem.searchController = searchController } else { tableView.tableHeaderView = searchController.searchBar } 

我的第一篇文章,我希望我是这样做的权利。

我有完全相同的问题,真的很难find一个解决scheme。 但是现在我已经设法通过UISearchController来修复它。

这个子类有两个属性:

 var customDelegate : CustomSearchControllerDelegate! var searchBarWithCustomSize : UISearchBar! 

所以,而不是使用UISearchController searchBar我现在可以使用我的自定义searchController中的新属性searchBarWithCustomSize,如下所示:

 tableView.tableHeaderView = customSearchController.searchBarWithCustomSize 

这使得search栏在活动时performance正确。 你也有更多的自由与这searchBarWithCustomSize,例如你可以改变其框架,如果需要等等。

在我的实现中,我需要委托知道search栏文本字段已被更改,但我想委托的用法取决于您的情况。

我有完全相同的问题 – iOS11 UISearchBar奇怪的跳跃行为,在iOS10上一切都很好。

关于上述西蒙王的build议 – 我在那里的问题是,我没有在UIViewController定义我的UISearchBar ,而是在另一个UITableViewCell – 所以我没有访问navigationItem ,不能显示我的search那样吧

无论如何,经过多次的反复试验,我唯一可以做的事情就是把UISearchController和相关的代表完全UISearchController了。

相反,我在Interface Builder中定义一个UISearchBar ,并根据需要定义它的布局约束。 然后我让它的父类符合UISearchBarDelegate并做searchBar.delegate = self

然后,我添加一堆委托方法来捕获内容更改到search栏,并相应地更新我的表结果:

 func searchBarTextDidBeginEditing(_ searchBar: UISearchBar) { filterContentForSearchText(self.searchBar.text!) } func searchBarTextDidEndEditing(_ searchBar: UISearchBar) { filterContentForSearchText(self.searchBar.text!) self.searchBar.resignFirstResponder() } func searchBar(_ searchBar: UISearchBar, textDidChange searchText: String) { filterContentForSearchText(self.searchBar.text!) } 

生活又好了。 希望这可以帮助!

尝试这个:

 if (@available(iOS 11, *)){ [searchVC.searchBar addObserver:self forKeyPath:@"frame" options: NSKeyValueObservingOptionNew context:nil]; }else{ [view addSubview:searchVC.searchBar]; } - (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context { CGRect rect = [change[@"new"] CGRectValue]; if (rect.origin.y == 14) { CGRect temp = rect; temp.origin.y = 20; [self.searchVC.searchBar setValue:@(temp) forKey:@"frame"]; }else if (rect.size.height == 56){ CGRect temp = rect; temp.size.height = 50; [self.searchVC.searchBar setValue:@(temp) forKey:@"frame"]; } } 

尝试这个。

 if #available(iOS 11.0, *) { searchBar.heightAnchor.constraint(equalToConstant: 44).isActive = true }