Как создать эффект анимации SwiftUI из модели?

У меня есть объект модели, у которого есть опубликованное свойство displayMode, которое обновляется асинхронно через события с сервера.

class RoomState: NSObject, ObservableObject  {
    public enum DisplayMode: Int {
        case modeA = 0
        case modeB = 1
        case modeC = 2
    }
    @Published var displayMode = DisplayMode.modeA

    func processEventFromServer(newValue: DisplayMode) {
        DispatchQueue.main.async {
            self.displayMode = newValue
        }
    }
}

Затем у меня есть представление, которое отображает этот режим, помещая какое-то изображение в определенное место в зависимости от значения.

struct RoomView: View {
    @ObservedObject var state: RoomState
    var body: some View {
       VStack {
           ...
           Image(systemName: "something")
               .offset(x: state.displayMode.rawValue * 80, y:0)
       }
    }
}

Этот код работает нормально, но я хочу анимировать движение при изменении значения. Если я изменю значение в блоке кода внутри представления, я могу использовать withAnimation {..} для создания эффекта анимации, но я не могу понять, как это сделать из модели.


person Satoshi Nakajima    schedule 30.04.2021    source источник
comment
У вас должна быть возможность использовать неявную анимацию: .offset(x: state.displayMode.rawValue * 80, y:0).animation()   -  person aheze    schedule 01.05.2021
comment
Не могли бы вы просто сделать DispatchQueue.main.async { withAnimation { self.displayMode = newValue } }?   -  person George_E    schedule 01.05.2021
comment
@aheze, ваш подход работает! Большое тебе спасибо.   -  person Satoshi Nakajima    schedule 01.05.2021
comment
@George_E, вы не можете использовать withAnimation из Модели. withAnimation доступен только внутри View.   -  person Satoshi Nakajima    schedule 01.05.2021
comment
@SatoshiNakajima Вы можете использовать его где угодно, если вы импортировали SwiftUI.   -  person George_E    schedule 01.05.2021


Ответы (1)


Это ответ, спасибо @aheze. С .animation () это представление изображения всегда анимируется при изменении state.displayMode.

struct RoomView: View {
    @ObservedObject var state: RoomState
    var body: some View {
       VStack {
           ...
           Image(systemName: "something")
               .offset(x: state.displayMode.rawValue * 80, y:0)
               .animation(.easeInOut)
       }
    }
}
person Satoshi Nakajima    schedule 01.05.2021