Войти

Controller as in Apple Music

Если вы пользовались приложением Apple Music, вы могли заметить интересный модальный контроллер с аудиоплеером. Реализованно очень качественно - работают жесты для закрытия контроллера, доступен скролл вверх, интерактивные анимации. Сейчас мы попробуем это релизовать, используя библиотеку:

Установка

Для установки зависимости, вы можете перетащить папку Source в Ваш Xcode проект или использовать Cocoapods. Для это в podfile укажите следующую зависимость и введите pod update:

pod 'SPStorkController'

Это автоматически установит последнюю версию SPStorkController в Ваш проект.

Реализация

Автор библиотеки удобно вынес основные параметры для кастомизации, что сильно облегчит обучение. Увидеть результат можно написав одну строчку кода:

let controller = UIViewController()
controller.view.backgroundColor = .white
self.presentAsStork(controller)

Да, это три строки, но две из них инициализация и настройка контроллера.

На момент написания туториала автоматически подставится инидкатор закрытия и жест для смахивания вниз:

Это базовый пример. Теперь рассмотрим библиотеку более детально.

Если посмотреть на реализацию, для модального перехода используется UIViewControllerTransitioningDelegate. Нам нужно создать объект делегата и присвоить его новому контроллеру. Заодно установить .modalPresentationStyle в кастомный. Делается это просто:

let controller = UIViewController()
let transitionDelegate = SPStorkTransitioningDelegate()
controller.transitioningDelegate = transitionDelegate
controller.modalPresentationStyle = .custom
self.present(controller, animated: true, completion: nil)

Внимание

Ни в коем случае нельзя иницилизровать объект SPStorkTransitioningDelegate напрямую. Так как controller.transitioningDelegate это weak проперти, неправильная инициализация приведет к моментальному удалению из памяти объекта. Пример как делать не стоит:

// Do not it!
controller.transitioningDelegate = SPStorkTransitioningDelegate()

Light StatusBar

Чтобы установить для статус бара белый цвет, достаточно указать в модальном контроллере стиль:

override var preferredStatusBarStyle: UIStatusBarStyle {
 return .lightContent
}override func viewDidLoad() {
 super.viewDidLoad()
 self.modalPresentationCapturesStatusBarAppearance = true
}

Кастомизация

Чтобы установить кастомную высоту, нужно переопределить проперти .customHeight.

Чтобы добавить кнопку закрыть, нужно установить проперти .showCloseButton в true.

Чтобы показать / скрыть индикатор вверху контроллера, нужно установить проперти .showIndicator. Для кастомизации цвета, установить .indicatorColor в нужный UIColor.

UIScrollView

Для большей интерактивности, установите delegate и переопределите следующий метод:

func scrollViewDidScroll(_ scrollView: UIScrollView) {
 SPStorkController.scrollViewDidScroll(scrollView)
}

Это позволит контроллеру распознавать закрытие контроллера жестом и анимировать модальный контроллер, если срабатывает bounce. Это сделает вашу реализацию более интерактивной.

Snapshots

SPStorkController использует систему снепшотов - перед презентацией делается снимок экрана, а анимируется именно он. Снимок можно обновить вручную, вызвав следующий код:

SPStorkController.updatePresentingController(modal: controller)

Этот метод позволит вам обновить экран, если в нем обновились данные. Учитывайте это во время реализации.

Стоит глянуть