
рдЫрд╣ рдорд╣реАрдиреЗ рдкрд╣рд▓реЗ, рд╣рдордиреЗ рдПрдХ рд╕рдмрд╕реЗ рдкреНрд░рднрд╛рд╡рд╢рд╛рд▓реА рд╡рд┐рд╢реЗрд╖рддрд╛ -
рд▓рд╛рдЗрд╡ рд╕реНрдЯреНрд░реАрдорд┐рдВрдЧ рдХреЛ рдкреЗрд╢ рдХрд┐рдпрд╛ ред рдЕрдиреНрдп рдмрд╛рддреЛрдВ рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдпрд╣ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ рдХреЛ рдЙрдкрд╣рд╛рд░ рдХреЗ рд░реВрдк рдореЗрдВ рдЕрдкрдиреЗ рдкрд╕рдВрджреАрджрд╛ рд╕реНрдЯреНрд░реАрдорд░ рдХреЗ рд▓рд┐рдП рдЖрднрд╛рд░ рд╡реНрдпрдХреНрдд рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред рд╣рдо рдЗрди рдЙрдкрд╣рд╛рд░реЛрдВ рдХреЛ рдпрдерд╛рд╕рдВрднрд╡ рдЙрдЬреНрдЬреНрд╡рд▓ рдФрд░ рдЖрдХрд░реНрд╖рдХ рдмрдирд╛рдирд╛ рдЪрд╛рд╣рддреЗ рдереЗ, рдЗрд╕рд▓рд┐рдП рд╣рдордиреЗ рдЙрдиреНрд╣реЗрдВ рдкреБрдирд░реНрдЬреАрд╡рд┐рдд рдХрд░рдиреЗ рдХрд╛ рдлреИрд╕рд▓рд╛ рдХрд┐рдпрд╛ - рджреВрд╕рд░реЗ рд╢рдмреНрджреЛрдВ рдореЗрдВ, рдЪреЗрддрдиред рдФрд░ рдЗрд╕реЗ рдФрд░ рднреА рджрд┐рд▓рдЪрд╕реНрдк рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдордиреЗ рд╣рд░ рдХреБрдЫ рд╣рдлреНрддреЛрдВ рдореЗрдВ рдЙрдкрд╣рд╛рд░ рдФрд░ рдПрдирд┐рдореЗрд╢рди рдЕрдкрдбреЗрдЯ рдХрд░рдиреЗ рдХреА рдпреЛрдЬрдирд╛ рдмрдирд╛рдИред
iOS рдЗрдВрдЬреАрдирд┐рдпрд░реЛрдВ рдиреЗ рдЕрдиреБрдорд╛рди рд▓рдЧрд╛рдпрд╛ рд╣реЛрдЧрд╛ рдХрд┐ рдХрд╛рд░реНрдп рдХреА рдорд╛рддреНрд░рд╛ рдХреНрдпрд╛ рд╣реИ: рдкреБрд░рд╛рдиреЗ рдХреЛ рд╣рдЯрд╛рдиреЗ рдФрд░ рдирдП рдПрдирд┐рдореЗрд╢рди рдЬреЛрдбрд╝рдиреЗ рдХреЗ рд▓рд┐рдП, рдХреНрд▓рд╛рдЗрдВрдЯ рдХреА рдУрд░ рд╕реЗ рдХрдИ рдХрд╛рд░реНрдп рдХрд░рдирд╛ рдЖрд╡рд╢реНрдпрдХ рд╣реИред рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдПрдВрдбреНрд░реЙрдЗрдб рдФрд░ рдЖрдИрдУрдПрд╕ рдЯреАрдореЛрдВ рдХреЛ рдкреНрд░рддреНрдпреЗрдХ рд░рд┐рд▓реАрдЬрд╝ рдореЗрдВ рд╢рд╛рдорд┐рд▓ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП, рдФрд░, рдРрдк рд╕реНрдЯреЛрд░ рдореЗрдВ рдЕрдкрдбреЗрдЯ рдХреЛ рдЕрдиреБрдореЛрджрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХ рд╕рдордп рдХреЗ рд╕рд╛рде, рдЗрд╕рдХрд╛ рдорддрд▓рдм рд╣реИ рдХрд┐ рдЕрдкрдбреЗрдЯ рдХрд┐рдП рдЧрдП рдПрдирд┐рдореЗрд╢рди рдХреЗ рд╕рд╛рде рдкреНрд░рддреНрдпреЗрдХ рд░рд┐рд▓реАрдЬрд╝ рдХреЗ рд▓реЙрдиреНрдЪ рдореЗрдВ рдХрдИ рджрд┐рди рд▓рдЧ рд╕рдХрддреЗ рд╣реИрдВред рд╣рд╛рд▓рд╛рдВрдХрд┐, рд╣рдо рдЗрд╕ рд╕рдорд╕реНрдпрд╛ рдХреЛ рд╣рд▓ рдХрд░рдиреЗ рдореЗрдВ рдХрд╛рдордпрд╛рдм рд░рд╣реЗ, рдФрд░ рдЕрдм рдореИрдВ рдЖрдкрдХреЛ рдмрддрд╛рдКрдВрдЧрд╛ рдХрд┐ рдХреИрд╕реЗред
рд╕рдорд╛рдзрд╛рди рд╡рд╛рд╕реНрддреБрдХрд▓рд╛
рдЙрд╕ рд╕рдордп рддрдХ, рд╣рдореЗрдВ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдкрддрд╛ рдерд╛ рдХрд┐
рдПрдбреЛрдм рдЖрдлреНрдЯрд░ рдЗрдлреЗрдХреНрдЯреНрд╕ рдПрдирд┐рдореЗрд╢рди (рдмрд╛рдж рдореЗрдВ - рдПрдПрдИ) рдХреЛ рдХреИрд╕реЗ
рдирд┐рд░реНрдпрд╛рдд рдХрд░рдирд╛ рд╣реИ, рд▓реЛрдЯреА рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ
рд╣рдорд╛рд░реЗ iOS рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЗ рд▓рд┐рдП рд╕рдордЭ рдореЗрдВ рдЖрддрд╛ рд╣реИ ред рдЗрд╕ рдмрд╛рд░ рд╣рдо рдереЛрдбрд╝рд╛ рдЖрдЧреЗ рдмрдврд╝реЗ: рд╣рдордиреЗ рд╕рд░реНрд╡рд░ рдкрд░ рд╕рднреА рдкреНрд░рд╛рд╕рдВрдЧрд┐рдХ рдПрдирд┐рдореЗрд╢рдиреЛрдВ рдХреЛ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░рдиреЗ рдФрд░ рдЖрд╡рд╢реНрдпрдХрддрд╛рдиреБрд╕рд╛рд░ рдбрд╛рдЙрдирд▓реЛрдб рдХрд░рдиреЗ рдХрд╛ рдирд┐рд░реНрдгрдп рд▓рд┐рдпрд╛ред

