Я экспериментировал с настраиваемым представлением и отклонением настраиваемого интерактивного контроллера представления (используя комбинацию UIPresentationController
, UIPercentDrivenInteractiveTransition
, UIViewControllerAnimatedTransitioning
и UIViewControllerTransitioningDelegate
) и в основном добился того, чтобы все работало хорошо для моих нужд.
Однако есть один общий сценарий, который мне еще предстоит найти в любом из учебных пособий или документации, который я прочитал, что приводит меня к следующему вопросу:
...
Как правильно обрабатывать отклонение настраиваемого интерактивного контроллера представления с помощью жеста панорамирования, когда отклоненное представление содержит UIScrollView (т. Е. UITableView, UICollectionView, WKWebView и т. Д.)?
...
По сути, я хотел бы получить следующее:
Контроллеры вида в интерактивном режиме отключаются путем панорамирования их вниз. Это обычный UX во многих приложениях.
Если контроллер отклоненного представления содержит (прокручиваемый по вертикали) вид прокрутки, прокрутка вниз прокручивает это представление, как ожидается, до тех пор, пока пользователь не достигнет вершины, после чего прокрутка прекращается и происходит панорамирование для увольнения.
В противном случае представления прокрутки должны вести себя как обычно.
Я знаю, что это технически возможно - я видел это в других приложениях, таких как Overcast и собственное музыкальное приложение Apple, - но я не смог найти ключ к координации поведения моего жеста панорамирования с этим видом прокрутки.
Большинство моих собственных попыток сосредоточены на попытках условно включить / отключить представление прокрутки (или связанный с ним распознаватель жестов панорамирования) на основе его contentOffset.y
во время прокрутки и получения оттуда распознавателя панорамирования жестов при увольнении контроллера представления, но это был полон проблем, и я боюсь, что я обдумываю это.
Мне кажется, что секрет в основном заключается в следующем методе делегата распознавания жестов панорамирования:
func gestureRecognizer(_ gestureRecognizer: UIGestureRecognizer, shouldRecognizeSimultaneouslyWith otherGestureRecognizer: UIGestureRecognizer) -> Bool {
// ...
}
Я создал уменьшенный пример проекта, который должен более четко демонстрировать сценарий. Любые предложения кода приветствуются!
https://github.com/Darchmare/SlidePanel-iOS