Любой способ вызвать withAnimation при изменении значения @Binding var? - PullRequest
1 голос
/ 18 января 2020

Я создаю анимационную кнопку прогресса, которая отображает прогресс загрузки, а затем расширяется, чтобы показать текст кнопки после завершения загрузки (немного похоже на кнопки App Store).

У меня есть пользовательский вид кнопки, который принимает @ Связывание со значением внешнего прогресса CGFloat. Я знаю, что могу установить значение прогресса просмотра через init, но это, кажется, не приближает меня. Ход выполнения, конечно, видоизменяется за пределами пользовательского представления кнопок. Мне бы хотелось, чтобы кнопка автоматически обрабатывала изменения значения прогресса и расширялась автоматически, когда прогресс достигнет 1,0.

Я использую явную анимацию для анимации формы кнопки (с помощью нескольких частных @State свойство изменяется внутри с анимацией). Проблема в том, что мне нужно иметь возможность вызывать код, который устанавливает эти свойства @State при изменении значения прогресса @Binding. Я не вижу никакого способа сделать это без явных вызовов withAnimation, происходящих за пределами представления кнопок. Я не хочу использовать неявную анимацию, потому что это вызывает проблемы при изменении источника кнопки. Демонстрации, которые я нашел, просто устанавливают состояния изнутри кнопки, через .onTap.

В идеале, был бы способ вызвать функцию при изменении значения @Binding. Я видел что-то об использовании издателя, но это кажется излишним? Если это единственный вариант, то мне интересно, смогу ли я как-то сделать это в частном порядке в представлении кнопки и все же просто передать $ progress кнопке (для максимального повторного использования)?

1 Ответ

0 голосов
/ 18 января 2020

Для этого есть API

@available(iOS 13.0, OSX 10.15, tvOS 13.0, watchOS 6.0, *)
extension Binding {

    ...

    /// Create a new Binding that will apply `animation` to any changes.
    public func animation(_ animation: Animation? = .default) -> Binding<Value>
}

, поэтому можно сделать что-то вроде

struct ContentView: View {

  @State private var value = 0

  var body: some View {
    // ...
    ChildView(value: $value.animation(.linear))
    // ...
  }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...