Содержание
- Что такое Detents (стопоры)
- Dismiss
- Scroll контента
- Альбомная ориентация
- Как затемнять фон
- Как добавить индикатор
- Corner Radius
Когда я был молодым, то сделал либу для управления высотой контроллера на снепшотах. Новые модальные контроллеры частично решили проблему нативно, а с iOS 15 управлять высотой можно из коробки:
Выглядит круто, кейсов много. Чтобы показать дефолтный sheet-controller, используйте код:
let controller = UIViewController()
if let sheetController = controller.sheetPresentationController {
sheetController.detents = [.medium(), .large()]
}
present(controller, animated: true)
Это обычный модальный контроллер, которому добавили сложное поведение. Можно оборачивать в навигационный контроллер, добавлять заголовок и бар-кнопки. Если проект поддерживает предыдущие версии iOS, оберните код с
Стопор — высота, к которой стремится контроллер. Похоже на ситуации с пейджингом скролла или когда электрон не на своём энергетическом уровне.
Доступно два стопора:
Доступные стопоры указываются так:
sheetController.detents = [.medium(), .large()]
Если укажите только один стопор, то переключиться жестом не получится.
Чтобы перейти из одного стопора в другой, используйте код:
sheetController.animateChanges {
sheetController.selectedDetentIdentifier = .medium
}
Можно вызывать без блока анимации. Ещё можно переключать стопор без возможности изменять его, для этого меняем доступные стопоры:
sheetController.animateChanges {
sheetController.detents = [.large()]
}
Контроллер переключиться в
Если вы хотите зафиксировать контроллер в одном стопоре без возможности закрыть его, установите
navigationController.isModalInPresentation = true
if let sheetController = nav.sheetPresentationController {
sheetController.detents = [.medium()]
sheetController.largestUndimmedDetentIdentifier = .medium
}
Если активен
Чтобы сначала скролить контент, укажите такие параметры:
sheetController.prefersScrollingExpandsWhenScrolledToEdge = false
Теперь при скроле вверх будет отрабатываться скрол контента. Чтобы перейти в большой стопор, потяните за navigation-бар.
По умолчанию sheet-контроллер в альбомной ориентации выглядит как обычный контроллер. Дело в том, что
sheetController.prefersEdgeAttachedInCompactHeight = true
Вот как это выглядит:

Чтобы контроллер учитывал prefered-размер, установите
Если фон затемнён, кнопка за модальным контроллером не будет кликабельной. Чтобы разрешить взаимодействие с фоном, уберите затемнение. Сначала укажите самый большой стопор, который не нужно затемнять. Вот код:
sheetController.largestUndimmedDetentIdentifier = .medium
Указано, что
Чтобы добавить индикатор вверху контроллера, установите

Можно управлять закруглением краёв у контроллера. Установите значение для

На скриншоте я установил corner-радиус в
На этом всё. Напишите в комментариях к посту, будете ли использовать в своих проектах sheet-контроллеры.
Другие туториалы
Как очистить данные для приложения Catalyst включая AppGroup, Realm и UserDefaults.
Как устроен ProgressView. Как настроить внешний вид: спиннер и прогресс-бар.
Знакомимся с модификатором
Как добавить альтернативные иконки для A/B тестов на странице приложения.
В telegram-канале приходят уведомления о новых туториалах. В чате для iOS разработчиков ответят на вопросы.