рдЗрд╕ рддрд░рд╣ рд╕реЗ рдкреНрд░рд╛рдкреНрдд рд╣рдорд╛рд░реЗ рдЖрд╡реЗрджрди рдореЗрдВ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдПрдиреАрдореЗрд╢рди рдХрд╛ рдПрдХ рдЙрджрд╛рд╣рд░рдг:
рд╣рд╛рд▓рд╛рдВрдХрд┐, рдЗрд╕ рдкреЛрд╕реНрдЯ рдореЗрдВ рдПрдХ рдЙрджрд╛рд╣рд░рдг рдХреЗ рд░реВрдк рдореЗрдВ рдореИрдВ рдПрдХ рд╕рд╛рдзрд╛рд░рдг рдПрдиреАрдореЗрд╢рди рд▓реЗрдЧрд╛ рдЬреЛ рдореИрдВрдиреЗ рдЦреБрдж рдмрдирд╛рдпрд╛ рдерд╛ред рдпрд╣ рд░реВрдк рдореЗрдВ рд░рдЪрдирд╛рддреНрдордХ рдирд╣реАрдВ рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ рд╣рдорд╛рд░реЗ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХреЛ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд╛рдлреА рдЙрдкрдпреБрдХреНрдд рд╣реИред
рдирд┐рд░реНрдпрд╛рдд рдПрдирд┐рдореЗрд╢рди
рдПрдПрдИ рдкрд░рд┐рдпреЛрдЬрдирд╛ рдЬреЛ рдореИрдВ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реВрдВ, рдЙрд╕реЗ
рдЧреАрдерд╣рдм рдкрд░ рдЕрдиреНрдп рд╕реНрд░реЛрддреЛрдВ рдХреЗ рд╕рд╛рде рдорд┐рд▓ рд╕рдХрддрд╛
рд╣реИ ред рдЗрд╕рд▓рд┐рдП,
_raw/animations/Fancy/Fancy.aep
рдкрд░ рд╕реНрдерд┐рдд рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдХреЛ рдЦреЛрд▓рдиреЗ рдкрд░, рдЖрдкрдХреЛ рдПрдХ рд╡рд┐рдВрдбреЛ рджрд┐рдЦрд╛рдИ рджреЗрдЧреА:

