草庐IT

ios - 用户取消搜索时约束不变

coder 2023-09-10 原文

所以我有一个搜索图标作为我的右栏按钮项。当用户点击该图标时,它允许用户搜索并仅在表格 View 中显示某些值。它还隐藏了顶部的导航栏按钮和导航 Controller 正下方的 filterBar

func setupNavBarButtons() {
    let searchImage = UIImage(named: "search_icon")?.withRenderingMode(.alwaysOriginal)
    let searchBarButtonItem = UIBarButtonItem(image: searchImage, style: .plain, target: self, action: #selector(handleSearch))
    navigationItem.rightBarButtonItem = searchBarButtonItem
    setupFilterButton()
}

像这样在搜索时过滤要隐藏的栏和导航栏项目:

func handleSearch() {
    searchController.searchBar.isHidden = false
    navigationItem.titleView = searchController.searchBar
    searchController.searchBar.becomeFirstResponder()
    navigationItem.rightBarButtonItems = nil
    navigationItem.leftBarButtonItems = nil
    filterBar.isHidden = true
    tableView.topAnchor.constraint(equalTo: view.topAnchor).isActive = true
}

然后它会在用户停止搜索后再次出现,如下所示:

func searchBarCancelButtonClicked(_ searchBar: UISearchBar) {
    setupNavBarButtons()
    searchController.searchBar.isHidden = true
    filterBar.isHidden = false
    tableView.topAnchor.constraint(equalTo: view.topAnchor, constant: 40).isActive = true
    // Also tried tableView.topAnchor.constraint(equalTo: filterBar.bottomAnchor).isActive = true
}

搜索前:

搜索期间

搜索后:如您所见,tableview 没有返回到原来的位置。 filterBar 是带有“ map ”和“位置”的灰色 View

仍然有同样的问题,所以我在这里上传了我的项目:

https://github.com/lukejones1/bug

最佳答案

首先,您添加了 40 像素的“高度”布局约束。 当用户单击搜索按钮时,您添加了 0 px 的“高度”布局约束。 再次,当用户单击取消按钮时,您添加了 40 像素的“高度”布局约束。

您需要重用布局约束。

class ViewController: UIViewController {

var filterBarHeightLC : NSLayoutConstraint?

lazy var tableView : UITableView = {
    let tv = UITableView()
    tv.register(UITableViewCell.self, forCellReuseIdentifier: "cellId")
    tv.layoutMargins = UIEdgeInsets.zero
    tv.separatorInset = UIEdgeInsets.zero
    tv.backgroundColor = .red
    tv.translatesAutoresizingMaskIntoConstraints = false
    return tv
}()

lazy var filterBar : UIView = {
    let bar = UIView()
    bar.backgroundColor = .blue
    bar.translatesAutoresizingMaskIntoConstraints = false
    return bar
}()

fileprivate lazy var filterButton : UIButton = {
    let button = UIButton()
    button.setTitleColor(UIColor.white, for: UIControlState())
    button.setTitle("Filter", for: UIControlState())
    button.contentHorizontalAlignment = UIControlContentHorizontalAlignment.left
    button.translatesAutoresizingMaskIntoConstraints = false
    return button
}()

fileprivate lazy var searchController: UISearchController = {
    let sc = UISearchController(searchResultsController:  nil)
    sc.dimsBackgroundDuringPresentation = false
    sc.hidesNavigationBarDuringPresentation = false
    sc.searchResultsUpdater = self
    sc.delegate = self
    sc.view.tintColor = UIColor.white
    sc.searchBar.tintColor = UIColor.white
    sc.searchBar.delegate = self
    return sc
}()

func setupNavBarButtons() {
    let searchBarButtonItem = UIBarButtonItem(title: "Search", style: .plain, target: self, action: #selector(handleSearch))
    navigationItem.rightBarButtonItem = searchBarButtonItem
    setupFilterButton()
}

func setupFilterButton() {
    let containerView = UIView()
    containerView.frame = CGRect(x: 0, y: 0, width: 100, height: 40)
    containerView.addSubview(filterButton)
    filterButton.leftAnchor.constraint(equalTo: containerView.leftAnchor).isActive = true
    filterButton.centerYAnchor.constraint(equalTo: containerView.centerYAnchor).isActive = true
    let filterBarButtonItem = UIBarButtonItem(customView: containerView)
    navigationItem.leftBarButtonItem = filterBarButtonItem
}

override func viewDidLoad() {
    super.viewDidLoad()
    setupViews()
    setupNavBarButtons()
    view.backgroundColor = .white
}

func handleSearch() {
    searchController.searchBar.isHidden = false
    navigationItem.titleView = searchController.searchBar
    searchController.searchBar.becomeFirstResponder()
    navigationItem.rightBarButtonItems = nil
    navigationItem.leftBarButtonItems = nil

    // changed!
    filterBarHeightLC?.constant = 0
}

func setupViews() {
    view.addSubview(filterBar)
    view.addSubview(tableView)

    tableView.leftAnchor.constraint(equalTo: view.leftAnchor).isActive = true
    tableView.rightAnchor.constraint(equalTo: view.rightAnchor).isActive = true
    tableView.topAnchor.constraint(equalTo: filterBar.bottomAnchor).isActive = true
    tableView.bottomAnchor.constraint(equalTo: view.bottomAnchor).isActive = true

    filterBar.leftAnchor.constraint(equalTo: view.leftAnchor).isActive = true
    filterBar.rightAnchor.constraint(equalTo: view.rightAnchor).isActive = true
    filterBar.topAnchor.constraint(equalTo: view.topAnchor, constant: 64).isActive = true

    // changed!
    filterBarHeightLC = filterBar.heightAnchor.constraint(equalToConstant: 40)
    filterBarHeightLC?.isActive = true
}

extension ViewController: UISearchControllerDelegate, UISearchResultsUpdating, UISearchBarDelegate {

func filteredContentForSearchText(_ searchText: String, scope: String = "All") {
    tableView.reloadData()
}

func searchBarCancelButtonClicked(_ searchBar: UISearchBar) {
    setupNavBarButtons()
    searchController.searchBar.isHidden = true

    // changed!
    filterBarHeightLC?.constant = 40
}

func updateSearchResults(for searchController: UISearchController) {
    filteredContentForSearchText(searchController.searchBar.text!)
}

祝您编码愉快! :)

关于ios - 用户取消搜索时约束不变,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39892955/

有关ios - 用户取消搜索时约束不变的更多相关文章

  1. ruby-on-rails - 使用 rails 4 设计而不更新用户 - 2

    我将应用程序升级到Rails4,一切正常。我可以登录并转到我的编辑页面。也更新了观点。使用标准View时,用户会更新。但是当我添加例如字段:name时,它​​不会在表单中更新。使用devise3.1.1和gem'protected_attributes'我需要在设备或数据库上运行某种更新命令吗?我也搜索过这个地方,找到了许多不同的解决方案,但没有一个会更新我的用户字段。我没有添加任何自定义字段。 最佳答案 如果您想允许额外的参数,您可以在ApplicationController中使用beforefilter,因为Rails4将参数

  2. ruby - 如何验证 IO.copy_stream 是否成功 - 2

    这里有一个很好的答案解释了如何在Ruby中下载文件而不将其加载到内存中:https://stackoverflow.com/a/29743394/4852737require'open-uri'download=open('http://example.com/image.png')IO.copy_stream(download,'~/image.png')我如何验证下载文件的IO.copy_stream调用是否真的成功——这意味着下载的文件与我打算下载的文件完全相同,而不是下载一半的损坏文件?documentation说IO.copy_stream返回它复制的字节数,但是当我还没有下

  3. ruby-on-rails - Nokogiri:使用 XPath 搜索 <div> - 2

    我使用Nokogiri(Rubygem)css搜索寻找某些在我的html里面。看起来Nokogiri的css搜索不喜欢正则表达式。我想切换到Nokogiri的xpath搜索,因为这似乎支持搜索字符串中的正则表达式。如何在xpath搜索中实现下面提到的(伪)css搜索?require'rubygems'require'nokogiri'value=Nokogiri::HTML.parse(ABBlaCD3"HTML_END#my_blockisgivenmy_bl="1"#my_eqcorrespondstothisregexmy_eq="\/[0-9]+\/"#FIXMEThefoll

  4. Ruby 文件 IO 定界符? - 2

    我正在尝试解析一个文本文件,该文件每行包含可变数量的单词和数字,如下所示:foo4.500bar3.001.33foobar如何读取由空格而不是换行符分隔的文件?有什么方法可以设置File("file.txt").foreach方法以使用空格而不是换行符作为分隔符? 最佳答案 接受的答案将slurp文件,这可能是大文本文件的问题。更好的解决方案是IO.foreach.它是惯用的,将按字符流式传输文件:File.foreach(filename,""){|string|putsstring}包含“thisisanexample”结果的

  5. ruby-on-rails - 简单的 Ruby on Rails 问题——如何将评论附加到用户和文章? - 2

    我意识到这可能是一个非常基本的问题,但我现在已经花了几天时间回过头来解决这个问题,但出于某种原因,Google就是没有帮助我。(我认为部分问题在于我是一个初学者,我不知道该问什么......)我也看过O'Reilly的RubyCookbook和RailsAPI,但我仍然停留在这个问题上.我找到了一些关于多态关系的信息,但它似乎不是我需要的(尽管如果我错了请告诉我)。我正在尝试调整MichaelHartl'stutorial创建一个包含用户、文章和评论的博客应用程序(不使用脚手架)。我希望评论既属于用户又属于文章。我的主要问题是:我不知道如何将当前文章的ID放入评论Controller。

  6. ruby - RVM "ERROR: Unable to checkout branch ."单用户 - 2

    我在新的Debian6VirtualBoxVM上安装RVM时遇到问题。我已经安装了所有需要的包并使用下载了安装脚本(curl-shttps://rvm.beginrescueend.com/install/rvm)>rvm,但以单个用户身份运行时bashrvm我收到以下错误消息:ERROR:Unabletocheckoutbranch.安装在这里停止,并且(据我所知)没有安装RVM的任何文件。如果我以root身份运行脚本(对于多用户安装),我会收到另一条消息:Successfullycheckedoutbranch''安装程序继续并指示成功,但未添加.rvm目录,甚至在修改我的.bas

  7. Get https://registry-1.docker.io/v2/: net/http: request canceled while waiting - 2

    1.错误信息:Errorresponsefromdaemon:Gethttps://registry-1.docker.io/v2/:net/http:requestcanceledwhilewaitingforconnection(Client.Timeoutexceededwhileawaitingheaders)或者:Errorresponsefromdaemon:Gethttps://registry-1.docker.io/v2/:net/http:TLShandshaketimeout2.报错原因:docker使用的镜像网址默认为国外,下载容易超时,需要修改成国内镜像地址(首先阿里

  8. ruby - 如何搜索有用的 ruby - 2

    寻找有用的ruby的好网站是什么? 最佳答案 AgileWebDevelopment列出插件(虽然不是ruby​​gems,我不确定为什么),并允许人们对它们进行评级。RubyToolbox按类别列出gem并比较它们的受欢迎程度。Rubygems有一个搜索框。StackOverflow对最有用的rails插件和ruby​​gems有疑问。 关于ruby-如何搜索有用的ruby,我们在StackOverflow上找到一个类似的问题: https://stacko

  9. ruby - 如何搜索、递增和替换 Ruby 字符串中的整数子字符串? - 2

    我有很多这样的文档:foo_1foo_2foo_3bar_1foo_4...我想通过获取foo_[X]的所有实例并将它们中的每一个替换为foo_[X+1]来转换它们。在这个例子中:foo_2foo_3foo_4bar_1foo_5...我可以用gsub和一个block来做到这一点吗?如果不是,最干净的方法是什么?我真的在寻找一个优雅的解决方案,因为我总是可以暴力破解它,但我觉得有一些正则表达式技巧值得学习。 最佳答案 我(完全)不懂Ruby,但类似这样的东西应该可以工作:"foo_1foo_2".gsub(/(foo_)(\d+)/

  10. ruby - 在没有基准或时间的情况下用 Ruby 测量用户时间或系统时间 - 2

    因为我现在正在做一些时间测量,我想知道是否可以在不使用Benchmark类或命令行实用程序time的情况下测量用户时间或系统时间。使用Time类只显示挂钟时间,而不显示系统和用户时间,但是我正在寻找具有相同灵active的解决方案,例如time=TimeUtility.now#somecodeuser,system,real=TimeUtility.now-time原因是我有点不喜欢Benchmark,因为它不能只返回数字(编辑:我错了-它可以。请参阅下面的答案。)。当然,我可以解析输出,但感觉不对。*NIX系统的time实用程序也应该可以解决我的问题,但我想知道是否已经在Ruby中实

随机推荐