IOS рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдореЗрдВ рд╕рд░реНрд╡рд░-рдкреНрд░рджрд╛рди рдХреА рдЧрдИ рдПрдирд┐рдореЗрд╢рди



рд╣рд╛рдп рд╕рдм рд▓реЛрдЧ! рд▓рдЧрднрдЧ рдЫрд╣ рдорд╣реАрдиреЗ рдкрд╣рд▓реЗ рд╣рдордиреЗ рдПрдХ рд╕рдмрд╕реЗ рд░реЛрдорд╛рдВрдЪрдХ рдлреАрдЪрд░ рд▓реЙрдиреНрдЪ рдХрд┐рдпрд╛: рд▓рд╛рдЗрд╡ рд╕реНрдЯреНрд░реАрдорд┐рдВрдЧ ред рдЗрд╕рдХреА рдореБрдЦреНрдп рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдореЗрдВ рд╕реЗ рдПрдХ рдпрд╣ рд╣реИ рдХрд┐ рджрд░реНрд╢рдХ рдЕрдкрдиреА рдкреНрд░рд╢рдВрд╕рд╛ рд╡реНрдпрдХреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЕрдкрдиреЗ рдкрд╕рдВрджреАрджрд╛ рд╕реНрдЯреНрд░реАрдорд░ рдХреЛ рдЙрдкрд╣рд╛рд░ рднреЗрдЬ рд╕рдХрддреЗ рд╣реИрдВред рд╣рдо рдЙрдкрд╣рд╛рд░реЛрдВ рдХреЛ рдлреИрдВрд╕реА рдФрд░ рдЬрд┐рддрдирд╛ рд╕рдВрднрд╡ рд╣реЛ рдЙрддрдирд╛ рдЖрдХрд░реНрд╖рдХ рдмрдирд╛рдирд╛ рдЪрд╛рд╣рддреЗ рдереЗ, рдЗрд╕рд▓рд┐рдП рдЙрдирдореЗрдВ рд╕реЗ рдХреБрдЫ рдХреЛ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЬреАрд╡рдВрдд рдмрдирд╛рдиреЗ рдХрд╛ рдлреИрд╕рд▓рд╛ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛, рдФрд░ рдЗрд╕рдХреЗ рджреНрд╡рд╛рд░рд╛ рдЗрд╕рдХрд╛ рдорддрд▓рдм рдПрдирд┐рдореЗрдЯреЗрдб рдерд╛ред рдФрд░ рд▓реЛрдЧреЛрдВ рдХреЛ рдФрд░ рднреА рдЕрдзрд┐рдХ рд╡реНрдпрд╕реНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдо, рдЯреАрдо рдиреЗ, рд╣рд░ рдХреБрдЫ рд╣рдлреНрддреЛрдВ рдореЗрдВ рдЙрди рдЙрдкрд╣рд╛рд░реЛрдВ рдФрд░ рдПрдирд┐рдореЗрд╢рди рдХреЛ рдЕрдкрдбреЗрдЯ рдХрд░рдиреЗ рдХреА рдпреЛрдЬрдирд╛ рдмрдирд╛рдИред

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

рд╕рдорд╛рдзрд╛рди рдЕрд╡рд▓реЛрдХрди


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



рдпрд╣рд╛рдВ рдбреЗрд╡рд▓рдкрд░ рдХреЗ рдорд╢реАрди рдкрд░ iOS рд╕рд┐рдореНрдпреБрд▓реЗрдЯрд░ рдореЗрдВ рдЕрдВрддрд┐рдо рд╕рдорд╛рдзрд╛рди рдЬреИрд╕рд╛ рджрд┐рдЦрддрд╛ рд╣реИ:


рд╣рд╛рд▓рд╛рдВрдХрд┐, рдЗрд╕ рдкреЛрд╕реНрдЯ рдореЗрдВ, рдореИрдВ рдЬрд┐рд╕ рдЙрджрд╛рд╣рд░рдг рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдЬрд╛ рд░рд╣рд╛ рд╣реВрдВ рд╡рд╣ рдПрдХ рдмрд╣реБрдд рд╣реА рд╕рд░рд▓ рдПрдиреАрдореЗрд╢рди рд╣реИ рдЬрд┐рд╕реЗ рдореИрдВрдиреЗ рдЦреБрдж рдмрдирд╛рдпрд╛ рд╣реИред рдпрд╣ рдПрдХ рдХреЗ рд░реВрдк рдореЗрдВ рдлреИрдВрд╕реА рдХреЗ рд░реВрдк рдореЗрдВ рдирд╣реАрдВ рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ рд╡рд░реНрдгрд┐рдд рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХреА рдХреНрд╖рдорддрд╛ рдХреЛ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкрд░реНрдпрд╛рдкреНрдд рд╣реИред

