iOS 11搜索栏跳到屏幕顶部

时间:2017-08-21 13:54:36

标签: ios uitableview ios11 swift4

我有一个UITableView,我将其标题设置为搜索栏。

tableView.tableHeaderView = searchController.searchBar

所有内容都按计划运行,直到您单击它并且它看起来与tableView分离并跳转到屏幕顶部。 tableView行保持不变。有什么理由在iOS 11而不是iOS 10中这样做吗?

5 个答案:

答案 0 :(得分:12)

鼓励在iOS 11上应用新方式显示搜索栏/搜索控制器。 这就是我所做的:

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

答案 1 :(得分:4)

我关于SO的第一篇文章,我希望我做得对。

我遇到了完全相同的问题,并且很难找到解决方案。但现在我已经设法通过继承UISearchController来修复它。

此子类有两个属性:

var customDelegate : CustomSearchControllerDelegate!
var searchBarWithCustomSize : UISearchBar!

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

tableView.tableHeaderView = customSearchController.searchBarWithCustomSize

这使得搜索栏在激活时表现正常。您还可以使用此searchBarWithCustomSize获得更多自由,例如,您可以根据需要更改其框架,等等。

在我的实现中,我需要代表知道搜索栏文本字段何时被更改,但我想代表的使用取决于您的情况。

答案 2 :(得分:1)

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

关于Simon Wang上面的建议 - 我遇到的问题是我没有在UISearchBar内定义UIViewController,而是在另一个UITableViewCell内 - 所以我无权访问navigationItem,无法以此方式显示我的搜索栏。

无论如何,经过多次试验和错误,我能让事情发挥作用的唯一方法就是完全摧毁UISearchController及相关代表。

相反,我在Interface Builder中定义UISearchBar,并根据需要定义其布局约束。然后我使其父类符合UISearchBarDelegate并执行searchBar.delegate = self

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

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!)
}

生活再好。 希望这有帮助!

答案 3 :(得分:0)

试试这个:

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"];
    }
}

答案 4 :(得分:0)

试试这个。

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