带有UIRefreshControl的导航栏中的iOS 11 UISearchController会导致布局故障

时间:2017-11-10 14:31:41

标签: uitableview uikit ios11 uisearchcontroller uirefreshcontrol

我正在尝试使用UIRefreshControl在表格视图上以及searchController上的新navigationItem API。
现在当我设置hidesSearchBarWhenScrolling"拉下来刷新"动画不再显示,刷新控件只是在某一点弹出。

enter image description here

它似乎是UIKit中的一个错误(...与每年相同的程序)。 有没有人找到这个解决方案?

要重现此问题,请将其添加到全新的iOS 11"主/详细信息"示例项目:

- (void)viewDidLoad {
    // [setup code here]

    self.refreshControl = [UIRefreshControl new];
    self.navigationItem.searchController = [[UISearchController alloc] initWithSearchResultsController:nil];
    self.navigationItem.hidesSearchBarWhenScrolling = NO; // <-- setting this causes jumpy UI
}

1 个答案:

答案 0 :(得分:0)

我刚遇到同样的问题。它绝对看起来像UIKit中的一个错误。肯定是filing a radar值得的。

我发现了一种非常黑客的缓解方法:

- (void)scrollViewDidScroll:(UIScrollView *)scrollView
{
    //Fixes a bug in UIKit where the refresh control is broken when `hidesSearchBarWhenScrolling` is NO.
    if (@available(iOS 11.0, *)) {
        self.navigationItem.hidesSearchBarWhenScrolling = scrollView.contentOffset.y < -scrollView.adjustedContentInset.top;
    }
}

基本上这里发生的事情是,只要滚动视图滚动到顶部(刷新控件将变为可见),这段代码就会将hidesSearchBarWhenScrolling变回YES。一旦用户再次向下滚动,它将被设置回NO,搜索栏将继续保持可见状态。

希望Apple能够在未来的iOS版本中修复此问题,但对于当前的发布版本,这可能不得不这样做。