рдирд┐рд░реНрдпрд╛рдд рдПрдирд┐рдореЗрд╢рди


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



рдЗрд╕ рдмрд┐рдВрджреБ рдкрд░, рдореИрдВ AEE рдореЗрдВ рдПрдирд┐рдореЗрд╢рди рдХреИрд╕реЗ рдмрдирд╛ рд░рд╣рд╛ рд╣реВрдВ, рдЗрд╕ рдмрд╛рд░реЗ рдореЗрдВ рдирд╣реАрдВ рдЬрд╛ рд░рд╣рд╛ рд╣реВрдВ, рд▓реЗрдХрд┐рди рдЬреЛ рдореИрдВ рд╕рдордЭрд╛рдиреЗ рдЬрд╛ рд░рд╣рд╛ рд╣реВрдВ рд╡рд╣ рдпрд╣ рд╣реИ рдХрд┐ рдХреИрд╕реЗ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдореМрдЬреВрдж рдПрдирд┐рдореЗрд╢рди рдХреЛ iOS рдРрдк- рд░реАрдбреЗрдмрд▓ рдлреЙрд░реНрдореЗрдЯ рдореЗрдВ Bodymovin рдкреНрд▓рдЧрдЗрди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЖрдпрд╛рдд рдХрд┐рдпрд╛ рдЬрд╛рдПред

рдпрд╣ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж рдХрд┐ рдкреНрд▓рдЧ рдЗрди рд╕реНрдерд╛рдкрд┐рдд рд╣реИ, рдореЗрдиреВ рдореЗрдВ рд╡рд┐рдВрдбреЛ / рдПрдХреНрд╕рдЯреЗрдВрд╢рди / рдмреЛрдбреЛрдореЛрд╡рд┐рди рд╡рд┐рдХрд▓реНрдк рдХрд╛ рдЪрдпрди рдХрд░рдХреЗ рдЗрд╕реЗ рдЦреЛрд▓реЗрдВ:



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



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



рдЕрдВрдд рдореЗрдВ, рдЪрдпрдирд┐рдд рдПрдиреАрдореЗрд╢рди рд░рдЪрдирд╛ рдХреЛ рд░реЗрдВрдбрд░ рдмрдЯрди рдкрд░ рдХреНрд▓рд┐рдХ рдХрд░рдХреЗ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рдирд┐рд░реНрдпрд╛рдд рдФрд░ рд╕рд╣реЗрдЬрд╛ рдЬрд╛рддрд╛ рд╣реИред

рд╕рд░реНрд╡рд░ рдкрд░ рдПрдирд┐рдореЗрд╢рди рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░рдирд╛


рдЖрдЗрдП рдорд╛рди рд▓реЗрдВ рдХрд┐ рд╣рдордиреЗ рдЗрдВрдЯрд░рдиреЗрдЯ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдЕрдкрдиреЗ рдкрд╕рдВрджреАрджрд╛ рд╡реЗрдм рд╕рд░реНрд╡рд░ рдкрд░ рд╣рдорд╛рд░реЗ рдкреНрд░рджрд╛рди рдХрд┐рдП рдЧрдП рдПрдирд┐рдореЗрд╢рди JSON рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреЛ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░ рджрд┐рдпрд╛ рд╣реИред рд╣рдорд╛рд░реЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рд╕рд╛рджрдЧреА рдХреЗ рд▓рд┐рдП, рдореИрдВрдиреЗ рдЙрдиреНрд╣реЗрдВ рдЗрд╕ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдХреЗ рдЧрд┐рдердм рд░рд┐рдкреЙрдЬрд┐рдЯрд░реА рдореЗрдВ рдЕрдкрд▓реЛрдб рдХрд┐рдпрд╛ рд╣реИред рдПрдирд┐рдореЗрд╢рди рдпрд╣рд╛рдБ рдЙрдкрд▓рдмреНрдз рд╣реИрдВ:


рдЖрдзрд╛рд░ URL: https://raw.githubusercontent.com/chupakabr/server-provided-animations/master/_raw/rendered-animations/

рдПрдиреАрдореЗрд╢рди-рд╡рд┐рд╢рд┐рд╖реНрдЯ рдЖрдИрдбреА:

  • clouds.json
  • fireworks.json