рдЕрдм рдореИрдВ AAE рдореЗрдВ рдПрдирд┐рдореЗрд╢рди рдмрдирд╛рдиреЗ рдХреА рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╛рдд рдирд╣реАрдВ рдХрд░ рд░рд╣рд╛ рд╣реВрдВ, рд▓реЗрдХрд┐рди
Bodymovin рдкреНрд▓рдЧрдЗрди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ iOS рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЗ рд▓рд┐рдП рдЙрдкрдпреБрдХреНрдд рдкреНрд░рд╛рд░реВрдк рдореЗрдВ рдореМрдЬреВрджрд╛ рдПрдирд┐рдореЗрд╢рди рдХрд╛ рдЖрдпрд╛рдд рдХреИрд╕реЗ рдХрд░реЗрдВред
рдкреНрд▓рдЧрдЗрди рд╕реНрдерд╛рдкрд┐рдд рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж,
рдореЗрдиреВ рд╕реЗ рд╡рд┐рдВрдбреЛ / рдПрдХреНрд╕рдЯреЗрдВрд╢рди / рдмреЛрдбреЛрдореАрд╡рд┐рди рдХрд╛ рдЪрдпрди рдХрд░рдХреЗ рдЗрд╕реЗ
рдЦреЛрд▓реЗрдВ :

Bodymovin рд╡рд┐рдВрдбреЛ рджрд┐рдЦрд╛рдИ рджреЗрдЧреА, рдЬрд┐рд╕рдореЗрдВ рдЖрдк рдирд┐рд░реНрдпрд╛рдд рдХреЗ рд▓рд┐рдП рдПрдиреАрдореЗрд╢рди рдХрд╛ рдЪрдпрди рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдкрд░рд┐рдгрд╛рдорд╕реНрд╡рд░реВрдк рдлрд╝рд╛рдЗрд▓ рд╕рд╣реЗрдЬрдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдлрд╝реЛрд▓реНрдбрд░ рдФрд░ рдирд┐рд░реНрдпрд╛рдд рдлрд╝рд╛рдЗрд▓ рдЦреЛрд▓реЗрдВ:

рдПрдиреАрдореЗрд╢рди рд╕реЗрдЯрд┐рдВрдЧреНрд╕ рдореЗрдВ, рд╣рдо рдмреЛрдбрд┐рдореЛрд╡рд┐рди рдХреЛ JSON рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рд╕рдВрд╕рд╛рдзрди рд╢рд╛рдорд┐рд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкреВрдЫ рд╕рдХрддреЗ рд╣реИрдВред

