ios UISearchController的UISearchBar在激活时移出屏幕

kyvafyod  于 2023-05-08  发布在  iOS
关注(0)|答案(6)|浏览(172)

我需要有一个UISearchBar以上一个UITableView(即。搜索栏不是表视图的一部分),我发现的是,当搜索栏被激活时,它会移出屏幕。
我做了一个公平的搜索位,找不到一个解决方案,有'搜索栏关闭屏幕'的问题,但他们正在添加搜索栏表的标题视图和调整属性,如definesPresentationContext修复它。
我的视图层次结构:
VC的观点|- 顶视图|- 分段控制|- 搜索栏|- 表视图
看起来UISearchController希望搜索栏在表视图中,并且总是移动表视图,以便搜索栏移动到屏幕的最顶部。
有没有人遇到过同样的问题,并找到了解决方案?
多谢了!

cvxl0en2

cvxl0en21#

// Swift 5
//如果你使用的是UISearch控制器,那么只需将下面的一行添加到你的viewDidLoad()中,它就会解决这个问题。

override func viewDidLoad() {
     super.viewDidLoad()

     // fixes the search moving to next screen when its active
     self.definesPresentationContext = true
}
58wvjzkj

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并实现此属性以返回自定义搜索栏。
之后,我通过以下操作成功解决了这个问题:

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

一段时间后,我将searchBar从searchController分配到我的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
}
rxztt3cl

rxztt3cl3#

我相信把searchBar放在tableView里面并不是强制性的。我有同样的问题一段时间回来。所有你需要做的是设置适当的自动布局约束。将searchView的前后调整为与tableView的前后对齐。同时从约束中释放边距属性。希望这对你有帮助。

nkoocmlb

nkoocmlb4#

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

yquaqz18

yquaqz185#

如果您选择使用UISearchBar而不使用UISearchController,我发现UISearchBar更容易将其保持在初始边界内,下面是代码模板:

final class MyUIViewController: UIViewController {
    // MARK: Properties
    private let tableView = UITableView()
    private let searchBar = UISearchBar()
    ...

    // MARK: View Lifecycle
    override func viewDidLoad() {
        super.viewDidLoad()

        ...

        searchBar.delegate = self
        searchBar.sizeToFit()
        
        tableView.tableHeaderView = searchBar
    }
}

extension MyUIVewController: UISearchBarDelegate {

    func searchBar(_ searchBar: UISearchBar, textDidChange searchText: String) {
        ... // Your code filtering tableView dataSource goes here

        tableView.reloadData()
    }
    
}
9cbw7uwe

9cbw7uwe6#

只需从场景元素中删除搜索显示控制器,如下图所示。
enter image description here

相关问题