рдиреЛрдЯ: рд╕реНрд╡рд┐рдлреНрдЯ рдореЗрдВ рд▓рд┐рдЦреЗ рдЧрдП рдПрдирд┐рдореЗрд╢рди рдкреНрд░рджрд╛рддрд╛ рд╡реЗрдм рд╕рд░реНрд╡рд░ рдХреА рддрд▓рд╛рд╢ рд╣реИ? рдЧрд┐рддреБрдм рдкрд░ рдпрд╣рд╛рдБ рд╕рдорд╛рдзрд╛рди рдФрд░ рдЗрд╕ рд▓реЗрдЦ рдореЗрдВ рдПрдХ рд╡рд┐рд╕реНрддреГрдд рд╡рд┐рд╡рд░рдг рдкреНрд░рд╛рдкреНрдд рдХрд░реЗрдВ ред
рдЗрд╕ рдмрд┐рдВрджреБ рдкрд░, рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдПрдХ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдХрд╛рд░реНрдпрд╛рддреНрдордХ рдПрдирд┐рдореЗрд╢рди-рдкреНрд░рджрд╛рддрд╛ рд╕рд░реНрд╡рд░ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдпрд╣ рд╕рдмрд╕реЗ рд░реЛрдорд╛рдВрдЪрдХ рднрд╛рдЧ рдкрд░ рдЬрд╛рдиреЗ рдХрд╛ рд╕рдордп рд╣реИ: рд╣рдорд╛рд░реЗ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ рдХреЗ рд▓рд┐рдП рдПрдирд┐рдореЗрд╢рди рдкреНрд░рд╕реНрддреБрдд рдХрд░рдирд╛ред

рдПрдирд┐рдореЗрд╢рди рд▓рд╛ рд░рд╣реЗ рд╣реИрдВ рдФрд░ рдкреНрд░рд╕реНрддреБрдд рдХрд░ рд░рд╣реЗ рд╣реИрдВ


рдЗрд╕ рдмрд┐рдВрджреБ рдкрд░ рдореИрдВ рджреГрдврд╝рддрд╛ рд╕реЗ Client/ServerProvidedAnimation.xcworkspace рдкрд░ рд╕реНрдерд┐рдд рд╣рдорд╛рд░реЗ рдЙрджрд╛рд╣рд░рдг рдХреЗ iOS рдРрдк рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдХреЛ рдЦреЛрд▓рдиреЗ рдХреА рд╕рд▓рд╛рд╣ рджреЗрддрд╛ Client/ServerProvidedAnimation.xcworkspace рдХреНрдпреЛрдВрдХрд┐ рдЗрд╕рдореЗрдВ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рд╕рднреА рдЖрд╡рд╢реНрдпрдХ рдмреЙрдпрд▓рд░рдкреНрд▓реЗрдЯ рдХреЛрдб рдФрд░ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рд╣реИрдВред

рдПрдирд┐рдореЗрд╢рди рдбреЗрдЯрд╛ рд▓реЛрдб рд╣реЛ рд░рд╣рд╛ рд╣реИ


рдпрд╣ рджреЗрдЦрддреЗ рд╣реБрдП рдХрд┐ рдПрдиреАрдореЗрд╢рди рдбреЗрдЯрд╛ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП REST рдПрдкреАрдЖрдИ рдПрдВрдбрдкреЙрдЗрдВрдЯреНрд╕ рдЕрдм рдЙрда рд░рд╣реЗ рд╣реИрдВ рдФрд░ рдЪрд▓ рд░рд╣реЗ рд╣реИрдВ, рдпрд╣ рдбреЗрдЯрд╛ рдкреНрд░рджрд╛рддрд╛ рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рдХреЛ рд╢реБрд░реВ рдХрд░рдиреЗ рдФрд░ рдЗрд╕рдХреЗ рд╕рд░реНрд╡рд░ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЛ рдЬреЛрдбрд╝рдиреЗ рдХрд╛ рд╕рдордп рд╣реИ:

 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 рдкреНрд░рд╛рд░реВрдк рдореЗрдВ рд╕рд░реНрд╡рд░ рд╕реЗ рдПрдирд┐рдореЗрд╢рди рдХреЛ рдорд╛рдВрдЧ рдкрд░ рд▓реЛрдб рдХрд░рдиреЗ рдФрд░ рдЙрдиреНрд╣реЗрдВ UI рдкрд░ рд░реЗрдВрдбрд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдореЗрдореЛрд░реА рдореЗрдВ рд░рдЦрдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред рдпрд╣ рдорд╛рдирддреЗ рд╣реБрдП рдХрд┐ рд╣рдо 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     } } // ... 

