UISearchController的UISearchBar在活动时移出屏幕

时间:2016-09-21 05:41:14

标签: ios objective-c uitableview uisearchbar uisearchcontroller

我需要UISearchBar 以上 a UITableView(即搜索栏不是表格视图的一部分),我发现的是搜索栏被激活,它会离开屏幕。

我做了一些搜索并找不到解决方案,有“搜索栏关闭屏幕”问题,但他们正在向表的标题视图添加搜索栏,并调整definesPresentationContext等属性修复它。

我的视图层次结构:

VC的观点 | - 顶视图        | - 分段控制        | - 搜索栏 | - 表格视图

看起来UISearchController期望搜索栏位于表格视图内,并始终移动表格视图,以便搜索栏移动到屏幕的最顶部。

任何人遇到同样的问题并找到解决方案?

非常感谢!

4 个答案:

答案 0 :(得分:0)

我认为在tableView中放置searchBar不是必需的。我有一段时间回答同样的问题。您需要做的就是设置适当的自动布局约束。调整searchView的前导和尾随,以对齐tableView的前导和尾随。还从约束中释放margin属性。希望这可以帮到你。

答案 1 :(得分:0)

经过几次尝试后,我发现原因是当UISearchBar被激活时,UISearchController会将其从您的视图中删除,并将其放在自己的视图中,并带有表格视图显示结果,因为我使用自动布局搜索栏,通过删除它,一些约束被搞砸了。所以我的解决方案是不使用来自UISearchBar的{​​{1}}的自动布局。

答案 2 :(得分:0)

更新

在进一步测试之后,我决定只实现UISearchBar委托并停止使用UISearchController,因为我只是将UICollectionView用作结果。找到了great guide on how three different methods来实现SearchBar。

边缘案例#1

  

TLDR

     

启用剪辑到包含视图上的边界。或者,如果您有一个包含用户生成的内容视图的集合视图单元格,请在该内容视图上启用边界剪辑。

详细信息:

另一个非常重要的事实是,您可能在容器视图中嵌入了搜索栏。如果容器视图没有启用边界剪辑,则可能导致问题。问题的其他示例是UICollectionViewCells中用户生成的内容视图。比较UITableViewCell自动生成的内容视图上的设置,以观察差异。

  

摘要

     

一个布尔值,该值确定子视图是否限于   视图的边界。声明

     

var clipsToBounds:布尔{获取设置}讨论

     

将此值设置为true会导致子视图被裁剪到边界   接收器。如果设置为false,则子视图的框架超出   接收器的可见边界不会被裁剪。默认值   是错误的。

Swift 4.x解决方案

就我而言,这既发生在UICollectionView内部,也发生在UIStackView内部。注意到searchBar快速帮助中的以下信息后,我能够将searchBar保持在原位。

  

摘要

     

要在界面中安装的搜索栏。声明

     

var searchBar:UISearchBar {get}讨论

     

在显示可搜索的内容之前,将搜索栏安装在中   此属性进入视图控制器界面的某处。的   搜索栏成为搜索内容的起点。   与搜索栏的互动由系统自动处理   UISearchController对象,该对象在   每当搜索信息更改时,都将使用searchResultsUpdater属性。   要使用UISearchBar的自定义子类,请子类UISearchController   并实现此属性以返回您的自定义搜索栏。

之后,我可以通过执行以下操作成功解决此问题:

let searchController = UISearchController(searchResultsController: nil)
var searchBar:UISearchBar!

有时候,我将searchController中的searchBar分配给我的UIViewController中的searchBar ...

顺便说一句-我将searchBar嵌入到一个容器UIView中,该容器具有将其保持在原位所需的所有约束。

func setupSearchController<T:UIViewController>(delegate vc:T) where T: UISearchResultsUpdating, T:UISearchBarDelegate {
    searchBar = searchController.searchBar //this is the key
    searchController.searchResultsUpdater = vc
    searchController.obscuresBackgroundDuringPresentation = false
    searchController.searchBar.placeholder = "Search".localized()
    searchController.dimsBackgroundDuringPresentation = false
    searchController.searchBar.delegate = vc
    searchController.searchBar.showsCancelButton = true
    definesPresentationContext = true
    self.searchMenu.addSubview(searchBar) 
    //searchMenu is a constrained UIView in my hierarchy
}

答案 3 :(得分:0)

// Swift 5

//如果使用的是UISearch Controller,则只需在下面添加一行 viewDidLoad(),它将解决该问题。

pdf("pathtopdf.pdf", onefile = TRUE)
for (i in unique(df$id)) {
  plot(ggplot(df[df$id==i,], aes(x = x, y = x)) + geom_point() + geom_smooth()) 
}
dev.off()