Per cominciare, MVVM non ha il concetto del controller. Quindi, presumo che quando parli di ViewController intendi la vista, ad es. la forma e tutti gli elementi visivi.
Torna alle tue domande:
Q1:
Who should be responsible of the animation?
Il ViewModel è responsabile del trigger dell'animazione. In realtà, dovresti vederlo in un modo più ampio. Pensa al caso in cui, in futuro, decidi che l'animazione non è l'effetto giusto. Che tipo di elementi visivi utilizzerai è parte della vista. ViewModel dovrebbe segnalare la vista per attivare una sorta di segnali visivi. Quindi la vista lo fa accadere.
The animations happens manipulating constraints that the ViewController is holding, should the ViewModel be responsible for that?
Che tipo di vincoli? Intendi cose che riguardano l'interfaccia utente? Come per quanto tempo sarà il campo di testo? Se è così, allora la View si occupa di questi.
Also, the search bar has a boolean, indicating whether it's open or closed, who should hold it? The ViewModel or the ViewController?
Questa è una proprietà nel ViewModel. La vista torna a un evento in ViewModel e quando l'utente tocca il pulsante di ricerca, l'evento nel ViewModel cambia invia un segnale alla vista per cambiare lo stato del campo di testo (comprimi / espandi).
Q2:
What should be the role of a ViewModel of the searchfield, take events from it, pass them to the model and then notify the ViewController?
Sì, tutte queste e una cosa più importante: preparare i risultati dalla ricerca (molto probabilmente recuperata dal modello) in una forma che la vista è in grado di presentare
Q3:
This app will receive information from services, who should make the call to the services? The ViewController, the ViewModel or the Model?
Può essere il Modello o il ViewModel a seconda del tipo di servizi che si sta guardando e di come si progetta il Modello / ViewModel. Si parla di "effettuare la chiamata" e non di "ricevere" quindi penso che sia più ragionevole consentire al modello di avviare la sequenza di aggiornamento / informazione del ViewModel e quindi del ViewModel della vista