Comments 10
То, что нижние углы тоже закруглились, вас совсем не смущает?
Привет! Спасибо за комментарий!
Действительно, закругление происходит у всех углов из-за cornerRadius. Более корректно будет использовать UIBezierPath
view.layer.maskedCorners = [.layerMinXMinYCorner, .layerMaxXMinYCorner]
Учёл ваше замечание в финальной ветке проекта, спасибо!
В начале статьи есть отссылка к Sheets, которые появились в SDK iOS 15. Я дополнил этот блок ссылкой на HIG, в котором Apple показывает, когда использовать Sheets уместно
Простыми словами Bottom Sheet - это "шторка, которая выезжает снизу". Такая "шторка" есть системных приложениях: Apple Maps, Stocks, Voice Memos и т.д.
Bottom Sheet в статье отличается от Sheets SDK iOS. В SDK iOS используются фиксированные размеры (т.н. detents): половина и полный экран. В предоставленном мною решении размер Bottom Sheet определяется размером контента
Привет!
А как вы обычно решаете проблему с тем, что анимация при интерактивном закрытии бывает "багованная" (то очень быстрая, то очень медленная) в зависимости от того, насколько транзишн завершен?
Пример:
Если отменить интерактивный транзишн, вызвав функцию cancel у UIPercentDrivenInteractiveTransition, на старте (~ 0.1 percentComplete), то экран будто без анимации (быстрая анимация) возвращается назад к стартовому фрейму.
Если же отменить в середине, то экран уже возвращается к стартовому фрейму без скачков.
Привет! Хороший вопрос, в статье этому не уделяется внимания
Для интерактивного транзишена используется UIPercentDrivenInteractiveTransition. У него есть два свойства, которые влияют на завершение транзишена: completionSpeed и completionCurve
В момент, когда транзишен заканчивается, мы можем изменить эти параметры и повлиять на скорость, чтобы избежать подергиваний в конце. Ниже приведу пример, изменяя только completionSpeed в интерактивном pop транзишене navigation controller'a
private func endTransition(isCancelled: Bool) {
setCompletionSpeedIfNeeded(threshold: 0.5, factor: 1.5)
if isCancelled {
transition?.cancel()
} else {
transition?.finish()
}
transition = nil
}
private func setCompletionSpeedIfNeeded(threshold: Double, factor: Double) {
guard
let transition = transition,
transition.percentComplete < threshold
else { return }
transition.completionSpeed = max(pow(transition.percentComplete, factor), 0.01)
}
Скорость транзишена теперь зависит от percentComplete. Константы подобраны на коленке. Их и вид функции можно подобрать под себя
Круто, спасибо!
Корректная ссылка на интерактивный pop транзишен
Bottom Sheet, перейдём на «ты»?