iOS 11 跳转到屏幕顶部的搜索栏
iOS 11 search bar jumping to top of screen
我有一个 UITableView,我在其中将其 header 设置为搜索栏。
tableView.tableHeaderView = searchController.searchBar
一切都按计划进行,直到您单击它并且它似乎与 tableView 分离并跳到屏幕顶部。 tableView 行保留在原位。它会在 iOS 11 而不是 iOS 10 中这样做的任何原因?
我在 SO 上的第一个 post,我希望我做对了。
我遇到了完全相同的问题,并且真的很难找到解决方案。但现在我已经设法通过子类化 UISearchController
.
来修复它
这个子类有两个属性:
var customDelegate : CustomSearchControllerDelegate!
var searchBarWithCustomSize : UISearchBar!
因此,我现在可以使用自定义 searchController 中的新 属性 searchBarWithCustomSize,而不是使用 UISearchController 的 searchBar,如下所示:
tableView.tableHeaderView = customSearchController.searchBarWithCustomSize
这使得搜索栏在活动时能够正确运行。您还可以更自由地使用此 searchBarWithCustomSize,例如,您可以根据需要更改其框架等。
在我的实现中,我需要代理知道搜索栏文本字段何时更改,但我想代理的使用取决于您的情况。
鼓励在 iOS 11 上应用显示搜索 bar/search 控制器的新方法。
这是我所做的:
if #available(iOS 11.0, *) {
navigationItem.searchController = searchController
} else {
tableView.tableHeaderView = searchController.searchBar
}
我遇到了完全相同的问题 - iOS11 上的 UISearchBar 奇怪的跳跃行为,在 iOS10 上一切正常。
关于上面 Simon Wang 的建议 - 我遇到的问题是我没有在 UIViewController
中定义我的 UISearchBar
,而是在另一个 UITableViewCell
中 - 所以因此我无法访问 navigationItem
并且无法以这种方式显示我的搜索栏。
无论如何,经过多次试验和错误后,我唯一能让事情正常进行的方法就是完全删除 UISearchController
和相关代表。
相反,我在 Interface Builder 中定义了一个 UISearchBar
,并根据需要定义其布局约束。然后我让它的父 class 符合 UISearchBarDelegate
并做 searchBar.delegate = self
然后我添加了一堆委托方法来捕获搜索栏的内容更改,并相应地更新我的 table 结果:
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
}
我有一个 UITableView,我在其中将其 header 设置为搜索栏。
tableView.tableHeaderView = searchController.searchBar
一切都按计划进行,直到您单击它并且它似乎与 tableView 分离并跳到屏幕顶部。 tableView 行保留在原位。它会在 iOS 11 而不是 iOS 10 中这样做的任何原因?
我在 SO 上的第一个 post,我希望我做对了。
我遇到了完全相同的问题,并且真的很难找到解决方案。但现在我已经设法通过子类化 UISearchController
.
这个子类有两个属性:
var customDelegate : CustomSearchControllerDelegate!
var searchBarWithCustomSize : UISearchBar!
因此,我现在可以使用自定义 searchController 中的新 属性 searchBarWithCustomSize,而不是使用 UISearchController 的 searchBar,如下所示:
tableView.tableHeaderView = customSearchController.searchBarWithCustomSize
这使得搜索栏在活动时能够正确运行。您还可以更自由地使用此 searchBarWithCustomSize,例如,您可以根据需要更改其框架等。
在我的实现中,我需要代理知道搜索栏文本字段何时更改,但我想代理的使用取决于您的情况。
鼓励在 iOS 11 上应用显示搜索 bar/search 控制器的新方法。 这是我所做的:
if #available(iOS 11.0, *) {
navigationItem.searchController = searchController
} else {
tableView.tableHeaderView = searchController.searchBar
}
我遇到了完全相同的问题 - iOS11 上的 UISearchBar 奇怪的跳跃行为,在 iOS10 上一切正常。
关于上面 Simon Wang 的建议 - 我遇到的问题是我没有在 UIViewController
中定义我的 UISearchBar
,而是在另一个 UITableViewCell
中 - 所以因此我无法访问 navigationItem
并且无法以这种方式显示我的搜索栏。
无论如何,经过多次试验和错误后,我唯一能让事情正常进行的方法就是完全删除 UISearchController
和相关代表。
相反,我在 Interface Builder 中定义了一个 UISearchBar
,并根据需要定义其布局约束。然后我让它的父 class 符合 UISearchBarDelegate
并做 searchBar.delegate = self
然后我添加了一堆委托方法来捕获搜索栏的内容更改,并相应地更新我的 table 结果:
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
}