Pull to refresh

Comments 10

То, что нижние углы тоже закруглились, вас совсем не смущает?

Привет! Спасибо за комментарий!

Действительно, закругление происходит у всех углов из-за cornerRadius. Более корректно будет использовать UIBezierPath

UFO just landed and posted this here

В начале статьи есть отссылка к Sheets, которые появились в SDK iOS 15. Я дополнил этот блок ссылкой на HIG, в котором Apple показывает, когда использовать Sheets уместно

Простыми словами Bottom Sheet - это "шторка, которая выезжает снизу". Такая "шторка" есть системных приложениях: Apple Maps, Stocks, Voice Memos и т.д.

Apple Maps, Stocks, Voice Memos
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. Константы подобраны на коленке. Их и вид функции можно подобрать под себя

Замедленное завершение транзишена
Замедленное завершение транзишена
Sign up to leave a comment.