ViewModel рдЪрдпрдирд┐рдд рдПрдиреАрдореЗрд╢рди рдбреЗрдЯрд╛ рдкреНрд░реЙрдкрд░реНрдЯреА рдХреЛ рддрдм рдЕрдкрдбреЗрдЯ рдХрд░рддрд╛ рд╣реИ рдЬрдм рдЙрд╕реЗ рд╕рд░реНрд╡рд░ рд╕реЗ рдПрдХ рдЧреИрд░-рд░рд┐рдХреНрдд JSON рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЗ рд╕рд╛рде рдПрдХ рд╡реИрдз HTTP рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдорд┐рд▓рддреА рд╣реИред рдПрдиреАрдореЗрд╢рди рд░реЗрдВрдбрд░рд┐рдВрдЧ рдХреЛ рд╢реЗрдбреНрдпреВрд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЗрд╕ рдбреЗрдЯрд╛ рдХрд╛ рдЗрд╕реНрддреЗрдорд╛рд▓ рдкреНрд░реЗрдЬреЗрдВрдЯреЗрд╢рди рд▓реЗрдпрд░ рджреНрд╡рд╛рд░рд╛ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред

рдкреНрд░рд╕реНрддреБрддрд┐ рдкрд░рдд


рдЕрдм рд╣рдо рдЕрдкрдиреЗ 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 рдПрдВрдбрдкреЙрдЗрдВрдЯ рд╕реЗ рд▓реЛрдб рдХрд┐рдП рдЬрд╛ рд░рд╣реЗ рд╣реИрдВ рдФрд░ рдорд╛рдВрдЧ рдкрд░ рдХреНрд▓рд╛рдЗрдВрдЯ рдХреЛ рдкреНрд░рджрд╛рди рдХрд┐рдП рдЬрд╛рддреЗ рд╣реИрдВред

рдпреБрдХреНрддрд┐рдпрд╛рдБ рдФрд░ рд╕реАрдорд╛рдПрдБ


рдпреБрдХреНрддрд┐рдпрд╛рдБ рдФрд░ рдЪрд╛рд▓реЗрдВ:

  • AAE рд░реЗрдЦрд╛рдкреБрдВрдЬ рдФрд░ рд╡реЗрдХреНрдЯрд░ рдЧреНрд░рд╛рдлрд┐рдХреНрд╕ рд╕рд╣рд┐рдд рдЕрдзрд┐рдХрд╛рдВрд╢ рд╕рдВрдкрддреНрддрд┐ рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЗ рдЙрдкрдпреЛрдЧ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ;
  • Bodymovin рд╕рднреА рд╡рд╕реНрддреБрдУрдВ рдХреЛ рдЖрдЙрдЯрдкреБрдЯ JSON рдПрдиреАрдореЗрд╢рди рдлрд╝рд╛рдЗрд▓ (base64 рдПрдиреНрдХреЛрдбрд┐рдВрдЧ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ) рдореЗрдВ рдПрдореНрдмреЗрдб рдХрд░рдирд╛ рд╕рдВрднрд╡ рдмрдирд╛рддрд╛ рд╣реИ - рдЗрд╕рдХрд╛ рдорддрд▓рдм рд╣реИ рдХрд┐ рд╣рдо рдЧреНрд░рд╛рд╣рдХ рдХреА рддрд░рдл рд╕реЗ рд▓реЛрдб рд╣реЛрдиреЗ рд╡рд╛рд▓реА рдЕрд▓рдЧ-рдЕрд▓рдЧ рд╕рдВрдкрддреНрддрд┐рдпреЛрдВ рд╕реЗ рдмрдЪ рд╕рдХрддреЗ рд╣реИрдВ;
  • рдПрдирд┐рдореЗрд╢рди рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЗ рдкрд╛рд╕ AAE рдореЗрдВ рд╕рджрд┐рд╢ рдореЗрдВ рд╕реАрдзреЗ рдбреНрд░рд╛рдЗрдВрдЧ рдпрд╛ рдХреЗрд╡рд▓ Adobe Illustrator рд╡реЗрдХреНрдЯрд░ рдЧреНрд░рд╛рдлрд┐рдХреНрд╕ рдЖрдпрд╛рдд рдХрд░рдиреЗ рдХреЗ рдмреАрдЪ рд╡рд┐рдХрд▓реНрдк рд╣реИред

