UISearchController的自定义动画?

Tru*_*an1 12 core-animation ios swift uisearchcontroller

我在UISearchController嵌入导航控制器的控制器中展示了一个.将出现默认动画,其中搜索框从导航栏的顶部向下滑动.

在我的情况下,这不是一个好的用户体验,因为当用户点击UITextField屏幕中间的a时,我会显示搜索.我想做的是UITextField浮动到顶部并变形到搜索框,但我无法想象如何做到这一点.

这就是我所拥有的:

class PlacesSearchController: UISearchController, UISearchBarDelegate {

    convenience init(delegate: PlacesAutocompleteViewControllerDelegate) {

        let tableViewController = PlacesAutocompleteContainer(
            delegate: delegate
        )

        self.init(searchResultsController: tableViewController)

        self.searchResultsUpdater = tableViewController
        self.hidesNavigationBarDuringPresentation = false
        self.definesPresentationContext = true
        self.searchBar.placeholder = searchBarPlaceholder
    }
}

private extension ShowAddressViewController {

    @objc func streetAddressTextFieldEditingDidBegin() {
        present(placesSearchController, animated: true, completion: nil)
    }
}
Run Code Online (Sandbox Code Playgroud)

我希望文本字段能够飞到导航栏,而不是从顶部开始搜索.我所追求的是与iOS 11 File应用程序相同的效果:

它在屏幕中间有一个文本字段,然后在点击它时动画到导航栏.但在我的情况下,文本字段在屏幕中较低,而不是导航栏的原始部分.

Ale*_* D. 14

UISearchController

UISearchController是一个非常难以定制的组件.根据我的经验,我可以说,最好是按原样使用它而不需要任何激烈或重要的定制.否则,自定义可能会导致代码混乱,全局状态变量,UIView层次结构的运行时技巧等.如果仍然需要特定的行为,最好从头开始实现搜索控制器或​​使用第三方.

默认实施

看起来UISearchController设计用于与表头视图中安装的UITableView和UISearchBar配合使用.甚至苹果官方代码示例和文档都提供了这样的使用示例(请参阅UISearchController).尝试在其他地方安装UISearchBar经常会导致搜索栏框架,位置,抽搐动画,方向更改等许多丑陋的副作用.

从iOS 11开始,UINavigationItem获得了searchController属性.它允许将搜索控制器集成到您的导航界面中,因此搜索看起来与iOS文件或iOS AppStore应用程序完全相同.UISearchController的行为仍然与另一个组件耦合,但我相信它总是比与UITableView耦合更好.

可能的解决方案

从我的角度来看,您的问题有几种可能的解决方案.我将按照增加的努力提供它们,这是实施所需的:

  1. 如果您仍想使用UISearchController,请考虑按原样使用它,而无需进行重要的自定义.Apple提供了示例代码,演示了如何使用UISearchController(请参阅使用UISearchController进行表搜索).
  2. 有几个第三方库可能更灵活,具有许多附加功能.例如:YNSearch,PYSearch.请看一看.
  3. 与UISearchController演示一起,您可以尝试通过将alpha从1更改为0来移动UITextField.这将产生UITextField顺利转换为UISearchBar的感觉.文章中描述的这种方法由Chris Slowik提供(请参阅对原始帖子的评论).我唯一要改进的是使用转换协调器的动画(参见此处的示例),它将使同步时序的动画变得更加平滑.最终的实施也将更加清洁.
  4. 作为一个选项,您可以尝试仅使用UISearchBar或简单的UITextField设计自己的搜索控制器.
  5. 您可以继承UISearchController并添加UITextField对象.UISearchController符合UIViewControllerAnimatedTransitioning和UIViewControllerTransitioningDelegate协议,其中UITextFiled可以与过渡动画一起被删除或添加.

我希望这有帮助.

更新:

我已经实现了我在第3点描述的方法.以下是它的工作原理:

UISearchController与UITextField

您可以在此处找到代码段.请注意,这只是代码示例,可能存在未处理的情况.然后检查两次.