我需要有一个UISearchBar
以上一个UITableView
(即。搜索栏不是表视图的一部分),我发现的是,当搜索栏被激活时,它会移出屏幕。
我做了一个公平的搜索位,找不到一个解决方案,有'搜索栏关闭屏幕'的问题,但他们正在添加搜索栏表的标题视图和调整属性,如definesPresentationContext
修复它。
我的视图层次结构:
VC的观点|- 顶视图|- 分段控制|- 搜索栏|- 表视图
看起来UISearchController希望搜索栏在表视图中,并且总是移动表视图,以便搜索栏移动到屏幕的最顶部。
有没有人遇到过同样的问题,并找到了解决方案?
多谢了!
6条答案
按热度按时间cvxl0en21#
// Swift 5
//如果你使用的是UISearch控制器,那么只需将下面的一行添加到你的viewDidLoad()中,它就会解决这个问题。
58wvjzkj2#
更新
经过进一步的测试,我决定只实现UISearchBar委托,并停止使用UISearchController,因为我只是重用我的UICollectionView来获得结果。找到一个great guide on how three different methods来实现SearchBar。
边缘案例#1
TLDR
启用剪辑到包含视图的边界。或者,如果您的集合视图单元格包含用户生成的内容视图,请在该内容视图上启用剪辑边界。
详情:
另外一个非常重要的事实是,您可以将搜索栏嵌入到容器视图中。如果容器视图未启用剪辑到边界,则可能会导致问题。这是一个问题的其他示例是UICollectionViewCells中的用户生成的内容视图。比较UITableViewCell自动生成的内容视图上的设置以观察差异。
总结
一个布尔值,用于确定子视图是否限制在视图的边界内。声明
var clipsToBounds:Bool { get set }讨论
将此值设置为true会导致子视图被裁剪到接收器的边界。如果设置为false,则不会裁剪其帧延伸超出接收器可见边界的子视图。默认值为false。
Swift 4.x解决方案
在我的例子中,这种情况发生在UICollectionView和UISackView中。我能够保持我的搜索栏在地方后,注意到以下信息在搜索栏快速帮助。
总结
要安装在界面中的搜索栏。声明
var searchBar:UISearchBar { get }讨论
在展示可搜索内容之前,将搜索栏安装在****此属性中的某个位置,并将其安装到视图控制器的界面中。搜索栏将成为搜索内容的起点。与搜索栏的交互由UISearchController对象自动处理,每当搜索信息更改时,该对象都会通知searchResultsUpdater属性中的对象。若要使用UISearchBar的自定义子类,请子类化UISearchController并实现此属性以返回自定义搜索栏。
之后,我通过以下操作成功解决了这个问题:
一段时间后,我将searchBar从searchController分配到我的UIViewController中的searchBar...
顺便说一句-我把我的searchBar嵌入到一个容器UIView中,这个容器有我需要保持它的所有约束。
rxztt3cl3#
我相信把searchBar放在tableView里面并不是强制性的。我有同样的问题一段时间回来。所有你需要做的是设置适当的自动布局约束。将searchView的前后调整为与tableView的前后对齐。同时从约束中释放边距属性。希望这对你有帮助。
nkoocmlb4#
经过几次尝试,我发现原因是当
UISearchBar
被激活时,UISearchController
将其从视图中删除,并将其放在自己的视图中,并使用表视图显示结果,因为我使用搜索栏的自动布局,通过删除它,一些约束被搞砸了。所以我的解决方案是不使用自动布局的UISearchBar
从UISearchController
。yquaqz185#
如果您选择使用UISearchBar而不使用UISearchController,我发现UISearchBar更容易将其保持在初始边界内,下面是代码模板:
9cbw7uwe6#
只需从场景元素中删除搜索显示控制器,如下图所示。
enter image description here