рдЕрдВрдд рдореЗрдВ,
рд░реЗрдВрдбрд░ рдмрдЯрди рджрдмрд╛рдХрд░, рд╣рдо рдПрдХ рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рдЪрдпрдирд┐рдд рдПрдирд┐рдореЗрдЯреЗрдб рд░рдЪрдирд╛ рдХреЛ рдирд┐рд░реНрдпрд╛рдд рдФрд░ рд╕рд╣реЗрдЬрддреЗ рд╣реИрдВред
рд╕рд░реНрд╡рд░ рдкрд░ рдПрдирд┐рдореЗрд╢рди рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░рдирд╛
рдорд╛рди рд▓реЗрдВ рдХрд┐ рд╣рдо рдПрдирд┐рдореЗрдЯреЗрдб JSON рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреЛ рд╡реЗрдм рд╕рд░реНрд╡рд░ рдкрд░ рдкреНрд░рджрд╛рди рдХрд░рддреЗ рд╣реИрдВред рд╣рдорд╛рд░реЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рд╕рд╛рджрдЧреА рдХреЗ рд▓рд┐рдП, рдореИрдВрдиреЗ рдЙрдиреНрд╣реЗрдВ рдЧреАрдерд╣рдм рдкрд░ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рд░рд┐рдкреЙрдЬрд┐рдЯрд░реА рдореЗрдВ рд░рдЦрд╛ред рдПрдирд┐рдореЗрд╢рди рдпрд╣рд╛рдБ рдЙрдкрд▓рдмреНрдз рд╣реИрдВ:
рдЖрдзрд╛рд░ рд▓рд┐рдВрдХ
https://raw.githubusercontent.com/chupakabr/server-provided-animations/master/_raw/rendered-animations/рдПрдирд┐рдореЗрд╢рди рдЖрдИрдбреА:
clouds.json
fireworks.json
рдиреЛрдЯ: рдПрдирд┐рдореЗрд╢рди рдХреЗ рд▓рд┐рдП рд╕реНрд╡рд┐рдлреНрдЯ рд╡реЗрдм рд╕рд░реНрд╡рд░ рдХреА рддрд▓рд╛рд╢ рд╣реИ? рд╕рдорд╛рдзрд╛рди рдпрд╣рд╛рдБ рдЙрдкрд▓рдмреНрдз рд╣реИ , рдФрд░ рдПрдХ рд╡рд┐рд╕реНрддреГрдд рд╡рд┐рд╡рд░рдг рдЗрд╕ рд▓реЗрдЦ рдореЗрдВ рд╣реИ ред
рдЗрд╕рд▓рд┐рдП, рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдПрдирд┐рдореЗрд╢рди рдХреЗ рд╕рд╛рде рдПрдХ рдХрд╛рд░реНрдпрд╢реАрд▓ рд╕рд░реНрд╡рд░ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдпрд╣ рд╕рдмрд╕реЗ рд░реЛрдорд╛рдВрдЪрдХ рднрд╛рдЧ рдкрд░ рдЖрдЧреЗ рдмрдврд╝рдиреЗ рдХрд╛ рд╕рдордп рд╣реИ: рд╕реНрдХреНрд░реАрди рдкрд░ рдПрдирд┐рдореЗрд╢рди рдкреНрд░рджрд╛рди рдХрд░рдирд╛ред
рдПрдиреАрдореЗрд╢рди рдкреНрд░рджрд░реНрд╢рди
рдЕрдм рдореИрдВ рдЖрдкрдХреЛ
рд╣рдорд╛рд░реЗ iOS рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЗ рд▓рд┐рдП рдПрдХ
рдбреЗрдореЛ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдЦреЛрд▓рдиреЗ рдХреА рд╕рд▓рд╛рд╣ рджреЗрддрд╛ рд╣реВрдВ, рдХреНрдпреЛрдВрдХрд┐ рдЗрд╕рдореЗрдВ рд╕рднреА рдЖрд╡рд╢реНрдпрдХ рдХреЛрдб рдФрд░ рд╕реЗрдЯрд┐рдВрдЧреНрд╕ рд╣реИрдВред
рдПрдирд┐рдореЗрд╢рди рдбрд╛рдЙрдирд▓реЛрдб рдХрд░реЗрдВ
рдпрд╣ рджреЗрдЦрддреЗ рд╣реБрдП рдХрд┐ рдбреЗрдЯрд╛ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП REST API рдкрд╣рд▓реЗ рд╕реЗ рддреИрдпрд╛рд░ рд╣реИ, рдбреЗрдЯрд╛ рдкреНрд░рджрд╛рддрд╛ рдХреЗ рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдФрд░ рдЗрд╕рдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЛ рдЬреЛрдбрд╝рдиреЗ рдХрд╛ рд╕рдордп рд╣реИ, рдЬреЛ рд╕рд░реНрд╡рд░ рд╕реЗ рдбреЗрдЯрд╛ рдбрд╛рдЙрдирд▓реЛрдб рдХрд░рддрд╛ рд╣реИ:
import Lottie protocol AnimationsProviderProtocol { typealias Completion = (_ animation: LOTComposition?) -> Void func loadAnimation(byId id: String, completion: @escaping Completion) } final class ServerAnimationProvider: AnimationsProviderProtocol { private let endpoint: URL init(endpoint: URL) { self.endpoint = endpoint } func loadAnimation(byId id: String, completion: @escaping Completion) { let path = "/\(id).json" guard let animationUrl = URL(string: path, relativeTo: self.endpoint) else { completion(nil) return } URLSession.shared.invalidateAndCancel() let task = URLSession.shared.dataTask(with: animationUrl) { (data, response, error) in guard error == nil, let data = data, let json = self.parseJson(from: data) else { completion(nil) return } let animation = LOTComposition(json: json) completion(animation) } task.resume() } private func parseJson(from data: Data?) -> [AnyHashable : Any]? { guard let data = data else { return nil } do { let json = try JSONSerialization.jsonObject(with: data, options: []) as? [AnyHashable : Any] return json } catch { return nil } } }
рдпрд╣ рдбреЗрдЯрд╛ рдкреНрд░реЛрд╡рд╛рдЗрдбрд░ рд╡рд░реНрдЧ рд╣рдореЗрдВ рдЕрдиреБрд░реЛрдз рдкрд░ рд╕рд░реНрд╡рд░ рд╕реЗ JSON рдкреНрд░рд╛рд░реВрдк рдореЗрдВ рдПрдирд┐рдореЗрд╢рди рдбрд╛рдЙрдирд▓реЛрдб рдХрд░рдиреЗ рдФрд░ рдЙрдиреНрд╣реЗрдВ рдпреВрдЖрдИ рдкреНрд░рджрд╛рди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдореЗрдореЛрд░реА рдореЗрдВ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред рдорд╛рди рд▓реАрдЬрд┐рдП рдХрд┐ рд╣рдо MVVM рдкреИрдЯрд░реНрди рдХрд╛ рдкрд╛рд▓рди рдХрд░рддреЗ рд╣реИрдВ - рддреЛ
ViewModel
рдЗрдХрд╛рдИ рдореЗрдВ рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдЖрд╕рд╛рди рд╣реИ:
// ... private let animationProvider: AnimationsProviderProtocol private(set) var animationModel: LOTComposition? // тАж func loadAnimation(byId animationId: String) { self.animationProvider.loadAnimation(byId: animationId) { [weak self] (animationModel) in self?.animationModel = animationModel } } // ...
рдЬрдм рдпрд╣ рдХрд┐рд╕реА рдЧреИрд░-рдЦрд╛рд▓реА JSON рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЗ рд╕рд╛рде рд╕рд░реНрд╡рд░ рд╕реЗ рд╕рд╣реА HTTP рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдкреНрд░рд╛рдкреНрдд рдХрд░рддрд╛ рд╣реИ, рддреЛ
ViewModel
рдЪрдпрдирд┐рдд рдПрдиреАрдореЗрд╢рди рдХреА рд╕рдВрдкрддреНрддрд┐ рдХреЛ рдЕрдкрдбреЗрдЯ рдХрд░рддрд╛ рд╣реИред рдПрдирд┐рдореЗрд╢рди рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЗрд╕ рдбреЗрдЯрд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдкреНрд░рд╕реНрддреБрддрд┐ рдкрд░рдд рджреНрд╡рд╛рд░рд╛ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред
рдкреНрд░рд╕реНрддреБрддрд┐ рдкрд░рдд
рдЕрдм рд╣рдо рдПрдиреАрдореЗрд╢рди рдбреЗрдЯрд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП
ViewModel
рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдЗрд╕реЗ рдпреВрдЖрдИ рдкрд░ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдмрд┐рд▓реНрдЯ-рдЗрди рдкрд░ рдЯреИрдк рдПрдХреНрд╢рди рд╣реИрдВрдбрд▓рд░ рдмрдЯрди рд╕реЗ рдЬреБрдбрд╝рд╛ рд╣реБрдЖ рд╣реИ:
class ViewController: UIViewController { // ... @IBOutlet weak var animationContainer: UIView! override func viewDidLoad() { super.viewDidLoad() // ... self.animationView = { let view = LOTAnimationView(frame: self.animationContainer.bounds) self.animationContainer.addSubview(view) return view }() } @IBAction func onPlayAnimationAction(_ sender: Any) { self.animationView.stop() self.animationView.sceneModel = self.viewModel.animationModel self.animationView.play() } }
рдЬрдм рдПрдХ рдмрдЯрди рдкрд░ рдХреНрд▓рд┐рдХ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ LOTAnimationView рдХрд╛ рдЙрджрд╛рд╣рд░рдг
ViewModel
рдХреЗ рдирд╡реАрдирддрдо рдбреЗрдЯрд╛ рдХреЗ рд╕рд╛рде рдЕрдкрдбреЗрдЯ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред
рдпрд╣рд╛рдБ рдпрд╣ рдХреИрд╕рд╛ рджрд┐рдЦрддрд╛ рд╣реИ:
рд╡рд╣ рд╕рдм рд╣реИред рдЕрдм рдПрдкреНрд▓рд┐рдХреЗрд╢рди рд╣рдорд╛рд░реЗ REST API рд╕реЗ рдбрд╛рдЙрдирд▓реЛрдб рдХрд┐рдП рдЧрдП рдПрдиреАрдореЗрд╢рди рдХреЛ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рддрд╛ рд╣реИ
(рд╕рд░реНрд╡рд░ рд╕реЗ)ред
рдпреБрдХреНрддрд┐рдпрд╛рдБ рдФрд░ рд╕реАрдорд╛рдПрдБ
рдЯреНрд░рд┐рдХреНрд╕:
- рдПрдПрдИ рд░рд╛рд╕реНрдЯрд░ рдФрд░ рд╡реЗрдХреНрдЯрд░ рдЫрд╡рд┐рдпреЛрдВ рд╕рд╣рд┐рдд рдЕрдзрд┐рдХрд╛рдВрд╢ рдкреНрд░рдХрд╛рд░ рдХреА рд╡рд╕реНрддреБрдУрдВ рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рддрд╛ рд╣реИ;
- Bodymovin рдЖрдкрдХреЛ рдмреЗрд╕ J64 рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЕрдВрддрд┐рдо JSON рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рд╕рднреА рд╕рдВрд╕рд╛рдзрдиреЛрдВ рдХреЛ рдПрдореНрдмреЗрдб рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ, рдФрд░ рдпрд╣ рдЖрдкрдХреЛ рдХреНрд▓рд╛рдЗрдВрдЯ рд╕рд╛рдЗрдб рдкрд░ рдЕрд▓рдЧ рд╕реЗ рд▓реЛрдбрд┐рдВрдЧ рд╕рдВрд╕рд╛рдзрдиреЛрдВ рд╕реЗ рдмрдЪрдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ;
- рдЖрдк рдпрд╛ рддреЛ AAE рдореЗрдВ рдПрдХ рд╡реЗрдХреНрдЯрд░ рдореЗрдВ рд╕реАрдзреЗ рдЖрдХрд░реНрд╖рд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдпрд╛ рдмрд╕ Adobe Illustrator рдкреНрд░рд╛рд░реВрдк рдореЗрдВ рд╡реЗрдХреНрдЯрд░ рдЫрд╡рд┐рдпреЛрдВ рдХреЛ рдЖрдпрд╛рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред
рджреБрд░реНрднрд╛рдЧреНрдп рд╕реЗ, рдореИрдВ рдПрд╕рд╡реАрдЬреА рдлрд╛рдЗрд▓реЛрдВ рдХреЛ рдПрдПрдИ рдореЗрдВ рдЖрдпрд╛рдд рдХрд░рдиреЗ рдореЗрдВ рдЕрд╕рдорд░реНрде рдерд╛ (рдореИрдВрдиреЗ рдХреЛрд╢рд┐рд╢ рдХреА!)ред
рдЖрдк рдЗрд╕
рджрд┐рд▓рдЪрд╕реНрдк рд▓реЗрдЦ рд╕реЗ рдореЗрд░реЗ рд╕рд╣рдпреЛрдЧреА
рд░реЗрдбреЛрд╕рд▓рд╛ рд╕рд┐рд╕реЗрд╡рд╛ рдХреА рдЪрд╛рд▓ рдФрд░ рд╕рдВрднрд╛рд╡рд┐рдд рд╕рдорд╕реНрдпрд╛рдУрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЕрдзрд┐рдХ рдЬрд╛рди рд╕рдХрддреЗ рд╣реИрдВред
рдирд┐рд╖реНрдХрд░реНрд╖
рддреЛ, рд╕рд░реНрд╡рд░ рд╕реЗ рдбрд╛рдЙрдирд▓реЛрдб рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рдПрдирд┐рдореЗрд╢рди рд╣рдореЗрдВ рдХреНрдпрд╛ рджреЗрддреЗ рд╣реИрдВ? рдЗрд╕ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХрд╛ рд╕рдмрд╕реЗ рд╕реНрдкрд╖реНрдЯ рд▓рд╛рдн рдПрдиреАрдореЗрд╢рди рдЕрджреНрдпрддрди рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдореЗрдВ рд╕рднреА рдкреНрд░рддрд┐рднрд╛рдЧрд┐рдпреЛрдВ рдХреЛ рд╕рд╛рдЭрд╛ рдХрд░рдиреЗ рдХреА рдХреНрд╖рдорддрд╛ рд╣реИред рджреВрд╕рд░реЗ рд╢рдмреНрджреЛрдВ рдореЗрдВ, рдПрдХ рдирдпрд╛ рд╢рд╛рдВрдд рдПрдиреАрдореЗрд╢рди рдЬрд╛рд░реА рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдбрд┐рдЬрд╛рдЗрдирд░реЛрдВ рдХреЛ рдХреЗрд╡рд▓ рдЙрдЪрд┐рдд JSON рдлрд╝рд╛рдЗрд▓ рдХреЗ рд╕рд╛рде рд╕рд░реНрд╡рд░ рдЯреАрдо рдкреНрд░рджрд╛рди рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдХреНрд▓рд╛рдЗрдВрдЯ рдкрд░ рдПрдиреАрдореЗрд╢рди рдХреЛ рд╣рдЯрд╛рдиреЗ рдХреЗ рд▓рд┐рдП, рдмрд╕ рдЗрд╕реЗ рд╕рд░реНрд╡рд░ рд╕реЗ рд╣рдЯрд╛ рджреЗрдВред рдЖрд╕рд╛рди рдФрд░ рддреЗрдЬред
рдпрд╣ рднреА рдмрд╣реБрдд рдЕрдЪреНрдЫрд╛ рд╣реИ рдХрд┐ рдХреНрд▓рд╛рдЗрдВрдЯ-рд╕рд░реНрд╡рд░ рдкреНрд░реЛрдЯреЛрдХреЙрд▓, рд╕рд░реНрд╡рд░ рдХреЛрдб, рдФрд░ рдПрдиреАрдореЗрд╢рди рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреЛ рд╕реАрдзреЗ рдХреНрд▓рд╛рдЗрдВрдЯ рдкрд░ рдкрд░рд┐рд╡рд░реНрддрди рдХрд┐рдП рдмрд┐рдирд╛ рд╕рднреА рд╕рдорд░реНрдерд┐рдд рдкреНрд▓реЗрдЯрдлрд╛рд░реНрдореЛрдВ (iOS, Android, рд╡реЗрдм) рдкрд░ рд╕рдорд╛рди рдХрд╛рд░реНрдп рд▓рд╛рдЧреВ рдХрд┐рдП рдЬрд╛ рд╕рдХрддреЗ рд╣реИрдВред
рд╡рд╣ рд╕рдм рд╣реИред рдЖрдкрдХрд╛ рдзреНрдпрд╛рди рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рдж!
рдЙрдкрдпреЛрдЧреА рд▓рд┐рдВрдХ