Ios UISearchController的UISearchBar在激活时会移出屏幕
我需要在上面有一个Ios UISearchController的UISearchBar在激活时会移出屏幕,ios,objective-c,uitableview,uisearchbar,uisearchcontroller,Ios,Objective C,Uitableview,Uisearchbar,Uisearchcontroller,我需要在上面有一个UISearchBarUITableView(即搜索栏不是表格视图的一部分),我发现当搜索栏被激活时,它会移出屏幕 我做了大量的搜索,但找不到解决方案,存在“搜索栏屏幕外”问题,但他们正在将搜索栏添加到表的标题视图,并调整属性,如definesPresentationContext修复了它 我的视图层次结构: VC的观点 |-俯视图 |-分段控制 |-搜索栏 |-表视图 看起来UISearchController希望搜索栏位于表视图内,并始终移动表视图,以便搜索栏移动到屏幕的最
UISearchBar
UITableView
(即搜索栏不是表格视图的一部分),我发现当搜索栏被激活时,它会移出屏幕
我做了大量的搜索,但找不到解决方案,存在“搜索栏屏幕外”问题,但他们正在将搜索栏添加到表的标题视图,并调整属性,如definesPresentationContext
修复了它
我的视图层次结构:
VC的观点
|-俯视图
|-分段控制
|-搜索栏
|-表视图
看起来UISearchController希望搜索栏位于表视图内,并始终移动表视图,以便搜索栏移动到屏幕的最顶部
有人有相同的问题并找到了解决方案吗
非常感谢 我认为在tableView中放置搜索栏不是强制性的。我以前也有过同样的问题。您只需设置适当的自动布局约束即可。将searchView的前导和尾随调整为与tableView的前导和尾随对齐。还可以从约束中释放边距特性。希望这能对您有所帮助。经过几次尝试,我发现原因是当激活
UISearchBar
时,UISearchController
会将其从您的视图中删除,并将其放在自己的视图中,以表视图显示结果,因为我对搜索栏使用自动布局,通过删除它,有些限制条件被搞砸了。因此,我的解决方案是不对UISearchController
更新中的UISearchBar
使用自动布局
在进一步测试之后,我决定只实现UISearchBar委托,并停止使用UISearchController,因为我只是重用UICollectionView来获得结果。找到了实现搜索栏的方法
边缘情况#1
TLDR
在包含的视图上启用剪辑边界。或者,如果您有一个包含用户生成的内容视图的集合视图单元格,请在该内容视图上启用剪辑边界。
详细信息:
另外一个非常重要的事实是,您可能在容器视图中嵌入了搜索栏。如果容器视图未启用“剪辑到边界”,这可能会导致问题。这是一个问题的其他示例是UICollectionViewCells中用户生成的内容视图。比较UITableViewCell自动生成的内容视图上的设置以观察差异
总结
一个布尔值,用于确定子视图是否仅限于
视图的边界。声明
var clipstobunds:Bool{get set}讨论
将此值设置为true将导致子视图被剪裁到边界上
接受者的声音。如果设置为false,则显示其框架超出范围的子视图
接收器的可见边界不会被剪裁。默认值
这是错误的
Swift 4.x解决方案
在我的例子中,这发生在UICollectionView内部和UIStackView内部。在搜索栏快速帮助中注意到以下信息后,我能够将搜索栏保持在原位
总结
要在界面中安装的搜索栏。声明
var searchBar:UISearchBar{get}讨论
在展示可搜索内容之前,在中安装搜索栏
该属性位于视图控制器界面的某个位置。这个
搜索栏成为搜索内容的起点。
与搜索栏的交互由
UISearchController对象,它通知
每当搜索信息更改时,SearchResultsUpdate属性。
要使用UISearchBar的自定义子类,请使用UISearchController子类
并实现此属性以返回自定义搜索栏
之后,我通过执行以下操作成功解决了问题:
let searchController = UISearchController(searchResultsController: nil)
var searchBar:UISearchBar!
稍后,我将searchController中的搜索栏分配给UIViewController中的搜索栏
顺便说一句,我将我的搜索栏嵌入到一个容器UIView中,该容器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
}
func setupSearchController(委托vc:T),其中T:uisearchresultsupdated,T:UISearchBarDelegate{
searchBar=searchController.searchBar//这是键
searchController.SearchResultsUpdate=vc
searchController.obscuresBackgroundDuringPresentation=false
searchController.searchBar.placeholder=“Search”.localized()
searchController.dimsBackgroundDuringPresentation=false
searchController.searchBar.delegate=vc
searchController.searchBar.ShowScanCellButton=true
DefinePresentationContext=true
self.searchMenu.addSubview(搜索栏)
//searchMenu是我的层次结构中受约束的UIView
}
//Swift 5
//如果您使用的是UISearch控制器,只需将下面的行添加到
viewDidLoad()将修复此问题
override func viewDidLoad() {
super.viewDidLoad()
// fixes the search moving to next screen when its active
self.definesPresentationContext = true
}
感谢您的回答,是的,如果我单独使用
UISearchBar
,根本没有问题,但是如果我使用新的UISearchController
中的搜索栏,当搜索栏被激活时,它会显示一些奇怪的动画和错误的位置。找到另一个帖子,PO提到“看起来UISearchController的设计师只考虑了搜索栏位于表头时的情况。”然后你做了什么来放置搜索栏?