рджреБрд░реНрднрд╛рдЧреНрдп рд╕реЗ, рдпрд╣ рдПрд╕рд╡реАрдЬреА рд╡реЗрдХреНрдЯрд░ рдЧреНрд░рд╛рдлрд┐рдХреНрд╕ рдХреЛ рдПрдПрдИ рдореЗрдВ рдЖрдпрд╛рдд рдХрд░рдирд╛ рд╕рдВрднрд╡ рдирд╣реАрдВ рд╣реИ (рдореИрдВрдиреЗ рдХреЛрд╢рд┐рд╢ рдХреА рд╣реИ!)ред

рдореЗрд░реЗ рд╕рд╣рдХрд░реНрдореА рд░реИрдбреЛрд╕реЙрд▓ рд╕рд╛рдЗрдХреЗрд╡рд╛ рджреНрд╡рд╛рд░рд╛ рд▓рд┐рдЦреЗ рдЧрдП рдЗрд╕ рдЕрджреНрднреБрдд рд▓реЗрдЦ рдореЗрдВ рдЕрдзрд┐рдХ рдЪрд╛рд▓ рдФрд░ рд╕рдВрднрд╛рд╡рд┐рдд рд╕рдорд╕реНрдпрд╛рдУрдВ рдХрд╛ рд╡рд░реНрдгрди рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред

рдирд┐рд╖реНрдХрд░реНрд╖


рддреЛ, рд╕рд░реНрд╡рд░-рдкреНрд░рджрддреНрдд рдПрдирд┐рдореЗрд╢рди рд╣рдореЗрдВ рдХреНрдпрд╛ рджреЗрддрд╛ рд╣реИ? рдЗрд╕ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХрд╛ рд╕рдмрд╕реЗ рд╕реНрдкрд╖реНрдЯ рд▓рд╛рдн рдПрдирд┐рдореЗрд╢рди рдЕрдкрдбреЗрдЯ рдкреНрд░рд╡рд╛рд╣ рдХреЗ рд╕рднреА рд╣рд┐рддрдзрд╛рд░рдХреЛрдВ рдХреЛ рдЕрд▓рдЧ рдХрд░рдиреЗ рдХреА рдХреНрд╖рдорддрд╛ рд╣реИред рджреВрд╕рд░реЗ рд╢рдмреНрджреЛрдВ рдореЗрдВ, рдПрдХ рдлреИрдВрд╕реА рдирдпрд╛ рдПрдиреАрдореЗрд╢рди рдЬрд╛рд░реА рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╕рднреА рдбрд┐рдЬрд╛рдЗрдирд░реЛрдВ рдХреЛ рд╕рд░реНрд╡рд░ рдЯреАрдо рдХреЛ рдПрдиреАрдореЗрд╢рди рдХрд╛ JSON рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рдкреНрд░рджрд╛рди рдХрд░рдирд╛ рд╣реИред рдФрд░ рдПрдХ рдХреЛ рд╣рдЯрд╛рдиреЗ рдХреЗ рд▓рд┐рдП, рд╕рд░реНрд╡рд░ рдЯреАрдо рдХреЛ рдмрд╕ рдЦреЛрдЬ рд╕реЗрд╡рд╛ рд╕реЗ рдЙрд╕ рд╡рд┐рд╢реЗрд╖ рдПрдиреАрдореЗрд╢рди рдХреЛ рдирд┐рдХрд╛рд▓рдирд╛ рд╣реЛрдЧрд╛ред рдХреЛрдИ рд╕рдордп рдмрд░реНрдмрд╛рдж рдирд╣реАрдВ рд╣реБрдЖ!

рдПрдХ рдФрд░ рдЕрдЪреНрдЫреА рдмрд╛рдд рдпрд╣ рд╣реИ рдХрд┐ рдореМрдЬреВрджрд╛ рд╕рд░реНрд╡рд░ рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдпрд╛ рдХрдЪреНрдЪреЗ рдПрдирд┐рдореЗрд╢рди рдХреЛ рд╕рдорд╛рдпреЛрдЬрд┐рдд рдХрд┐рдП рдмрд┐рдирд╛ рд╕рдорд╛рди рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдХреЛ рд╕рднреА рд╕рдорд░реНрдерд┐рдд рдХреНрд▓рд╛рдЗрдВрдЯ рдкреНрд▓реЗрдЯрдлрд╝реЙрд░реНрдо (iOS, Android, рд╡реЗрдм, ..) рдкрд░ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред

рдЖрдЬ рдХреЗ рд▓рд┐рдП рдЗрддрдирд╛ рд╣реА! рдкрдврд╝рдиреЗ рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рдж

рд╕рд╛рдзрди


Source: https://habr.com/ru/post/hi439370/


All Articles