让 UISearchBar 像 Music App 一样消失

Posted

技术标签:

【中文标题】让 UISearchBar 像 Music App 一样消失【英文标题】:Make UISearchBar dismiss like Music App 【发布时间】:2015-08-29 15:54:03 【问题描述】:

注意searchBar 放大镜和占位符文本在解雇时是如何移动的:

有没有什么办法可以在不移动文本和图标的情况下关闭这个搜索栏?查看音乐应用的动画,了解我想要实现的动画。

我有一个UISeachBar,当在导航栏中单击搜索按钮时会显示它。

@IBAction func searchButtonPressed(sender: AnyObject) 

    searchController = UISearchController(searchResultsController: nil)
    searchController.searchResultsUpdater = self
    searchController.searchBar.delegate = self
    searchController.hidesNavigationBarDuringPresentation = false
    searchController.dimsBackgroundDuringPresentation = false
    presentViewController(searchController, animated: true, completion: nil)

现在,当按下取消按钮时,我希望整个视图向上移动,而不会在视图向上移出屏幕时看到 SearchBar 图标和占位符文本滑动到 searchBar 的中心。

我知道有 searchBarCancelButtonClicked(searchBar:) 方法,但这似乎会自动关闭 SearchBar,我不知道如何控制它。

如何让 SearchBar 像音乐应用中的一样消失?

编辑:这是我使用的唯一委托方法:

func updateSearchResultsForSearchController(searchController: UISearchController) 
    masterFilter.removeAll()
    filterContentForSearchText(searchController.searchBar.text!)
    tableView.reloadData()

【问题讨论】:

您可以发布您可能添加的任何UISearchBarDelegate 方法吗?如果你打电话给resignFirstResponder,它会触发不需要的动画。 您已设置您的searchBar.delegate。但是您的代码中没有searchBarCancelButtonClicked 或其他searchBar 方法?在这一点上,我唯一能解释的是您的项目中的一些额外内容,这些内容是您尝试过的先前方法遗留下来的,这会影响您切换到的新方法。 原谅我。我确实有searchBarCancelButtonClicked,但里面没有代码。我不确定要放什么代码来实现我想要的动画。 无。您不应该包含它,甚至不需要设置searchBar.delegate,因为过滤是由 searchResultsUpdater 处理的。尝试删除 searchController.searchBar.delegate = self,因为 Apple 甚至没有在他们的示例中包含它。 好的,我删除了那行。回到我原来的问题,这个动画应该怎么实现呢? 【参考方案1】:

这就是我实现这一目标的方式。简单易行。

extension UIViewController 


    func setNavigationBarItem() 

        let searchaButton = UIButton.init(frame: CGRectMake(0, 0, 30, 30))
        searchaButton.setBackgroundImage(UIImage(named: "search.png"), forState: UIControlState.Normal)
        searchaButton.addTarget(self, action: #selector(self.searchPressed), forControlEvents: UIControlEvents.TouchUpInside)


        let rightButton: UIBarButtonItem = UIBarButtonItem.init(customView: searchaButton)

        navigationItem.rightBarButtonItem = rightButton

    


    public func searchPressed()

        var searchController: UISearchController!

        // Create the search results view controller and use it for the UISearchController.
        let searchResultsController = storyboard!.instantiateViewControllerWithIdentifier("SearchResultController") as! SearchResultsViewController

        // Create the search controller and make it perform the results updating.
        searchController = UISearchController(searchResultsController: searchResultsController)
        searchController.searchResultsUpdater = searchResultsController
        searchController.hidesNavigationBarDuringPresentation = false

        // Present the view controller.
        presentViewController(searchController, animated: true, completion: nil)

    


注意:

此代码适用于旧的 swift 版本。

希望对你有帮助。

【讨论】:

【参考方案2】:

searchBar 向右展开,因为正在取消搜索,并且取消按钮正在消失。

无需取消搜索并触发该动画,只需显式关闭搜索控制器即可。

你可以通过设置来做到这一点

searchController.active = false

【讨论】:

把它放在searchBarCancelButtonClicked(searchBar:) 对动画没有影响。 因为您在单击取消按钮后仍在取消搜索。同样,我建议您下载并运行 Apple 的 UICatalog sample code。它完全按照您的要求进行操作,并且以与 Music 完全相同的方式进行动画处理。看看他们如何解雇他们的搜索控制器。您会发现搜索并未被取消。我可以粘贴代码,但如果你自己发现它是如何工作的,你就会明白。 我很想运行 UICatalog 项目,但是项目中有 4 个错误。它没有构建。 您使用的是 Xcode 6 还是 7?它已更新到 Swift 1.2 并从 Xcode 6.3 开始工作。 我使用的是 Xcode 6.4。它在 Xcode 7 中也不起作用。【参考方案3】:

要使此动画正常工作,您需要了解自定义 UIViewController transitions。在UISearchBarDelegate 方法-searchBarCancelButtonClicked(searchBar:) 中,您需要做一些事情:

    HideUINavigationBarUISearchControllerdismissal 将UITableView 设置为动画到帧的底部并淡出。 如果您以模态方式显示搜索,请确保将 modalPresentationStyle 设置为 UIModalPresentationCurrentContext

【讨论】:

以上是关于让 UISearchBar 像 Music App 一样消失的主要内容,如果未能解决你的问题,请参考以下文章

使 UItextfield 像 UISearchBar 一样运行

Vue 实现的音乐项目 music app 知识点总结分享

UISearchBar 取消按钮颜色?

移除 UISearchBar 的上下边框和阴影?

显示 searchResultsController 时出现 UISearchBar AutoLayout 错误

UISearchBar 与 iOS 中的状态栏重叠