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
}