Как анимировать вместе с анимацией представления/увольнения UISearchController?

У меня есть табличное представление с панелью поиска в tableHeaderView, управляемой UISearchController. Я использую стандартную презентационную UISearchController анимацию.

Я хочу анимировать другое представление с той же продолжительностью, что и анимация searchBar. Я пробовал разные значения длительности, но, увы, они не всегда идеально совпадают.

Поэтому я подумал, что было бы здорово использовать -[UIViewControllerTransitionCoordinator animateAlongsideTransition:completion:] API.

К сожалению, я не могу найти ссылку на объект <UIViewControllerTransitionCoordinator>. В частности, searchController.presentingViewController.transitionCoordinator это nil.


person Ortwin Gentz    schedule 20.05.2015    source источник
comment
На всякий случай, вы когда-нибудь решали это? У меня похожая проблема   -  person deadbeef    schedule 11.03.2016


Ответы (1)


У меня была та же проблема, мне нужно было анимировать другие представления наряду с презентацией UISearchController; После вызова представления контроллера поиска становится доступным transitionCoordinator, и вы можете добавить код для анимации ваших представлений.

Представление:

func search() {
    let searchController = UISearchController(searchResultsController: resultsController)
    // Configure search controller
    self.present(searchController, animated: true) {}

    self.transitionCoordinator?.animate(alongsideTransition: { (context) in
        // animate other views
    }, completion: nil)
}

Мне также пришлось анимировать представления при отклонении контроллера поиска, в этом случае я реализую метод willDismissSearchController для UISearchControllerDelegate, transitionCoordinator не сразу доступен в этом методе, но выполнение асинхронного вызова помогает.

Закрытие:

func willDismissSearchController(_ searchController: UISearchController) {
    DispatchQueue.main.async {
        searchController.transitionCoordinator?.animate(alongsideTransition: { (context) in
            // animate views
        }, completion: nil)
    }
}

Это работает для меня с iOS 9

person juanjo    schedule 04.01.2017
comment
Если вы полагаетесь на то, что пользователь коснется панели поиска для автоматического отображения UISearchController, вы можете использовать ту же технику в willPresentSearchController, которую @juanjo использовал в willDismissSearchController. - person Geoff Hackworth; 21.07.2017
comment
Эти методы делегата не вызываются, если вы используете isActive = false для отклонения. - person ray; 19.04.2018