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 }