рдЕрд▓рдорд╛рд░рд┐рдпреЛрдВ рдкрд░ SwiftUI: рдПрдиреАрдореЗрд╢рдиред рднрд╛рдЧ 1

рдЫрд╡рд┐

рд╣рд╛рд▓ рд╣реА рдореЗрдВ рдореИрдВ рдПрдХ рддрд╛рдЬрд╝рд╛ рд▓реЗрдЦ рд▓реЗрдХрд░ рдЖрдпрд╛ , рдЬрд┐рд╕рдореЗрдВ рд▓реЛрдЧреЛрдВ рдиреЗ SwiftUI рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдПрдХ рджрд┐рд▓рдЪрд╕реНрдк рдЕрд╡рдзрд╛рд░рдгрд╛ рдХреЛ рдкреБрди: рдкреЗрд╢ рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХреАред рдпрд╣рд╛рдБ рдЙрдиреНрд╣реЛрдВрдиреЗ рдХреНрдпрд╛ рдХрд┐рдпрд╛:

рдЫрд╡рд┐

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

рдпрд╣рд╛рдБ рдореБрдЭреЗ рдХреНрдпрд╛ рдорд┐рд▓рд╛ рд╣реИ:


рд╣рд╛рд▓рд╛рдВрдХрд┐, рд╡рд┐рд╖рдп рдХреЗ рдкреВрд░реНрдг рдкреНрд░рдХрдЯреАрдХрд░рдг рдХреЗ рд▓рд┐рдП, рдореБрдЭреЗ рдмрд╣реБрдд рдореВрд▓ рдмрд╛рддреЗрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХреБрдЫ рд╡рд┐рд╕реНрддрд╛рд░ рд╕реЗ рдмрд╛рдд рдХрд░рдиреА рдереАред рдкрд╛рда рд╕реНрд╡реИрдЪреНрдЫрд┐рдХ рдирд┐рдХрд▓рд╛, рдФрд░ рдЗрд╕рд▓рд┐рдП, рдореИрдВрдиреЗ рдЗрд╕реЗ рджреЛ рд▓реЗрдЦреЛрдВ рдореЗрдВ рддреЛрдбрд╝ рджрд┐рдпрд╛ред рдпрд╣рд╛рдВ рдЗрд╕рдХрд╛ рдкрд╣рд▓рд╛ рднрд╛рдЧ рд╣реИ - рдмрд▓реНрдХрд┐, рд╕рд╛рдорд╛рдиреНрдп рд░реВрдк рд╕реЗ рдПрдиреАрдореЗрд╢рди рдкрд░ рдПрдХ рдЯреНрдпреВрдЯреЛрд░рд┐рдпрд▓, рдЗрдВрджреНрд░рдзрдиреБрд╖ рдПрдиреАрдореЗрд╢рди рд╕реЗ рд╕реАрдзреЗ рд╕рдВрдмрдВрдзрд┐рдд рдирд╣реАрдВ рд╣реИ, рдЬрд┐рд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдореИрдВ рдЕрдЧрд▓реЗ рд▓реЗрдЦ рдореЗрдВ рд╡рд┐рд╕реНрддрд╛рд░ рд╕реЗ рдЪрд░реНрдЪрд╛ рдХрд░реВрдВрдЧрд╛ред

рдЗрд╕ рд▓реЗрдЦ рдореЗрдВ, рдореИрдВ рдореВрд▓ рдмрд╛рддреЛрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╛рдд рдХрд░реВрдВрдЧрд╛, рдЬрд┐рд╕рдХреЗ рдмрд┐рдирд╛ рдЖрдк рдЕрдзрд┐рдХ рдЬрдЯрд┐рд▓ рдЙрджрд╛рд╣рд░рдгреЛрдВ рдореЗрдВ рдЖрд╕рд╛рдиреА рд╕реЗ рднреНрд░рдорд┐рдд рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВред рдЬреНрдпрд╛рджрд╛рддрд░ рдореИрдВ рдПрдХ рдпрд╛ рджреВрд╕рд░реЗ рд░реВрдк рдореЗрдВ рдмрд╛рдд рдХрд░реВрдВрдЧрд╛, рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдЗрд╕ рд╢реНрд░реГрдВрдЦрд▓рд╛ ( 1 , 2 , 3 , 4) рдЬреИрд╕реЗ рдЕрдВрдЧреНрд░реЗрдЬреА рднрд╛рд╖рд╛ рдХреЗ рд▓реЗрдЦреЛрдВ рдореЗрдВ рд╡рд░реНрдгрд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред) рдореИрдВ, рджреВрд╕рд░реА рдУрд░, рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рддрд░реАрдХреЛрдВ рдХреА рдЧрдгрдирд╛ рдХрд░рдиреЗ рдкрд░ рдЗрддрдирд╛ рдзреНрдпрд╛рди рдХреЗрдВрджреНрд░рд┐рдд рдирд╣реАрдВ рдХрд░рддрд╛ рдХрд┐ рдпрд╣ рдХреИрд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред рдФрд░ рд╣рдореЗрд╢рд╛ рдХреА рддрд░рд╣, рдореИрдВрдиреЗ рдмрд╣реБрдд рдкреНрд░рдпреЛрдЧ рдХрд┐рдпрд╛, рдЗрд╕рд▓рд┐рдП рдореИрдВ рд╕рдмрд╕реЗ рджрд┐рд▓рдЪрд╕реНрдк рдкрд░рд┐рдгрд╛рдо рд╕рд╛рдЭрд╛ рдХрд░рдиреЗ рдореЗрдВ рдЬрд▓реНрджрдмрд╛рдЬреА рдХрд░рддрд╛ рд╣реВрдВред

рдЪреЗрддрд╛рд╡рдиреА: рдмрд┐рд▓реНрд▓реА рдХреЗ рдиреАрдЪреЗ рдмрд╣реБрдд рд╕рд╛рд░реЗ рдЪрд┐рддреНрд░ рдФрд░ рдЬрд┐рдл-рдПрдирд┐рдореЗрд╢рди рд╣реИрдВред

TLDR


рдпрд╣ рдкрд░рд┐рдпреЛрдЬрдирд╛ рдЬреАрдердм рдкрд░ рдЙрдкрд▓рдмреНрдз рд╣реИ ред рдЖрдк рд╡рд░реНрддрдорд╛рди рдкрд░рд┐рдгрд╛рдо рдХреЛ TransitionRainbowView () рдореЗрдВ рдЗрдВрджреНрд░рдзрдиреБрд╖ рдПрдиреАрдореЗрд╢рди рдХреЗ рд╕рд╛рде рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдореИрдВ рдЖрдкрдХреЗ рд╕реНрдерд╛рди рдкрд░ рдирд╣реАрдВ рдЬрд╛рдКрдВрдЧрд╛, рд▓реЗрдХрд┐рди рдореИрдВрдиреЗ рдЕрдЧрд▓реЗ рд▓реЗрдЦ рдХреА рдкреНрд░рддреАрдХреНрд╖рд╛ рдХреАред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдЗрд╕реЗ рддреИрдпрд╛рд░ рдХрд░рддреЗ рд╕рдордп, рдореИрдВ рдХреЛрдб рдХреЛ рдереЛрдбрд╝рд╛ рдХрдВрдШреА рдХрд░рддрд╛ рд╣реВрдВред

рдЗрд╕ рд▓реЗрдЦ рдореЗрдВ, рд╣рдо рдХреЗрд╡рд▓ рдореВрд▓ рдмрд╛рддреЗрдВ рдкрд░ рдЪрд░реНрдЪрд╛ рдХрд░реЗрдВрдЧреЗ, рдФрд░ рдХреЗрд╡рд▓ рдмреЗрд╕ рдлрд╝реЛрд▓реНрдбрд░ рдХреА рд╕рд╛рдордЧреНрд░реА рдХреЛ рдкреНрд░рднрд╛рд╡рд┐рдд рдХрд░реЗрдВрдЧреЗред

рдкрд░рд┐рдЪрдп


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

рдореИрдВ рддреБрд░рдВрдд рдЖрд░рдХреНрд╖рдг рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВред рдореБрдЭреЗ рд╡рд┐рд╢реНрд╡рд╛рд╕ рдирд╣реАрдВ рд╣реИ рдХрд┐ рдЙрд▓реНрд▓рд┐рдЦрд┐рдд рд▓реЗрдЦ рдореЗрдВ рдХреЛрдИ рддреНрд░реБрдЯрд┐ рд╣реБрдИ рдереА, рдпрд╛ рдЗрд╕рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЧрдпрд╛ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдЧрд▓рдд рд╣реИред рд╣рд░реНрдЧрд┐рдЬ рдирд╣реАрдВред рдпрд╣ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЗ рдПрдХ рдСрдмреНрдЬреЗрдХреНрдЯ рдореЙрдбрд▓ (рдПрдиреАрдореЗрд╢рди) рдХрд╛ рдирд┐рд░реНрдорд╛рдг рдХрд░рддрд╛ рд╣реИ, рдЬреЛ рдкреНрд░рд╛рдкреНрдд рд╕рдВрдХреЗрдд рдХрд╛ рдЬрд╡рд╛рдм рджреЗрддреЗ рд╣реБрдП, рдХреБрдЫ рдХрд░рдирд╛ рд╢реБрд░реВ рдХрд░ рджреЗрддрд╛ рд╣реИред рд╣рд╛рд▓рд╛рдВрдХрд┐, рдореЗрд░реЗ рд▓рд┐рдП, рдЗрд╕ рд▓реЗрдЦ рдореЗрдВ рд╕рдмрд╕реЗ рдЕрдзрд┐рдХ рд╕рдВрднрд╛рд╡рдирд╛ рдХрдВрдмрд╛рдЗрди рдврд╛рдВрдЪреЗ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд╛ рдкрддрд╛ рдЪрд▓рддрд╛ рд╣реИред рд╣рд╛рдВ, рдпрд╣ рдлреНрд░реЗрдорд╡рд░реНрдХ рд╕реНрд╡рд┐рдлреНрдЯрдпреВрдЖрдИ рдХрд╛ рдПрдХ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣рд┐рд╕реНрд╕рд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ рдПрдиреАрдореЗрд╢рди рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╕рд╛рдорд╛рдиреНрдп рддреМрд░ рдкрд░ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдЬреИрд╕реА рд╢реИрд▓реА рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЕрдзрд┐рдХ рд╣реИред

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

рдЬреИрд╕рд╛ рдХрд┐ рдореИрдВрдиреЗ рдкрд┐рдЫрд▓реЗ рд▓реЗрдЦ рдореЗрдВ рдХрд╣рд╛ рдерд╛SwiftUI рджреНрд╡рд╛рд░рд╛, рдореИрдВрдиреЗ UIKit рдХреЛ рдирдЬрд╝рд░рдЕрдВрджрд╛рдЬрд╝ рдХрд░рддреЗ рд╣реБрдП SwiftUI рдХреЗ рд╕рд╛рде рдореЛрдмрд╛рдЗрд▓ рд╡рд┐рдХрд╛рд╕ рдХреА рджреБрдирд┐рдпрд╛ рдореЗрдВ рдЕрдкрдирд╛ рдЧреЛрддрд╛ рд▓рдЧрд╛рдирд╛ рд╢реБрд░реВ рдХрд┐рдпрд╛ред рдпрд╣, рдЬрд╝рд╛рд╣рд┐рд░ рд╣реИ, рдПрдХ рдХреАрдордд рд╣реИ, рд▓реЗрдХрд┐рди рдлрд╛рдпрджреЗ рд╣реИрдВред рдореИрдВ рдкреБрд░рд╛рдиреЗ рдЪрд╛рд░реНрдЯрд░ рдХреЗ рдЕрдиреБрд╕рд╛рд░ рдПрдХ рдирдП рдорда рдореЗрдВ рд░рд╣рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдирд╣реАрдВ рдХрд░ рд░рд╣рд╛ рд╣реВрдВред рдИрдорд╛рдирджрд╛рд░реА рд╕реЗ, рдореИрдВ рдЕрднреА рддрдХ рдХрд┐рд╕реА рднреА рдЪрд╛рд░реНрдЯрд░реНрд╕ рдХреЛ рдирд╣реАрдВ рдЬрд╛рдирддрд╛, рдЗрд╕рд▓рд┐рдП рдореБрдЭреЗ рдирдП рдХреА рдЕрд╕реНрд╡реАрдХреГрддрд┐ рдирд╣реАрдВ рд╣реИред рдЗрд╕реАрд▓рд┐рдП, рдпрд╣ рд▓реЗрдЦ, рдореБрдЭреЗ рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ, рдореЗрд░реЗ рдЬреИрд╕реЗ рди рдХреЗрд╡рд▓ рд╢реБрд░реБрдЖрддреА рд▓реЛрдЧреЛрдВ рдХреЗ рд▓рд┐рдП, рдмрд▓реНрдХрд┐ рдЙрди рд▓реЛрдЧреЛрдВ рдХреЗ рд▓рд┐рдП рднреА рдореВрд▓реНрдп рдХрд╛ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ, рдЬреЛ рд╕реНрд╡рд┐рдлреНрдЯрдпреВрдЖрдИ рдХрд╛ рдЕрдзреНрдпрдпрди рдХрд░рддреЗ рд╣реИрдВ, рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдпреВрдЖрдИрдХреЗрдЯреА рдкрд░ рд╡рд┐рдХрд╛рд╕ рдХреЗ рд░реВрдк рдореЗрдВ рдкреГрд╖реНрдарднреВрдорд┐ рд░рдЦрддреЗ рд╣реИрдВред рдпрд╣ рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдХрдИ рд▓реЛрдЧреЛрдВ рдХреЛ рдПрдХ рдирдП рд░реВрдк рдХреА рдХрдореА рд╣реИред рдПрдХ рд╣реА рдХрд╛рдо рди рдХрд░реЗрдВ, рдПрдХ рдирдП рдЯреВрд▓ рдХреЛ рдкреБрд░рд╛рдиреЗ рдбреНрд░реЙрдЗрдВрдЧ рдореЗрдВ рдлрд┐рдЯ рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░реЗрдВ, рд▓реЗрдХрд┐рди рдЕрдкрдиреА рд╕рдВрднрд╛рд╡рдирд╛рдУрдВ рдХреЛ рдирдИ рд╕рдВрднрд╛рд╡рдирд╛рдУрдВ рдХреЗ рдЕрдиреБрд╕рд╛рд░ рдмрджрд▓реЗрдВред

рд╣рдо 1c-nicks "рдирд┐рдпрдВрддреНрд░рд┐рдд рд░реВрдкреЛрдВ" рдХреЗ рд╕рд╛рде рдЗрд╕рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдЧрдПред рдпрд╣ 1s рдХреА рджреБрдирд┐рдпрд╛ рдореЗрдВ рдПрдХ рддрд░рд╣ рдХреА SwiftUI рд╣реИ, рдЬреЛ 10 рд╕рд╛рд▓ рд╕реЗ рднреА рдкрд╣рд▓реЗ рд╣реБрдИ рдереАред рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рд╕рд╛рджреГрд╢реНрдп рдмрд╣реБрдд рд╕рдЯреАрдХ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдкреНрд░рдмрдВрдзрд┐рдд рд░реВрдк рдПрдХ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдмрдирд╛рдиреЗ рдХрд╛ рдПрдХ рдирдпрд╛ рддрд░реАрдХрд╛ рд╣реИред рд╣рд╛рд▓рд╛рдВрдХрд┐, рдЙрдиреНрд╣реЛрдВрдиреЗ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЗ рдХреНрд▓рд╛рдЗрдВрдЯ-рд╕рд░реНрд╡рд░ рдЗрдВрдЯрд░реИрдХреНрд╢рди рдХреЛ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдмрджрд▓ рджрд┐рдпрд╛, рдФрд░ рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рдбреЗрд╡рд▓рдкрд░реНрд╕ рдХреЗ рджрд┐рдорд╛рдЧ рдореЗрдВ рджреБрдирд┐рдпрд╛ рдХреА рддрд╕реНрд╡реАрд░ред рдпрд╣ рдЖрд╕рд╛рди рдирд╣реАрдВ рдерд╛, рдореИрдВ рдЦреБрдж рд▓рдЧрднрдЧ 5 рд╕рд╛рд▓ рддрдХ рдЗрд╕рдХрд╛ рдЕрдзреНрдпрдпрди рдирд╣реАрдВ рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рдерд╛, рдХреНрдпреЛрдВрдХрд┐ рдореИрдВрдиреЗ рд╕реЛрдЪрд╛ рдерд╛ рдХрд┐ рд╡рд╣рд╛рдБ рдХрд╛рдЯреЗ рдЧрдП рдЕрд╡рд╕рд░реЛрдВ рдореЗрдВ рд╕реЗ рдХрдИ рдореЗрд░реЗ рд▓рд┐рдП рдмрд╕ рдЖрд╡рд╢реНрдпрдХ рдереЗред рд▓реЗрдХрд┐рди, рдЬреИрд╕рд╛ рдХрд┐ рдЕрднреНрдпрд╛рд╕ рдиреЗ рджрд┐рдЦрд╛рдпрд╛ рд╣реИ, рдкреНрд░рдмрдВрдзрд┐рдд рд░реВрдкреЛрдВ рдкрд░ рдХреЛрдбрд┐рдВрдЧ рди рдХреЗрд╡рд▓ рд╕рдВрднрд╡ рд╣реИ, рдмрд▓реНрдХрд┐ рдХреЗрд╡рд▓ рдЖрд╡рд╢реНрдпрдХ рд╣реИред

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

рдПрдирд┐рдореЗрдЯреЗрдб рдЖрдХрд╛рд░


рдПрдиреАрдореЗрд╢рди рд╕рд╛рдорд╛рдиреНрдп рд░реВрдк рд╕реЗ рдХреИрд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ


рддреЛ, рдПрдиреАрдореЗрд╢рди рдХрд╛ рдореБрдЦреНрдп рд╡рд┐рдЪрд╛рд░ рдПрдХ рд╡рд┐рд╢реЗрд╖, рдЕрд╕рддрдд рдкрд░рд┐рд╡рд░реНрддрди рдХрд╛ рдПрдХ рдирд┐рд░рдВрддрд░ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрди рд╣реИред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рд╡реГрддреНрдд рдХреА рддреНрд░рд┐рдЬреНрдпрд╛ 100 рдЗрдХрд╛рдИ рдереА, 50 рдЗрдХрд╛рдИ рдмрди рдЧрдИред рдПрдиреАрдореЗрд╢рди рдХреЗ рдмрд┐рдирд╛, рдкрд░рд┐рд╡рд░реНрддрди рддреБрд░рдиреНрдд рд╣реЛрдЧрд╛, рдПрдиреАрдореЗрд╢рди рдХреЗ рд╕рд╛рде - рд╕реБрдЪрд╛рд░реВ рд░реВрдк рд╕реЗред рдпрд╣ рдХрд╛рдо рдХрд┐рд╕ рдкреНрд░рдХрд╛рд░ рдХрд░рддрд╛ рд╣реИ? рдмрд╣реБрдд рдЖрд╕рд╛рдиред рд╕рд╣рдЬ рдкрд░рд┐рд╡рд░реНрддрди рдХреЗ рд▓рд┐рдП, рд╣рдореЗрдВ "рдпрд╣ рдерд╛ ... рдпрд╣ рдмрди рдЧрдпрд╛ рд╣реИ" рдЦрдВрдб рдХреЗ рднреАрддрд░ рдХрдИ рдореВрд▓реНрдпреЛрдВ рдХреЛ рдкреНрд░рдХреНрд╖реЗрдкрд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рддреНрд░рд┐рдЬреНрдпрд╛ рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рд╣рдореЗрдВ 98 рдЗрдХрд╛рдЗрдпреЛрдВ, 95 рдЗрдХрд╛рдЗрдпреЛрдВ, 90 рдЗрдХрд╛рдЗрдпреЛрдВ ... 53 рдЗрдХрд╛рдЗрдпреЛрдВ рдФрд░, рдЕрдВрдд рдореЗрдВ, 50 рдЗрдХрд╛рдЗрдпреЛрдВ рдХреА рддреНрд░рд┐рдЬреНрдпрд╛ рдХреЗ рд╕рд╛рде рдХрдИ рдордзреНрдпрд╡рд░реНрддреА рд╡реГрддреНрдд рдЦреАрдВрдЪрдирд╛ рд╣реЛрдЧрд╛ред SwiftUI рдЗрд╕реЗ рдЖрд╕рд╛рдиреА рд╕реЗ рдФрд░ рд╕реНрд╡рд╛рднрд╛рд╡рд┐рдХ рд░реВрдк рд╕реЗ рдХрд░ рд╕рдХрддрд╛ рд╣реИ, рдмрд╕ рдЙрд╕ рдХреЛрдб рдХреЛ рд▓рдкреЗрдЯреЗрдВ рдЬреЛ рдЗрд╕ рдмрджрд▓рд╛рд╡ рдХреЛ withAnimation {...} рдореЗрдВ рдХрд░рддрд╛ рд╣реИред рдпрд╣ рдЬрд╛рджреВ рд▓рдЧрддрд╛ рд╣реИ ... рдЬрдм рддрдХ рдЖрдк "рд╣реИрд▓реЛ рджреБрдирд┐рдпрд╛" рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдХреБрдЫ рдЕрдзрд┐рдХ рдЬрдЯрд┐рд▓ рд▓рд╛рдЧреВ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВред

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

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

рдЖрдЗрдП рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдХреЛрдбрд┐рдВрдЧ рд╢реБрд░реВ рдХрд░реЗрдВ:

struct CircleView: View{
    var radius: CGFloat
    var body: some View{
        Circle()
            .fill(Color.green)
            .frame(height: self.radius * 2)
            .overlay(
                Text("Habra")
                    .font(.largeTitle)
                    .foregroundColor(.gray)
                )

    }
}
struct CustomCircleView: View{
    var radius: CGFloat
    var body: some View{
        CustomCircle()
            .fill(Color.gray)
            .frame(width: self.radius * 2, height: self.radius * 2)
            .overlay(
                Text("Habr")
                    .font(.largeTitle)
                    .foregroundColor(.green)
                )
    }
}
struct CustomCircleTestView: View {
    @State var radius: CGFloat = 50
    var body: some View {
        VStack{
            CircleView(radius: radius)
               .frame(height: 200)
            Slider(value: self.$radius, in: 42...100)
            Button(action: {
                withAnimation(.linear(duration: 1)){
                    self.radius = 50
                }
            }){
                Text("set default radius")
            }
        }
    }
}


рддреЛ, рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдПрдХ рд╕рд░реНрдХрд▓ (рд╕рд░реНрдХрд▓ ()) рд╣реИ, рдЬрд┐рд╕рдХреА рддреНрд░рд┐рдЬреНрдпрд╛ рд╣рдо рд╕реНрд▓рд╛рдЗрдбрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдмрджрд▓ рд╕рдХрддреЗ рд╣реИрдВред рдпрд╣ рд╕реБрдЪрд╛рд░реВ рд░реВрдк рд╕реЗ рд╣реЛрддрд╛ рд╣реИ, рдЬреИрд╕реЗ рд╕реНрд▓рд╛рдЗрдбрд░ рд╣рдореЗрдВ рд╕рднреА рдордзреНрдпрд╡рд░реНрддреА рдорд╛рди рджреЗрддрд╛ рд╣реИред рд╣рд╛рд▓рд╛рдБрдХрд┐, рдЬрдм рдЖрдк "рд╕реЗрдЯ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рддреНрд░рд┐рдЬреНрдпрд╛" рдмрдЯрди рдкрд░ рдХреНрд▓рд┐рдХ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдкрд░рд┐рд╡рд░реНрддрди рднреА рддреБрд░рдВрдд рдирд╣реАрдВ рд╣реЛрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди withimimation (.linear (рдЕрд╡рдзрд┐: 1)) рдирд┐рд░реНрджреЗрд╢ рдХреЗ рдЕрдиреБрд╕рд╛рд░ред рд░реИрдЦрд┐рдХ рд░реВрдк рд╕реЗ, рддреНрд╡рд░рдг рдХреЗ рдмрд┐рдирд╛, 1 рд╕реЗрдХрдВрдб рдХреЗ рд▓рд┐рдП рдмрдврд╝рд╛рдпрд╛ рдЧрдпрд╛ред рдХрдХреНрд╖рд╛! рд╣рдореЗрдВ рдПрдиреАрдореЗрд╢рди рдореЗрдВ рдорд╣рд╛рд░рдд рд╣рд╛рд╕рд┐рд▓ рд╣реИ! рд╣рдо рдЕрд╕рд╣рдордд рд╣реИрдВ :)

рд▓реЗрдХрд┐рди рдХреНрдпрд╛ рд╣реЛрдЧрд╛ рдЕрдЧрд░ рд╣рдо рдЕрдкрдиреЗ рд╕реНрд╡рдпрдВ рдХреЗ рд░реВрдк рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ рдФрд░ рдЗрд╕рдХреЗ рдкрд░рд┐рд╡рд░реНрддрдиреЛрдВ рдХреЛ рдЪреЗрддрди рдХрд░рддреЗ рд╣реИрдВ? рдХреНрдпрд╛ рдРрд╕рд╛ рдХрд░рдирд╛ рдореБрд╢реНрдХрд┐рд▓ рд╣реИ? рдЪрд▓реЛ рджреЗрдЦрддреЗ рд╣реИред

рдореИрдВрдиреЗ рд╕рд░реНрдХрд▓ рдХреА рдПрдХ рдкреНрд░рддрд┐рд▓рд┐рдкрд┐ рдЗрд╕ рдкреНрд░рдХрд╛рд░ рдмрдирд╛рдИ:

struct CustomCircle: Shape{
    public func path(in rect: CGRect) -> Path{
        let radius = min(rect.width, rect.height) / 2
        let center = CGPoint(x: rect.width / 2, y: rect.height / 2)
        return Path(){path in
            if rect.width > rect.height{
                path.move(to: CGPoint(x: center.x, y: 0))
                let startAngle = Angle(degrees: 270)
                path.addArc(center: center, radius: radius, startAngle: startAngle, endAngle:  startAngle + Angle(degrees: 360), clockwise: false)
            }else{
                path.move(to: CGPoint(x: 0, y: center.y))
                let startAngle = Angle(degrees: 0)
                path.addArc(center: center, radius: radius, startAngle: startAngle, endAngle:  startAngle + Angle(degrees: 360), clockwise: false)
            }
            path.closeSubpath()
        }
    }
}

рд╕рд░реНрдХрд▓ рдХреЗ рддреНрд░рд┐рдЬреНрдпрд╛ рдХреА рдЧрдгрдирд╛ рд╣рдорд╛рд░реЗ рджреНрд╡рд╛рд░рд╛ рдЖрд╡рдВрдЯрд┐рдд рд╕реНрдХреНрд░реАрди рдХреНрд╖реЗрддреНрд░ рдХреА рд╕реАрдорд╛ рдХреА рдЪреМрдбрд╝рд╛рдИ рдФрд░ рдКрдВрдЪрд╛рдИ рдХреЗ рдЖрдзреЗ рдХреЗ рд░реВрдк рдореЗрдВ рдХреА рдЬрд╛рддреА рд╣реИред рдпрджрд┐ рдЪреМрдбрд╝рд╛рдИ рдКрдВрдЪрд╛рдИ рд╕реЗ рдЕрдзрд┐рдХ рд╣реИ, рддреЛ рд╣рдо рдКрдкрд░реА рд╕реАрдорд╛ (рдиреЛрдЯ 1) рдХреЗ рдордзреНрдп рд╕реЗ рд╢реБрд░реВ рдХрд░рддреЗ рд╣реИрдВ, рдПрдХ рдШрдбрд╝реА рдХреА рджрд┐рд╢рд╛ рдореЗрдВ рдкреВрд░реНрдг рд╕рд░реНрдХрд▓ рдХрд╛ рд╡рд░реНрдгрди рдХрд░реЗрдВ (рдиреЛрдЯ 2), рдФрд░ рдЗрд╕ рдкрд░ рд╣рдорд╛рд░реА рд░реВрдкрд░реЗрдЦрд╛ рдХреЛ рдмрдВрдж рдХрд░реЗрдВред рдпрджрд┐ рдКрдВрдЪрд╛рдИ рдЪреМрдбрд╝рд╛рдИ рд╕реЗ рдЕрдзрд┐рдХ рд╣реИ, рддреЛ рд╣рдо рд╕рд╣реА рд╕реАрдорд╛ рдХреЗ рдордзреНрдп рд╕реЗ рд╢реБрд░реВ рдХрд░рддреЗ рд╣реИрдВ, рд╣рдо рдкреВрд░реНрдг рд╕рд░реНрдХрд▓ рдХреЛ рджрдХреНрд╖рд┐рдгрд╛рд╡рд░реНрдд рднреА рд╡рд░реНрдгрди рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рд╕рдореЛрдЪреНрдЪ рдХреЛ рдмрдВрдж рдХрд░рддреЗ рд╣реИрдВред

рдиреЛрдЯ 1
Apple ( ) . , (0, 0), (x, y), x тАФ , y тАФ . .. y. y тАФ . , . 90 , 180 тАФ , 270 тАФ .

рдиреЛрдЯ 2
1 , тАЬ тАЭ тАЬ тАЭ . Core Graphics (SwiftUI ):
In a flipped coordinate system (the default for UIView drawing methods in iOS), specifying a clockwise arc results in a counterclockwise arc after the transformation is applied.

рдЖрдЗрдП рдЬрд╛рдБрдЪреЗрдВ рдХрд┐ рд╣рдорд╛рд░рд╛ рдирдпрд╛ рд╕рд░реНрдХрд▓ рдХрд┐рд╕ рддрд░рд╣ рд╕реЗ рдкрд░рд┐рд╡рд░реНрддрди рдХреЛ рд░реЛрдХ рджреЗрдЧрд╛ред

struct CustomCircleView: View{
    var radius: CGFloat
    var body: some View{
        CustomCircle()
            .fill(Color.gray)
            .frame(width: self.radius * 2, height: self.radius * 2)
            .overlay(
                Text("Habr")
                    .font(.largeTitle)
                    .foregroundColor(.green)
                )
    }
}

struct CustomCircleTestView: View {
    @State var radius: CGFloat = 50
    var body: some View {
        VStack{
                HStack{
                CircleView(radius: radius)
                    .frame(height: 200)
                CustomCircleView(radius: radius)
                    .frame(height: 200)
            }
            Slider(value: self.$radius, in: 42...100)
            Button(action: {
                withAnimation(.linear(duration: 1)){
                    self.radius = 50
                }
            }){
                Text("set default radius")
            }
        }
    }
}


рд╡рд╛рд╣! рд╣рдордиреЗ рд╕реАрдЦрд╛ рдХрд┐ рдХреИрд╕реЗ рдЕрдкрдиреЗ рд╕реНрд╡рдпрдВ рдХреЗ рдореБрдХреНрдд рд░реВрдк рдЪрд┐рддреНрд░ рдмрдирд╛рдПрдВ рдФрд░ рдЙрдиреНрд╣реЗрдВ рдЪреЗрддрди рдХрд░реЗрдВ! рдпрд╣ рдЗрд╕рд▓рд┐рдП рд╣реИ?

рдЬрд╝рд░реБрд░реА рдирд╣реАрдВред рдпрд╣рд╛рдБ рд╕рднреА рдХрд╛рдо .frame рд╕рдВрд╢реЛрдзрдХ (рдЪреМрдбрд╝рд╛рдИ: self.radius * 2, рдКрдВрдЪрд╛рдИ: self.radius * 2) рджреНрд╡рд╛рд░рд╛ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред WithAnimation block {...} рдХреЗ рдЕрдВрджрд░ рд╣рдо рдмрджрд▓рддреЗ рд╣реИрдВрд░рд╛рдЬреНрдпрдПрдХ рдЪрд░, рдпрд╣ рдПрдХ рдирдП рддреНрд░рд┐рдЬреНрдпрд╛ рдорд╛рди рдХреЗ рд╕рд╛рде CustomCircleView () рдХреЛ рдлрд┐рд░ рд╕реЗ рд╕рдВрдЧрдард┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рд╕рдВрдХреЗрдд рднреЗрдЬрддрд╛ рд╣реИ, рдпрд╣ рдирдпрд╛ (ред) рд╕рдВрд╢реЛрдзрдХ рдореЗрдВ рдЧрд┐рд░рддрд╛ рд╣реИ, рдФрд░ рдпрд╣ рд╕рдВрд╢реЛрдзрдХ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдкреИрд░рд╛рдореАрдЯрд░ рдмрджрд▓ рд╕рдХрддрд╛ рд╣реИред рд╣рдорд╛рд░рд╛ CustomCircle () рдлрд╝реЙрд░реНрдо рдПрдирд┐рдореЗрд╢рди рдХреЗ рд╕рд╛рде рдЗрд╕ рдкрд░ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдХрд░рддрд╛ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдЗрд╕рдХреЗ рд▓рд┐рдП рдЪреБрдиреЗ рдЧрдП рдХреНрд╖реЗрддреНрд░ рдХреЗ рдЖрдХрд╛рд░ рдХреЗ рдЕрд▓рд╛рд╡рд╛ рдХрд┐рд╕реА рдФрд░ рдЪреАрдЬрд╝ рдкрд░ рдирд┐рд░реНрднрд░ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред рдХреНрд╖реЗрддреНрд░ рдХреЛ рдмрджрд▓рдирд╛ рдПрдиреАрдореЗрд╢рди рдХреЗ рд╕рд╛рде рд╣реЛрддрд╛ рд╣реИ, (рдпрд╛рдиреА рдзреАрд░реЗ-рдзреАрд░реЗ, рдЗрд╕рдХреЗ рдмреАрдЪ рдХреЗ рдордзреНрдпрд╡рд░реНрддреА рдорд╛рдиреЛрдВ рдХреЛ рдкреНрд░рдХреНрд╖реЗрдкрд┐рдд рдХрд░рдирд╛-рдмрди рдЧрдпрд╛ рд╣реИ), рдЗрд╕рд▓рд┐рдП рд╣рдорд╛рд░рд╛ рд╕рд░реНрдХрд▓ рдПрдХ рд╣реА рдПрдиреАрдореЗрд╢рди рдХреЗ рд╕рд╛рде рддреИрдпрд╛рд░ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред

рдЪрд▓реЛ рд╕рд░рд▓ (рдпрд╛ рдЕрднреА рднреА рдЬрдЯрд┐рд▓?) рд╣рдорд╛рд░реЗ рдлрд╛рд░реНрдо рдереЛрдбрд╝рд╛ред рд╣рдо рдЙрдкрд▓рдмреНрдз рдХреНрд╖реЗрддреНрд░ рдХреЗ рдЖрдХрд╛рд░ рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рддреНрд░рд┐рдЬреНрдпрд╛ рдХреА рдЧрдгрдирд╛ рдирд╣реАрдВ рдХрд░реЗрдВрдЧреЗ, рд▓реЗрдХрд┐рди рд╣рдо рддреНрд░рд┐рдЬреНрдпрд╛ рдХреЛ рддреИрдпрд╛рд░ рд░реВрдк рдореЗрдВ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░реЗрдВрдЧреЗ, рдЕрд░реНрдерд╛рддред рдЗрд╕реЗ рдПрдХ рд╕рдВрдЧреНрд░рд╣реАрдд рд╕рдВрд░рдЪрдирд╛ рдкреИрд░рд╛рдореАрдЯрд░ рдмрдирд╛рдПрдВред

struct CustomCircle: Shape{
    var radius: CGFloat
    public func path(in rect: CGRect) -> Path{
        //let radius = min(rect.width, rect.height) / 2
...
    }
}

struct CustomCircleView: View{
    var radius: CGFloat
    var body: some View{
        CustomCircle(radius: radius)
            .fill(Color.gray)
            //.frame(height: self.radius * 2)
...
    }
}


рдЦреИрд░, рдЬрд╛рджреВ рдЕрдирд┐рдпрдорд┐рдд рд░реВрдк рд╕реЗ рдЦреЛ рдЧрдпрд╛ рд╣реИред

рд╣рдордиреЗ рдЕрдкрдиреЗ CustomCircleView () рд╕реЗ рдлреНрд░реЗрдо () рд╕рдВрд╢реЛрдзрдХ рдХреЛ рд╣рдЯрд╛ рджрд┐рдпрд╛, рд╕рд░реНрдХрд▓ рдХреЗ рдЖрдХрд╛рд░ рдХреЗ рд▓рд┐рдП рдЬрд┐рдореНрдореЗрджрд╛рд░реА рдХреЛ рдЖрдХрд╛рд░ рдореЗрдВ рд╣реА рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░ рджрд┐рдпрд╛, рдФрд░ рдПрдиреАрдореЗрд╢рди рдЧрд╛рдпрдм рд╣реЛ рдЧрдпрд╛ред рд▓реЗрдХрд┐рди рдЗрд╕рд╕реЗ рдХреЛрдИ рдлрд░реНрдХ рдирд╣реАрдВ рдкрдбрд╝рддрд╛ рд╣реИ; рдЕрдкрдиреЗ рдорд╛рдкрджрдВрдбреЛрдВ рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрди рдХреЛ рдЪреЗрддрди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рд░реВрдк рд╕рд┐рдЦрд╛рдирд╛ рдмрд╣реБрдд рдореБрд╢реНрдХрд┐рд▓ рдирд╣реАрдВ рд╣реИред рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ рдПрдирд┐рдореЗрдЯреЗрдб рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛рдУрдВ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ:

struct CustomCircle: Shape, Animatable{
    var animatableData: CGFloat{
         get{
             radius
         }
         set{
            print("new radius is \(newValue)")
            radius = newValue
         }
     }
    var radius: CGFloat
    public func path(in rect: CGRect) -> Path{
	...
}


рджреЗрдЦрд╛! рдЬрд╛рджреВ рдлрд┐рд░ рд╕реЗ рд╡рд╛рдкрд╕ рдЖ рдЧрдпрд╛ рд╣реИ!

рдФрд░ рдЕрдм рд╣рдо рдЖрддреНрдорд╡рд┐рд╢реНрд╡рд╛рд╕ рд╕реЗ рдХрд╣ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рд╣рдорд╛рд░рд╛ рд░реВрдк рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдПрдирд┐рдореЗрдЯреЗрдб рд╣реИ - рдпрд╣ рдПрдиреАрдореЗрд╢рди рдХреЗ рд╕рд╛рде рдЗрд╕рдХреЗ рдорд╛рдкрджрдВрдбреЛрдВ рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрди рдХреЛ рдкреНрд░рддрд┐рдмрд┐рдВрдмрд┐рдд рдХрд░ рд╕рдХрддрд╛ рд╣реИред рд╣рдордиреЗ рд╕рд┐рд╕реНрдЯрдо рдХреЛ рдПрдХ рд╡рд┐рдВрдбреЛ рджреА рдЬрд╣рд╛рдВ рд╡рд╣ рдПрдиреАрдореЗрд╢рди рдХреЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХ рдкреНрд░рдХреНрд╖реЗрдкрд┐рдд рдореВрд▓реНрдпреЛрдВ рдХреЛ рд░рдЯрдирд╛ рдХрд░ рд╕рдХрддрд╛ рд╣реИред рдпрджрд┐ рдРрд╕реА рдХреЛрдИ рдЦрд┐рдбрд╝рдХреА рд╣реИ, рддреЛ рдкрд░рд┐рд╡рд░реНрддрди рдПрдирд┐рдореЗрдЯреЗрдб рд╣реИрдВред рдпрджрд┐ рдпрд╣ рдирд╣реАрдВ рд╣реИ, рддреЛ рдкрд░рд┐рд╡рд░реНрддрди рдПрдиреАрдореЗрд╢рди рдХреЗ рдмрд┐рдирд╛ рд╣реЛрддреЗ рд╣реИрдВ, рдЕрд░реНрдерд╛рддреНред рд╣рд╛рдереЛрдВ рд╣рд╛рдеред рдХреБрдЫ рднреА рдЬрдЯрд┐рд▓ рдирд╣реАрдВ рд╣реИ, рд╣реИ рдирд╛?

AnimatableModifier


рдПрдХ рджреГрд╢реНрдп рдХреЗ рдЕрдВрджрд░ рдкрд░рд┐рд╡рд░реНрддрди рдХреИрд╕реЗ рдЪреЗрддрди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП


рд▓реЗрдХрд┐рди рдЪрд▓реЛ рд╕реАрдзреЗ рджреЗрдЦреЗрдВред рдорд╛рди рд▓реАрдЬрд┐рдП рдХрд┐ рд╣рдо рдПрдХ рдХрдВрдЯреЗрдирд░ рдХреЗ рдЕрдВрджрд░ рдПрдХ рддрддреНрд╡ рдХреА рд╕реНрдерд┐рддрд┐ рдХреЛ рдЪреЗрддрди рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВред рд╣рдорд╛рд░реЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рдпрд╣ рд╣рд░реЗ рд░рдВрдЧ рдХреА рдПрдХ рд╕рд░рд▓ рдЖрдпрдд рдФрд░ 10 рдЗрдХрд╛рдЗрдпреЛрдВ рдХреА рдЪреМрдбрд╝рд╛рдИ рд╣реЛрдЧреАред рд╣рдо рдЗрд╕рдХреА рдХреНрд╖реИрддрд┐рдЬ рд╕реНрдерд┐рддрд┐ рдХреЛ рдЪреЗрддрди рдХрд░реЗрдВрдЧреЗред

struct SimpleView: View{
    @State var position: CGFloat = 0
    var body: some View{
        VStack{
            ZStack{
                Rectangle()
                    .fill(Color.gray)
                BorderView(position: position)
            }
            Slider(value: self.$position, in: 0...1)
            Button(action: {
                withAnimation(.linear(duration: 1)){
                    self.position = 0
                }
            }){
                Text("set to 0")
            }
        }
    }
}

struct BorderView: View,  Animatable{
    public var animatableData: CGFloat {
        get {
            print("Reding position: \(position)")
            return self.position
        }
        set {
            self.position = newValue
            print("setting position: \(position)")
        }
    }
    let borderWidth: CGFloat
    init(position: CGFloat, borderWidth: CGFloat = 10){
        self.position = position
        self.borderWidth = borderWidth
        print("BorderView init")
    }
    var position: CGFloat
    var body: some View{
        GeometryReader{geometry in
            Rectangle()
                .fill(Color.green)
                .frame(width: self.borderWidth)
                .offset(x: self.getXOffset(inSize: geometry.size), y: 0)
                // .borderIn(position: position)
        }
    }
    func getXOffset(inSize: CGSize) -> CGFloat{
        print("calculating position: \(position)")
        return -inSize.width / 2 + inSize.width * position
    }
}


рдХрдХреНрд╖рд╛! рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ! рдЕрдм рд╣рдо рдПрдиреАрдореЗрд╢рди рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╕рдм рдХреБрдЫ рдЬрд╛рдирддреЗ рд╣реИрдВ!

рдЬрд╝рд░реБрд░реА рдирд╣реАрдВред рдпрджрд┐ рдЖрдк рдХрдВрд╕реЛрд▓ рдХреЛ рджреЗрдЦрддреЗ рд╣реИрдВ, рддреЛ рд╣рдо рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рджреЗрдЦреЗрдВрдЧреЗ:
рдмреЙрд░реНрдбрд░ рд╡реНрдпреВ рдЗрдирд┐рдЯ
рдХреИрд▓рдХреБрд▓реЗрдЯрд┐рдВрдЧ рдкреЛрдЬрд┐рд╢рди: 0.4595176577568054
рдмреЙрд░реНрдбрд░ рд╡реНрдпреВ рдЗрдирд┐рдЯ
рдХреИрд▓рдХреБрд▓реЗрдЯрд┐рдВрдЧ рдкреЛрдЬрд┐рд╢рди: 0.468130886554718
рдмреЙрд░реНрдбрд░ рд╡реНрдпреВ рдЗрдирд┐рдЯ
рдХреИрд▓рдХреБрд▓реЗрдЯрд┐рдВрдЧ рдкреЛрдЬрд┐рд╢рди: 0.0

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

рджреВрд╕рд░реЗ, рд╣рдо рджреЗрдЦрддреЗ рд╣реИрдВ рдХрд┐ рдЧрдгрдирд╛ рдХреА рд╕реНрдерд┐рддрд┐ рдХреЗрд╡рд▓ 0 рдХреЗ рдмрд░рд╛рдмрд░ рд╣реЛ рдЧрдИ рд╣реИ, рдФрд░ рдХреЛрдИ рдордзреНрдпрд╡рд░реНрддреА рд▓реЙрдЧ рдирд╣реАрдВ рд╣реИ, рдЬреИрд╕рд╛ рдХрд┐ рд╕рд░реНрдХрд▓ рдХреЗ рд╕рд╣реА рдПрдиреАрдореЗрд╢рди рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ рдерд╛ред рдХреНрдпреЛрдВ?

рдкрд┐рдЫрд▓реЗ рдЙрджрд╛рд╣рд░рдг рдХреЗ рд░реВрдк рдореЗрдВ рдмрд╛рдд, рд╕рдВрд╢реЛрдзрдХ рдореЗрдВ рд╣реИред рдЗрд╕ рдмрд╛рд░, .offset () рд╕рдВрд╢реЛрдзрдХ рдХреЛ рдирдпрд╛ рдЗрдВрдбреЗрдВрдЯ рд╡реИрд▓реНрдпреВ рдорд┐рд▓рддрд╛ рд╣реИ, рдФрд░ рдпрд╣ рдкрд░рд┐рд╡рд░реНрддрди рдХреЛ рд╕реНрд╡рдпрдВ рд╣реА рдПрдирд┐рдореЗрдЯ рдХрд░рддрд╛ рд╣реИред рдЙрдиред рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рдпрд╣ рдЙрд╕ рд╕реНрдерд┐рддрд┐ рдкреИрд░рд╛рдореАрдЯрд░ рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрди рдирд╣реАрдВ рд╣реИ, рдЬрд┐рд╕реЗ рд╣рдо рдПрдирд┐рдореЗрдЯреЗрдб рдХрд░рдиреЗ рдХрд╛ рдЗрд░рд╛рджрд╛ рд░рдЦрддреЗ рдереЗ, рд▓реЗрдХрд┐рди рдЗрд╕рд╕реЗ рдкреНрд░рд╛рдкреНрдд рдХрд┐рдП рдЧрдП .offset () рд╕рдВрд╢реЛрдзрдХ рдореЗрдВ рдЗрдВрдбреЗрдВрдЯ рдХреЗ рдХреНрд╖реИрддрд┐рдЬ рдкрд░рд┐рд╡рд░реНрддрдиред рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ, рдпрд╣ рдПрдХ рд╣рд╛рдирд┐рд░рд╣рд┐рдд рдкреНрд░рддрд┐рд╕реНрдерд╛рдкрди рд╣реИ, рдкрд░рд┐рдгрд╛рдо рд╕рдорд╛рди рд╣реИред рд▓реЗрдХрд┐рди рдЬрдм рд╕реЗ рд╡реЗ рдЖрдП рд╣реИрдВ, рдЪрд▓реЛ рдЧрд╣рд░реА рдЦреБрджрд╛рдИ рдХрд░рддреЗ рд╣реИрдВред рдЪрд▓реЛ рдЕрдкрдирд╛ рдЦреБрдж рдХрд╛ рд╕рдВрд╢реЛрдзрдХ рдмрдирд╛рддреЗ рд╣реИрдВ, рдЬреЛ рдЗрдирдкреБрдЯ рдкрд░ рд╕реНрдерд┐рддрд┐ (0 рд╕реЗ 1 рддрдХ) рдкреНрд░рд╛рдкреНрдд рдХрд░реЗрдЧрд╛, рдпрд╣ рдЙрдкрд▓рдмреНрдз рдХреНрд╖реЗрддреНрд░ рдХреЗ рдЖрдХрд╛рд░ рдХреЛ рдкреНрд░рд╛рдкреНрдд рдХрд░реЗрдЧрд╛ рдФрд░ рдЗрдВрдбреЗрдВрдЯ рдХреА рдЧрдгрдирд╛ рдХрд░реЗрдЧрд╛ред

struct BorderPosition: ViewModifier{
    var position: CGFloat
    func body(content: Content) -> some View {
        GeometryReader{geometry in
            content
            .offset(x: self.getXOffset(inSize: geometry.size), y: 0)
            .animation(nil)
        }
    }
    func getXOffset(inSize: CGSize) -> CGFloat{
        let offset = -inSize.width / 2 + inSize.width * position
        print("at position  \(position) offset is \(offset)")
        return offset
    }
}

extension View{
    func borderIn(position: CGFloat) -> some View{
        self.modifier(BorderPosition(position: position))
    }
}

рдореВрд▓ рдмреЙрд░реНрдбрд░рд╡реНрдпреВ рдореЗрдВ, рдХреНрд░рдорд╢рдГ, рдЬреНрдпрд╛рдорд┐рддрд┐ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ, рд╕рд╛рде рд╣реА рдЗрдВрдбреЗрдВрдЯ рдХреА рдЧрдгрдирд╛ рдХреЗ рд▓рд┐рдП рдлрд╝рдВрдХреНрд╢рди:

struct BorderView: View,  Animatable{
    ...
    var body: some View{
            Rectangle()
                .fill(Color.green)
                .frame(width: self.borderWidth)
                .borderIn(position: position)
    }
}


рд╣рд╛рдВ, рд╣рдо рдЕрднреА рднреА рдЕрдкрдиреЗ рд╕рдВрд╢реЛрдзрдХ рдХреЗ рдЕрдВрджрд░ .offset () рд╕рдВрд╢реЛрдзрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдЗрд╕рдХреЗ рдмрд╛рдж рд╣рдордиреЗ .animation (nil) рд╕рдВрд╢реЛрдзрдХ рдХреЛ рдЬреЛрдбрд╝рд╛, рдЬреЛ рд╣рдорд╛рд░реЗ рд╕реНрд╡рдпрдВ рдХреЗ рдСрдлрд╕реЗрдЯ рдПрдиреАрдореЗрд╢рди рдХреЛ рдЕрд╡рд░реБрджреНрдз рдХрд░рддрд╛ рд╣реИред рдореИрдВ рд╕рдордЭрддрд╛ рд╣реВрдВ рдХрд┐ рдЗрд╕ рд╕реНрддрд░ рдкрд░ рдЖрдк рдпрд╣ рддрдп рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдпрд╣ рддрд╛рд▓рд╛ рд╣рдЯрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдкрд░реНрдпрд╛рдкреНрдд рд╣реИ, рд▓реЗрдХрд┐рди рддрдм рд╣рдо рд╕рдЪреНрдЪрд╛рдИ рдХреА рддрд╣ рддрдХ рдирд╣реАрдВ рдкрд╣реБрдВрдЪреЗрдВрдЧреЗред рдФрд░ рд╕рдЪреНрдЪрд╛рдИ рдпрд╣ рд╣реИ рдХрд┐ BorderView рдХреЗ рд▓рд┐рдП animatableData рдХреЗ рд╕рд╛рде рд╣рдорд╛рд░реА рдЪрд╛рд▓ рдХрд╛рдо рдирд╣реАрдВ рдХрд░рддреА рд╣реИред рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рдпрджрд┐ рдЖрдк рдПрдирд┐рдореЗрдЯреЗрдмрд▓ рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рдХреЗ рд▓рд┐рдП рджрд╕реНрддрд╛рд╡реЗрдЬрд╝реАрдХрд░рдг рдХреЛ рджреЗрдЦрддреЗ рд╣реИрдВ , рддреЛ рдЖрдк рджреЗрдЦреЗрдВрдЧреЗ рдХрд┐ рдЗрд╕ рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЛ рдХреЗрд╡рд▓ рдПрдирд┐рдореЗрдЯреЗрдмрд▓рдореЛрдбрд┐рдлрд╛рдпрд░, рдЬрд┐рдпреЛрдореЗрдЯреНрд░реАрдлреИрдХреНрдЯ рдФрд░ рд╢реЗрдк рдХреЗ рд▓рд┐рдП рд╕рдорд░реНрдерд┐рдд рд╣реИред рджреГрд╢реНрдп рдЙрдирдореЗрдВ рд╕реЗ рдирд╣реАрдВ рд╣реИред

рд╕рд╣реА рджреГрд╖реНрдЯрд┐рдХреЛрдг рдЪреЗрддрди рд╕рдВрд╢реЛрдзрдиреЛрдВ рдХреЗ рд▓рд┐рдП рд╣реИ


рдЬрдм рд╣рдо рдХреБрдЫ рдкрд░рд┐рд╡рд░реНрддрдиреЛрдВ рдХреЛ рдЪреЗрддрди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд╣рддреЗ рд╣реИрдВ, рддреЛ рдпрд╣ рджреГрд╖реНрдЯрд┐рдХреЛрдг рд╣реА рдЧрд▓рдд рдерд╛ред рджреГрд╢реНрдп рдХреЗ рд▓рд┐рдП, рдЖрдк рдкреНрд░рдкрддреНрд░реЛрдВ рдХреЗ рд▓рд┐рдП рдЙрд╕реА рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдЗрд╕рдХреЗ рдмрдЬрд╛рдп, рдПрдиреАрдореЗрд╢рди рдХреЛ рдкреНрд░рддреНрдпреЗрдХ рд╕рдВрд╢реЛрдзрдХ рдореЗрдВ рдПрдореНрдмреЗрдб рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред рдЕрдзрд┐рдХрд╛рдВрд╢ рдмрд┐рд▓реНрдЯ-рдЗрди рдореЙрдбрд┐рдлрд╝рд╛рдпрд░ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдмреЙрдХреНрд╕ рд╕реЗ рдмрд╛рд╣рд░ рдПрдиреАрдореЗрд╢рди рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рддреЗ рд╣реИрдВред рдпрджрд┐ рдЖрдк рдЕрдкрдиреЗ рд╕реНрд╡рдпрдВ рдХреЗ рд╕рдВрд╢реЛрдзрдХ рдХреЗ рд▓рд┐рдП рдПрдиреАрдореЗрд╢рди рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рддреЛ рдЖрдк ViewModifier рдХреЗ рдмрдЬрд╛рдп AnimatableModifier рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдФрд░ рд╡рд╣рд╛рдВ рдЖрдк рдЙрд╕реА рдЪреАрдЬрд╝ рдХреЛ рд▓рд╛рдЧреВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдЬреИрд╕реЗ рдХрд┐ рдЖрдХрд╛рд░ рдмрджрд▓рдиреЗ рдХреЗ рджреМрд░рд╛рди рдПрдирд┐рдореЗрдЯ рдХрд░рдирд╛, рдЬреИрд╕рд╛ рдХрд┐ рд╣рдордиреЗ рдКрдкрд░ рдХрд┐рдпрд╛ рдерд╛ред

struct BorderPosition: AnimatableModifier {
    var position: CGFloat
    let startDate: Date = Date()
    public var animatableData: CGFloat {
        get {
            print("reading position: \(position) at time \(Date().timeIntervalSince(startDate))")
            return position
        }
        set {
            position = newValue
            print("setting position: \(position) at time \(Date().timeIntervalSince(startDate))")
        }
    }
    func body(content: Content) -> some View {
...
    }
    ...
}


рдЕрдм рд╕рдм рдХреБрдЫ рд╕рд╣реА рд╣реИред рдХрдВрд╕реЛрд▓ рдореЗрдВ рд╕рдВрджреЗрд╢ рдпрд╣ рд╕рдордЭрдиреЗ рдореЗрдВ рдорджрдж рдХрд░рддреЗ рд╣реИрдВ рдХрд┐ рд╣рдорд╛рд░рд╛ рдПрдиреАрдореЗрд╢рди рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ, рдФрд░ рд╕рдВрд╢реЛрдзрдХ рдХреЗ рдЕрдВрджрд░ .animation (nil) рдЗрд╕рдореЗрдВ рдмрд┐рд▓реНрдХреБрд▓ рднреА рд╣рд╕реНрддрдХреНрд╖реЗрдк рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред рд▓реЗрдХрд┐рди рдЪрд▓реЛ рдЕрднреА рднреА рдпрд╣ рдкрддрд╛ рд▓рдЧрд╛рддреЗ рд╣реИрдВ рдХрд┐ рдпрд╣ рдХреИрд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред

рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рдЖрдкрдХреЛ рдпрд╣ рд╕рдордЭрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рдХрд┐ рдПрдХ рд╕рдВрд╢реЛрдзрдХ рдХреНрдпрд╛ рд╣реИред


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

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

рдкрд┐рдЫрд▓реЗ рд▓реЗрдЦ рдореЗрдВ, рдореИрдВрдиреЗ рдХрд╣рд╛ рдерд╛ рдХрд┐ рдирд┐рд░реНрджреЗрд╢ рд╕реНрд╡рдпрдВ рд╕рдВрдЧреНрд░рд╣реАрдд рдирд╣реАрдВ рд╣реИ, рдХрд┐ рдпрд╣ рд╣рд░ рдмрд╛рд░ рджреГрд╢реНрдп рдЕрдкрдбреЗрдЯ рд╣реЛрдиреЗ рдХреЗ рдмрд╛рдж рдлреЗрдВрдХрд╛ рдЬрд╛рддрд╛ рд╣реИред рд╕рдм рдХреБрдЫ рд╣реИ, рд▓реЗрдХрд┐рди рдПрдХ рдЕрддрд┐ рд╕реВрдХреНрд╖реНрдо рдЕрдВрддрд░ рд╣реИред рдЗрд╕ рдирд┐рд░реНрджреЗрд╢ рдХреЗ рдХрд╛рдо рдХреЗ рдкрд░рд┐рдгрд╛рдорд╕реНрд╡рд░реВрдк, рд╣рдореЗрдВ рдХрд╛рдлреА рддрд╕реНрд╡реАрд░ рдирд╣реАрдВ рдорд┐рд▓рддреА рд╣реИ, рдЬреИрд╕рд╛ рдХрд┐ рдореИрдВрдиреЗ рдкрд╣рд▓реЗ рдХрд╣рд╛ рдерд╛ - рдпрд╣ рдПрдХ рд╕рд░рд▓реАрдХрд░рдг рдерд╛ред рдЗрд╕ рдирд┐рд░реНрджреЗрд╢ рдХреЗ рд╕рдВрдЪрд╛рд▓рди рдХреЗ рдмрд╛рдж рд╕рдВрд╢реЛрдзрдХ рдЧрд╛рдпрдм рдирд╣реАрдВ рд╣реЛрддреЗ рд╣реИрдВред рдкреИрд░реЗрдВрдЯ рд╡реНрдпреВ рдореМрдЬреВрдж рд╣реЛрдиреЗ рдХреЗ рджреМрд░рд╛рди рд╡реЗ рдРрд╕реЗ рд╣реА рд░рд╣рддреЗ рд╣реИрдВред

рдХреБрдЫ рдЖрджрд┐рдо рдЙрдкрдорд╛рдПрдБ


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

.Modifier (BorderPosition (рд╕реНрдерд┐рддрд┐: рд╕реНрдерд┐рддрд┐)) рдлрд╝рдВрдХреНрд╢рди, рдЬрд┐рд╕рдХреЗ рд╕рд╛рде рд╣рдордиреЗ рд╕реАрдорд╛ рд╕рдВрд░рдЪрдирд╛ рдХреЛ рдПрдХ рд╕рдВрд╢реЛрдзрдХ рдореЗрдВ рдмрджрд▓ рджрд┐рдпрд╛, рдХреЗрд╡рд▓ рддрд╛рд▓рд┐рдХрд╛ рдкреИрд░ рдХреЗ рд▓рд┐рдП рджрд░рд╛рдЬ рдореЗрдВ рдПрдХ рдЕрддрд┐рд░рд┐рдХреНрдд рдкреЗрдВрдЪ рдбрд╛рд▓рддрд╛ рд╣реИред BorderPosition рд╕рдВрд░рдЪрдирд╛ рдпрд╣ рдкреЗрдВрдЪ рд╣реИред рд░реЗрдВрдбрд░рд┐рдВрдЧ рдХреЗ рд╕рдордп, рд░реЗрдВрдбрд░ рдЗрд╕ рдмреЙрдХреНрд╕ рдХреЛ рд▓реЗрддрд╛ рд╣реИ, рдЗрд╕рдореЗрдВ рд╕реЗ рдПрдХ рдкреИрд░ рдирд┐рдХрд╛рд▓рддрд╛ рд╣реИ (рд░реЗрдХреНрдЯреЗрдВрдЧрд▓ (рд╣рдорд╛рд░реЗ рдорд╛рдорд▓реЗ рдореЗрдВ)), рдФрд░ рдХреНрд░рдорд┐рдХ рд░реВрдк рд╕реЗ рд╕реВрдЪреА рд╕реЗ рд╕рднреА рд╕рдВрд╢реЛрдзрдХ рдкреНрд░рд╛рдкреНрдд рд╣реЛрддреЗ рд╣реИрдВ, рдЬрд┐рд╕рдореЗрдВ рдЙрдирдореЗрдВ рд╕рдВрдЧреНрд░рд╣реАрдд рдорд╛рди рд╣реЛрддреЗ рд╣реИрдВред рдкреНрд░рддреНрдпреЗрдХ рд╕рдВрд╢реЛрдзрдХ рдХрд╛ рд╢рд░реАрд░ рдХрд╛рд░реНрдп рдЗрд╕ рдкреЗрдВрдЪ рдХреЗ рд╕рд╛рде рдПрдХ рдЯреЗрдмрд▓рдЯреЙрдк рдХреЗ рд▓рд┐рдП рдПрдХ рдкреИрд░ рдХреЛ рдкреЗрдВрдЪ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдирд┐рд░реНрджреЗрд╢ рд╣реИ, рдФрд░ рд╕рдВрдЧреНрд░рд╣реАрдд рдЧреБрдгреЛрдВ рдХреЗ рд╕рд╛рде рд╕реНрд╡рдпрдВ рд╕рдВрд░рдЪрдирд╛, рдпрд╣ рд╡рд╣ рдкреЗрдВрдЪ рд╣реИред

рдПрдиреАрдореЗрд╢рди рдХреЗ рд╕рдВрджрд░реНрдн рдореЗрдВ рдЗрд╕реЗ рд╕рдордЭрдирд╛ рдХреНрдпреЛрдВ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИ? рдХреНрдпреЛрдВрдХрд┐ рдПрдиреАрдореЗрд╢рди рдЖрдкрдХреЛ рджреВрд╕рд░реЛрдВ рдХреЛ рдкреНрд░рднрд╛рд╡рд┐рдд рдХрд┐рдП рдмрд┐рдирд╛ рдПрдХ рд╕рдВрд╢реЛрдзрдХ рдХреЗ рдорд╛рдкрджрдВрдбреЛрдВ рдХреЛ рдмрджрд▓рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ, рдФрд░ рдлрд┐рд░ рдЫрд╡рд┐ рдХреЛ рдлрд┐рд░ рд╕реЗ рдкреНрд░рд╕реНрддреБрдд рдХрд░рддрд╛ рд╣реИред рдЕрдЧрд░ рдЖрдк рдХреБрдЫ рдмрджрд▓рдХрд░ рднреА рдРрд╕рд╛ рд╣реА рдХрд░рддреЗ рд╣реИрдВ@StateрдкреИрд░рд╛рдореАрдЯрд░ - рдпрд╣ рдиреЗрд╕реНрдЯреЗрдб рд╡реНрдпреВ, рд╕рдВрд╢реЛрдзрдХ рд╕рдВрд░рдЪрдирд╛рдУрдВ, рдФрд░ рдЗрд╕реА рддрд░рд╣, рдЪреЗрди рдХреЗ рд╕рд╛рде рд╕рднреА рдХреЗ рд╕реБрджреГрдвреАрдХрд░рдг рдХрд╛ рдХрд╛рд░рдг рд╣реЛрдЧрд╛ред рд▓реЗрдХрд┐рди рдПрдиреАрдореЗрд╢рди рдирд╣реАрдВ рд╣реИред

рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рдЬрдм рд╣рдо рдПрдХ рдмрдЯрди рджрдмрд╛рддреЗ рд╣реИрдВ рддреЛ рд╕реНрдерд┐рддрд┐ рдХрд╛ рдореВрд▓реНрдп рдмрджрд▓ рдЬрд╛рддрд╛ рд╣реИ, рдпрд╣ рдмрджрд▓ рдЬрд╛рддрд╛ рд╣реИред рдЕрдВрдд рдХрд╛ рдЕрдзрд┐рдХрд╛рд░ред рдХреЛрдИ рднреА рдордзреНрдпрд╡рд░реНрддреА рд░рд╛рдЬреНрдп рдЪрд░ рдореЗрдВ рд╣реА рд╕рдВрдЧреНрд░рд╣реАрдд рдирд╣реАрдВ рд╣реИ, рдЬрд┐рд╕реЗ рд╕рдВрд╢реЛрдзрдХ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдирд╣реАрдВ рдХрд╣рд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдкреНрд░рддреНрдпреЗрдХ рдирдП рдлреНрд░реЗрдо рдХреЗ рд▓рд┐рдП, рд╡рд░реНрддрдорд╛рди рдорд╛рдирджрдВрдб рдХреА рдкреНрд░рдЧрддрд┐ рдХреЗ рдЕрдиреБрд╕рд╛рд░ рд╕рдВрд╢реЛрдзрдХ рдорд╛рдкрджрдВрдбреЛрдВ рдХреЗ рдореВрд▓реНрдп рдмрджрд▓рддреЗ рд╣реИрдВред рдпрджрд┐ рдПрдиреАрдореЗрд╢рди 1 рд╕реЗрдХрдВрдб рддрдХ рд░рд╣рддрд╛ рд╣реИ, рддреЛ рдкреНрд░рддреНрдпреЗрдХ рд╕реЗрдХрдВрдб рдХрд╛ 1/60 (iphone рдкреНрд░рддрд┐ рд╕реЗрдХрдВрдб рдлрд╝реНрд░реЗрдо рдХреА рд╕рдВрдЦреНрдпрд╛ рджрд┐рдЦрд╛рддрд╛ рд╣реИ), рд╕рдВрд╢реЛрдзрдХ рдХреЗ рдЕрдВрджрд░ рдХреА рдЬрд╛рдиреЗ рд╡рд╛рд▓реА animatableData рдорд╛рди рдмрджрд▓ рдЬрд╛рдПрдЧрд╛, рдлрд┐рд░ рдЗрд╕реЗ рд░реЗрдВрдбрд░рд┐рдВрдЧ рдХреЗ рд▓рд┐рдП рд░реЗрдВрдбрд░ рджреНрд╡рд╛рд░рд╛ рдкрдврд╝рд╛ рдЬрд╛рдПрдЧрд╛, рдЬрд┐рд╕рдХреЗ рдмрд╛рдж, рдПрдХ рджреВрд╕рд░реЗ рдХреЗ 1/60 рдХреЗ рдмрд╛рдж рдпрд╣ рд╣реЛрдЧрд╛ рдлрд┐рд░ рд╕реЗ рдмрджрд▓ рджрд┐рдпрд╛, рдФрд░ рд░реЗрдВрдбрд░ рджреНрд╡рд╛рд░рд╛ рдлрд┐рд░ рд╕реЗ рдкрдврд╝рд╛ред

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

рдЕрдВрддрд░ =

рд╕реНрдЯреАрд▓
- рдХреНрдпрд╛ рд╡рд░реНрддрдорд╛рди рдореВрд▓реНрдп = рд╕реНрдЯреАрд▓ - рдЕрдВрддрд░ * (1 - рд╕рдордп рд╡реНрдпрддреАрдд ) рд╕рдордп рдмреАрддрд╛ рд╣реБрдЖ = рдкреНрд░рд╛рд░рдВрдн рд╕реЗ рд╕рдордп / рдЕрд╡рдзрд┐ / рд╕рдордпред

рд╡рд░реНрддрдорд╛рди рдореВрд▓реНрдп рдХреЛ рдХрдИ рдмрд╛рд░ рдЧрдгрдирд╛ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рд╣рдореЗрдВ рдЬрд┐рддрдиреЗ рдлреНрд░реЗрдо рджрд┐рдЦрд╛рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред

"рд╡рд╛рд╕" рдХрд╛ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдЙрдкрдпреЛрдЧ рдХреНрдпреЛрдВ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЧрдпрд╛? рддрдереНрдп рдпрд╣ рд╣реИ рдХрд┐ SwiftUI рдкреНрд░рд╛рд░рдВрднрд┐рдХ рдЕрд╡рд╕реНрдерд╛ рдХреЛ рд╕рдВрдЧреНрд░рд╣реАрдд рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред рдХреЗрд╡рд▓ рдЕрдВрддрд░ рд╕рдВрдЧреНрд░рд╣реАрдд рд╣реИ: рдЗрд╕рд▓рд┐рдП, рдХрд┐рд╕реА рдкреНрд░рдХрд╛рд░ рдХреА рд╡рд┐рдлрд▓рддрд╛ рдХреА рд╕реНрдерд┐рддрд┐ рдореЗрдВ, рдЖрдк рдмрд╕ рдПрдиреАрдореЗрд╢рди рдХреЛ рдмрдВрдж рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдФрд░ "рдмрди" рдХреА рд╡рд░реНрддрдорд╛рди рд╕реНрдерд┐рддрд┐ рдореЗрдВ рдЬрд╛ рд╕рдХрддреЗ рд╣реИрдВред

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

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

рдХрдИ рдорд╛рдкрджрдВрдбреЛрдВ


рдЗрд╕ рдХреНрд╖рдг рддрдХ, рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдПрдиреАрдореЗрд╢рди рдХреЗ рд▓рд┐рдП рдХреЗрд╡рд▓ рдПрдХ рдкреИрд░рд╛рдореАрдЯрд░ рдерд╛ред рд╕рд╡рд╛рд▓ рдЙрда рд╕рдХрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдХреНрдпрд╛ рд╣реЛрдЧрд╛ рдЕрдЧрд░ рдПрдХ рд╕реЗ рдЕрдзрд┐рдХ рдкреИрд░рд╛рдореАрдЯрд░ рдХреЛ рд╕рдВрд╢реЛрдзрдХ рдХреЗ рд▓рд┐рдП рдкрд╛рд░рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдП? рдФрд░ рдЕрдЧрд░ рджреЛрдиреЛрдВ рдХреЛ рдПрдХ рд╣реА рд╕рдордп рдореЗрдВ рдПрдирд┐рдореЗрдЯреЗрдб рд╣реЛрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ? рдпрд╣рд╛рдБ рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП рдлреНрд░реЗрдо рд╕рдВрд╢реЛрдзрдХ (рдЪреМрдбрд╝рд╛рдИ: рдКрдВрдЪрд╛рдИ :) рдХреЗ рд╕рд╛рде рдХреИрд╕реЗ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдЖрдЦрд┐рд░рдХрд╛рд░, рд╣рдо рдПрдХ рд╕рд╛рде рдЗрд╕ рджреГрд╢реНрдп рдХреА рдЪреМрдбрд╝рд╛рдИ рдФрд░ рдКрдВрдЪрд╛рдИ рджреЛрдиреЛрдВ рдХреЛ рдмрджрд▓ рд╕рдХрддреЗ рд╣реИрдВ, рдФрд░ рд╣рдо рдЪрд╛рд╣рддреЗ рд╣реИрдВ рдХрд┐ рдкрд░рд┐рд╡рд░реНрддрди рдПрдХ рдПрдиреАрдореЗрд╢рди рдореЗрдВ рдШрдЯрд┐рдд рд╣реЛ, рдЗрд╕реЗ рдХреИрд╕реЗ рдХрд░реЗрдВ? рд╕рдм рдХреЗ рдмрд╛рдж, AnimatableData рдкреИрд░рд╛рдореАрдЯрд░ рдПрдХ рд╣реИ, рдореИрдВ рдЗрд╕рдореЗрдВ рдХреНрдпрд╛ рд╕реНрдерд╛рдирд╛рдкрдиреНрди рдХрд░ рд╕рдХрддрд╛ рд╣реВрдВ?

рдпрджрд┐ рдЖрдк рджреЗрдЦрддреЗ рд╣реИрдВ, рддреЛ Apple рдХреЗ рдкрд╛рд╕ animatableData рдХреЗ рд▓рд┐рдП рдХреЗрд╡рд▓ рдПрдХ рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдбреЗрдЯрд╛ рдкреНрд░рдХрд╛рд░ рдЬрд┐рд╕реЗ рдЖрдк рдЗрд╕рдореЗрдВ рдкреНрд░рддрд┐рд╕реНрдерд╛рдкрд┐рдд рдХрд░рддреЗ рд╣реИрдВ, рдЙрд╕реЗ рд╡реЗрдХреНрдЯрд░рдЕрд░рд┐рдердореЗрдЯрд┐рдХ рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рдХреЛ рдкреВрд░рд╛ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред рдЗрд╕ рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рдХреЛ рдиреНрдпреВрдирддрдо рдЕрдВрдХрдЧрдгрд┐рддреАрдп рд╕рдВрдЪрд╛рд▓рди рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╡рд╕реНрддреБ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ рдЬреЛ рджреЛ рдореВрд▓реНрдпреЛрдВ рдХреЗ рдПрдХ рдЦрдВрдб рдХреЛ рдмрдирд╛рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛрдиреЗ рдХреЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХ рд╣реИрдВ, рдФрд░ рдЗрд╕ рдЦрдВрдб рдХреЗ рдЕрдВрджрд░ рдмрд┐рдВрджреБрдУрдВ рдХреЛ рдкреНрд░рдХреНрд╖реЗрдкрд┐рдд рдХрд░рддреЗ рд╣реИрдВред рдЗрд╕рдХреЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХ рд╕рдВрдЪрд╛рд▓рди рдЗрд╕рдХреЗ рдЕрддрд┐рд░рд┐рдХреНрдд, рдШрдЯрд╛рд╡ рдФрд░ рдЧреБрдгрд╛ рд╣реИред рдХрдард┐рдирд╛рдИ рдпрд╣ рд╣реИ рдХрд┐ рд╣рдореЗрдВ рдЗрди рдкрд░рд┐рдЪрд╛рд▓рдиреЛрдВ рдХреЛ рдПрдХ рд╣реА рд╡рд╕реНрддреБ рдХреЗ рд╕рд╛рде рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП рдЬреЛ рдХрдИ рдорд╛рдкрджрдВрдбреЛрдВ рдХреЛ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░рддрд╛ рд╣реИред рдЙрдиред рд╣рдореЗрдВ рдЕрдкрдиреЗ рдорд╛рдкрджрдВрдбреЛрдВ рдХреА рдкреВрд░реА рд╕реВрдЪреА рдХреЛ рдПрдХ рдХрдВрдЯреЗрдирд░ рдореЗрдВ рдкреИрдХ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ рдЬреЛ рдПрдХ рд╡реЗрдХреНрдЯрд░ рд╣реЛрдЧрд╛ред рдРрдкреНрдкрд▓ рдмреЙрдХреНрд╕ рд╕реЗ рдмрд╛рд╣рд░ рдПрдХ рдРрд╕реА рд╡рд╕реНрддреБ рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИ, рдФрд░ рд╣рдореЗрдВ рдмрд╣реБрдд рдореБрд╢реНрдХрд┐рд▓ рдорд╛рдорд▓реЛрдВ рдХреЗ рд▓рд┐рдП рдЯрд░реНрдирдХреА рд╕рдорд╛рдзрд╛рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдкреЗрд╢рдХрд╢ рдХрд░рддрд╛ рд╣реИред рдЗрд╕реЗ рдПрдирд┐рдореЗрдЯреЗрдмрд▓рдкреЗрдпрд░ рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИред

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

struct TwoParameterBorder: AnimatableModifier {
    var position: CGFloat
    var height: CGFloat
    let startDate: Date = Date()
    public var animatableData: AnimatablePair<CGFloat, CGFloat> {
        get {
           print("animation read position: \(position), height: \(height)")
           return AnimatablePair(position, height)
        }
        set {
            self.position = newValue.first
            print("animating position at \(position)")
            self.height = newValue.second
            print("animating height at \(height)")
        }
    }
    init(position: CGFloat, height: CGFloat){
        self.position = position
        self.height = height
    }
    func body(content: Content) -> some View {
        GeometryReader{geometry in
            content
                .animation(nil)
                .offset(x: -geometry.size.width / 2 + geometry.size.width * self.position, y: 0)
                .frame(height: self.height * (geometry.size.height - 20) + 20)
        }
    }
}


рдореИрдВрдиреЗ рдПрдХ рдФрд░ рд╕реНрд▓рд╛рдЗрдбрд░ рдФрд░ рд╕рд┐рдВрдкрд▓ рд╡реНрдпреВ рдХреЗ рдореВрд▓ рджреГрд╢реНрдп рдореЗрдВ рдПрдХ рдмрд╛рд░ рдореЗрдВ рджреЛрдиреЛрдВ рдорд╛рдкрджрдВрдбреЛрдВ рдХреЛ рдмреЗрддрд░рддреАрдм рдврдВрдЧ рд╕реЗ рдмрджрд▓рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдмрдЯрди рдЬреЛрдбрд╝рд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдХреБрдЫ рднреА рджрд┐рд▓рдЪрд╕реНрдк рдирд╣реАрдВ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдкреВрд░реНрдг рдХреЛрдб рдХреЗ рд▓рд┐рдП, рдЬреАрдердм рдХрд╛ рд╕реНрд╡рд╛рдЧрдд рд╣реИред

рд╕рдм рдХреБрдЫ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ, рд╣рдо рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ AnimatablePair tuple рдореЗрдВ рдкреИрдХ рдХрд┐рдП рдЧрдП рдорд╛рдкрджрдВрдбреЛрдВ рдХреА рдЬреЛрдбрд╝реА рдореЗрдВ рдПрдХ рдирд┐рд░рдВрддрд░ рдкрд░рд┐рд╡рд░реНрддрди рдкреНрд░рд╛рдкреНрдд рдХрд░рддреЗ рд╣реИрдВред рдмреБрд░рд╛ рдирд╣реАрдВред

рдЗрд╕ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдореЗрдВ рдХреБрдЫ рднреА рднреНрд░рдорд┐рдд рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ? рд╡реНрдпрдХреНрддрд┐рдЧрдд рд░реВрдк рд╕реЗ, рдЬрдм рдореИрдВрдиреЗ рдпрд╣ рдбрд┐рдЬрд╝рд╛рдЗрди рджреЗрдЦрд╛ рддреЛ рдореИрдВ рддрд┐рд▓рдорд┐рд▓рд╛ рдЧрдпрд╛:

        
self.position = newValue.first
self.height = newValue.second

рдореИрдВрдиреЗ рдХрд╣реАрдВ рднреА рдпрд╣ рд╕рдВрдХреЗрдд рдирд╣реАрдВ рджрд┐рдпрд╛ рдХрд┐ рдЗрдирдореЗрдВ рд╕реЗ рдХреМрди рд╕рд╛ рдкреИрд░рд╛рдореАрдЯрд░ рдкрд╣рд▓реЗ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП рдФрд░ рдХреМрди рд╕рд╛ рджреВрд╕рд░рд╛ред SwiftUI рдХреИрд╕реЗ рддрдп рдХрд░рддрд╛ рд╣реИ рдХрд┐ рдХреМрди рд╕рд╛ рдореВрд▓реНрдп рдкрд╣рд▓реЗ рдореЗрдВ рд░рдЦрд╛ рдЬрд╛рдП рдФрд░ рджреВрд╕рд░рд╛ рдХрд┐рд╕ рдореВрд▓реНрдп рдореЗрдВ? рдЦреИрд░, рдХреНрдпрд╛ рдпрд╣ рд╕рдВрд░рдЪрдирд╛ рд╡рд┐рд╢реЗрд╖рддрд╛рдУрдВ рдХреЗ рдирд╛рдо рдХреЗ рд╕рд╛рде рдлрд╝рдВрдХреНрд╢рди рдорд╛рдкрджрдВрдбреЛрдВ рдХреЗ рдирд╛рдореЛрдВ рд╕реЗ рдореЗрд▓ рдирд╣реАрдВ рдЦрд╛рддрд╛ рд╣реИ?

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

рддрдм рдпрд╣ рдореБрдЭ рдкрд░ рдереЛрдкрд╛ рдЧрдпрд╛ред рдореИрдВ рд╕реНрд╡рдпрдВ рд╕рдВрдХреЗрдд рдХрд░рддрд╛ рд╣реВрдВ рдХрд┐ рдХреМрди рд╕рд╛ рдкреИрд░рд╛рдореАрдЯрд░ рдкрд╣рд▓реЗ рдФрд░ рдХреМрди рд╕реЗ рджреВрд╕рд░реЗ рдЧреЗрдЯреНрдЯрд░ рдореЗрдВ рд╣реЛрдЧрд╛ред SwiftUI рдХреЛ рдпрд╣ рдЬрд╛рдирдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ рдХрд┐ рд╣рдо рдЗрд╕ рд╕рдВрд░рдЪрдирд╛ рдХреЛ рдХреИрд╕реЗ рдЖрд░рдВрдн рдХрд░рддреЗ рд╣реИрдВред рдпрд╣ рдкрд░рд┐рд╡рд░реНрддрди рд╕реЗ рдкрд╣рд▓реЗ рдПрдирд┐рдореЗрдЯрд┐рдбрдбреЗрдЯрд╛ рдорд╛рди рдкреНрд░рд╛рдкреНрдд рдХрд░ рд╕рдХрддрд╛ рд╣реИ, рдкрд░рд┐рд╡рд░реНрддрди рдХреЗ рдмрд╛рдж рдкреНрд░рд╛рдкреНрдд рдХрд░ рд╕рдХрддрд╛ рд╣реИ, рдЙрдирдХреЗ рдмреАрдЪ рдХреЗ рдЕрдВрддрд░ рдХреА рдЧрдгрдирд╛ рдХрд░ рд╕рдХрддрд╛ рд╣реИ, рдФрд░ рдЙрд╕реА рдЕрдВрддрд░ рдХреЛ рд╡рд╛рдкрд╕ рдХрд░ рд╕рдХрддрд╛ рд╣реИ, рдЬреЛ рд╣рдорд╛рд░реЗ рд╕реЗрдЯрд░ рдХреЛ рдмреАрддрд╛ рд╕рдордп рдЕрдВрддрд░рд╛рд▓ рдХреЗ рдЕрдиреБрдкрд╛рдд рдореЗрдВ рдмрдврд╝рд╛рдпрд╛ рдЧрдпрд╛ рд╣реИред рдпрд╣ рдЖрдо рддреМрд░ рдкрд░ рдПрдирд┐рдореЗрдЯреАрдбрд╛рдЯрд╛ рдХреЗ рдЕрдВрджрд░ рдореВрд▓реНрдп рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХреБрдЫ рднреА рдЬрд╛рдирдиреЗ рдХреА рдЬрд░реВрд░рдд рдирд╣реАрдВ рд╣реИред рдФрд░ рдпрджрд┐ рдЖрдк рджреЛ рдЖрд╕рдиреНрди рд▓рд╛рдЗрдиреЛрдВ рдореЗрдВ рдЪрд░ рдХреЗ рдЖрджреЗрд╢ рдХреЛ рднреНрд░рдорд┐рдд рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рд╕рдм рдХреБрдЫ рдХреНрд░рдо рдореЗрдВ рд╣реЛрдЧрд╛, рднрд▓реЗ рд╣реА рдмрд╛рдХреА рдХреЛрдб рдХреА рд╕рдВрд░рдЪрдирд╛ рдХрд┐рддрдиреА рдЬрдЯрд┐рд▓ рд╣реЛред

рд▓реЗрдХрд┐рди рдЗрд╕рдХреА рдЬрд╛рдВрдЪ рдХрд░рддреЗ рд╣реИрдВред рдЖрдЦрд┐рд░рдХрд╛рд░, рд╣рдо рдЕрдкрдиреЗ рдЦреБрдж рдХреЗ рдХрдВрдЯреЗрдирд░ рд╡реЗрдХреНрдЯрд░ рдмрдирд╛ рд╕рдХрддреЗ рд╣реИрдВ (рдУрд╣, рдореИрдВ рдЗрд╕реЗ рдкреНрдпрд╛рд░ рдХрд░рддрд╛ рд╣реВрдВ, рдореМрдЬреВрджрд╛ рд╡рд╕реНрддреБрдУрдВ рдХрд╛ рдЕрдкрдирд╛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдмрдирд╛ рд╕рдХрддрд╛ рд╣реВрдВ, рдЖрдкрдиреЗ рдкрд┐рдЫрд▓реЗ рд▓реЗрдЦ рд╕реЗ рдЗрд╕ рдкрд░ рдзреНрдпрд╛рди рджрд┐рдпрд╛ рд╣реЛрдЧрд╛)ред



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

рдЙрд╕реА рддрд░рд╣, рд╣рдо AdditiveArithmetic рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рдХреЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХ рддрд░реАрдХреЛрдВ рдХреЗ рд╕рд╛рде рдЕрдкрдиреА рд╡рд╕реНрддреБ рдХреЛ рднрд░рддреЗ рд╣реИрдВ (VectorArithmetic рдореЗрдВ рдЗрд╕рдХрд╛ рд╕рдорд░реНрдерди рд╢рд╛рдорд┐рд▓ рд╣реИ)ред

struct MyAnimatableVector: VectorArithmetic{
    static func - (lhs: MyAnimatableVector, rhs: MyAnimatableVector) -> MyAnimatableVector {
        MyAnimatableVector(position: lhs.position - rhs.position, height: lhs.height - rhs.height)
    }
    
    static func + (lhs: MyAnimatableVector, rhs: MyAnimatableVector) -> MyAnimatableVector {
        MyAnimatableVector(position: lhs.position + rhs.position, height: lhs.height + rhs.height)
    }
    
    mutating func scale(by rhs: Double) {
        self.position = self.position * CGFloat(rhs)
        self.height = self.height * CGFloat(rhs)
    }
    
    var magnitudeSquared: Double{
         Double(self.position * self.position) + Double(self.height * self.height)
    }
    
    static var zero: MyAnimatableVector{
        MyAnimatableVector(position: 0, height: 0)
    }
    
    var position: CGFloat
    var height: CGFloat
}

  • рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рд╣рдореЗрдВ рдХреНрдпреЛрдВ + рдФрд░ - рдЬрд╛рд╣рд┐рд░ рд╣реИред
  • рд╕реНрдХреЗрд▓ рд╕реНрдХреЗрд▓рд┐рдВрдЧ рдХрд╛ рдПрдХ рдХрд╛рд░реНрдп рд╣реИред рд╣рдо рдЕрдВрддрд░ рд▓реЗрддреЗ рд╣реИрдВ "рдпрд╣ рдерд╛ - рдпрд╣ рдмрди рдЧрдпрд╛ рд╣реИ" рдФрд░ рдЗрд╕реЗ рдПрдиреАрдореЗрд╢рди рдХреЗ рд╡рд░реНрддрдорд╛рди рдЪрд░рдг рд╕реЗ рдЧреБрдгрд╛ рдХрд░реЗрдВ (0 рд╕реЗ 1 рддрдХ)ред "рдпрд╣ + рдЕрдВрддрд░ * (1 - рд╕реНрдЯреЗрдЬ) рдмрди рдЧрдпрд╛" рдФрд░ рдПрдХ рд╡рд░реНрддрдорд╛рди рдореВрд▓реНрдп рд╣реЛрдЧрд╛ рдЬрд┐рд╕реЗ рд╣рдореЗрдВ рдПрдирд┐рдореЗрдЯрд┐рдбрдбрд╛рдЯрд╛ рдореЗрдВ рдмрдВрдж рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП
  • рдЬрд╝реАрд░реЛ рдХреЛ рд╢рд╛рдпрдж рдирдИ рд╡рд╕реНрддреБрдУрдВ рдХреЛ рдЗрдирд┐рд╢рд┐рдпрд▓рд╛рдЗрдЬрд╝ рдХрд░рдиреЗ рдХреА рдЬрд╝рд░реВрд░рдд рд╣реИ рдЬрд┐рдирдХреЗ рдорд╛рди рдПрдиреАрдореЗрд╢рди рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧ рдХрд┐рдП рдЬрд╛рдПрдВрдЧреЗред рдПрдиреАрдореЗрд╢рди рдмрд╣реБрдд рд╢реБрд░реБрдЖрдд рдореЗрдВ .zero рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдореИрдВ рдпрд╣ рдкрддрд╛ рдирд╣реАрдВ рд▓рдЧрд╛ рд╕рдХрд╛ рдХрд┐ рдХреИрд╕реЗред рд╣рд╛рд▓рд╛рдВрдХрд┐, рдореБрдЭреЗ рдирд╣реАрдВ рд▓рдЧрддрд╛ рдХрд┐ рдпрд╣ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИред
  • рдкрд░рд┐рдорд╛рдг рд╕реНрд╡рдпрдВ рдХреЗ рд╕рд╛рде рджрд┐рдП рдЧрдП рд╡реЗрдХреНрдЯрд░ рдХрд╛ рдПрдХ рдЕрджрд┐рд╢ рдЙрддреНрдкрд╛рдж рд╣реИред рджреЛ-рдЖрдпрд╛рдореА рд╕реНрдерд╛рди рдХреЗ рд▓рд┐рдП, рдЗрд╕рдХрд╛ рдорддрд▓рдм рд╡реЗрдХреНрдЯрд░ рд╡рд░реНрдЧ рдХреА рд▓рдВрдмрд╛рдИ рд╣реИред рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рд╕рдВрднрд╡рддрдГ рджреЛ рд╡рд╕реНрддреБрдУрдВ рдХреА рдПрдХ рджреВрд╕рд░реЗ рдХреЗ рд╕рд╛рде рддреБрд▓рдирд╛ рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛрдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рддрддреНрд╡рдкреВрд░реНрдг рдирд╣реАрдВ, рдмрд▓реНрдХрд┐ рдкреВрд░реЗ рдХреЗ рд░реВрдк рдореЗрдВред рдпрд╣ рдПрдиреАрдореЗрд╢рди рдкреНрд░рдпреЛрдЬрдиреЛрдВ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛ рд░рд╣рд╛ рд╣реИред

рд╕рд╛рдорд╛рдиреНрдпрддрдпрд╛, "- =" "+ =" рдлрд╝рдВрдХреНрд╢рди рднреА рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рд╕рдорд░реНрдерди рдореЗрдВ рд╢рд╛рдорд┐рд▓ рд╣реИрдВ, рд▓реЗрдХрд┐рди рд╕рдВрд░рдЪрдирд╛ рдХреЗ рд▓рд┐рдП рдЙрдиреНрд╣реЗрдВ рдЗрд╕ рд░реВрдк рдореЗрдВ рдЙрддреНрдкрдиреНрди рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ

    static func -= (lhs: inout MyAnimatableVector, rhs: MyAnimatableVector) {
        lhs = lhs - rhs
    }

    static func += (lhs: inout MyAnimatableVector, rhs: MyAnimatableVector) {
        lhs = lhs + rhs
    }


рд╕реНрдкрд╖реНрдЯрддрд╛ рдХреЗ рд▓рд┐рдП, рдореИрдВрдиреЗ рдЖрд░реЗрдЦ рдХреЗ рд░реВрдк рдореЗрдВ рдЗрд╕ рд╕рд╛рд░реЗ рддрд░реНрдХ рдХреЛ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд┐рдпрд╛ред рддрд╕реНрд╡реАрд░ рдХреНрд▓рд┐рдХ рдХрд░рдиреЗ рдпреЛрдЧреНрдп рд╣реИред рдПрдирд┐рдореЗрд╢рди рдХреЗ рджреМрд░рд╛рди рд╣рдореЗрдВ рд▓рд╛рд▓ рд░рдВрдЧ рдореЗрдВ рд╣рд╛рдЗрд▓рд╛рдЗрдЯ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ - рд╣рд░ рдЕрдЧрд▓реЗ рдЯрд┐рдХ (1/60 рд╕реЗрдХрдВрдб) рдЯрд╛рдЗрдорд░ рдЯреА рдХрд╛ рдПрдХ рдирдпрд╛ рдореВрд▓реНрдп рджреЗрддрд╛ рд╣реИ, рдФрд░ рд╣рдо, рд╣рдорд╛рд░реЗ рд╕рдВрд╢реЛрдзрдХ рдХреЗ рд╕реЗрдЯрд░ рдореЗрдВ, рдПрдирд┐рдореЗрдЯрд┐рдбреНрдЯрд╛рдЯрд╛ рдХрд╛ рдПрдХ рдирдпрд╛ рдореВрд▓реНрдп рдкреНрд░рд╛рдкреНрдд рдХрд░рддреЗ рд╣реИрдВред рдЗрд╕ рддрд░рд╣ рд╕реЗ рдПрдиреАрдореЗрд╢рди рд╣реБрдб рдХреЗ рддрд╣рдд рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред рдЙрд╕реА рд╕рдордп, рдпрд╣ рд╕рдордЭрдирд╛ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИ рдХрд┐ рдПрдХ рд╕рдВрд╢реЛрдзрдХ рдПрдХ рд╕рдВрдЧреНрд░рд╣реАрдд рд╕рдВрд░рдЪрдирд╛ рд╣реИ, рдФрд░ рдПрдиреАрдореЗрд╢рди рдХреЛ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдирдП, рд╡рд░реНрддрдорд╛рди рд╕реНрдерд┐рддрд┐ рдХреЗ рд╕рд╛рде рд╡рд░реНрддрдорд╛рди рд╕рдВрд╢реЛрдзрдХ рдХреА рдПрдХ рдкреНрд░рддрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред





рдПрдиреАрдореЗрдЯрд┐рдбреНрдЯрд╛рдЯрд╛ рдХреЗрд╡рд▓ рдПрдХ рд╕рдВрд░рдЪрдирд╛ рдХреНрдпреЛрдВ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ


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

    struct TestStruct{
        var value: CGFloat
        mutating func scaled(by: CGFloat){
            self.value = self.value * by
        }
    }
    class TestClass{
        var value: CGFloat
        func scaled(by: CGFloat){
             self.value = self.value * by
        }
        init(value: CGFloat){
            self.value = value
        }
    }
        var stA = TestStruct(value: 5)
        var stB = stA
        stB.scaled(by: 2)
        print("structs: a = \(stA.value), b = \(stB.value))") //structs: a = 5.0, b = 10.0)
        var clA = TestClass(value: 5)
        var clB = clA
        clB.scaled(by: 2)
        print("classes: a = \(clA.value), b = \(clB.value))") //classes: a = 10.0, b = 10.0)

рдПрдиреАрдореЗрд╢рди рдХреЗ рд╕рд╛рде рдмрд┐рд▓реНрдХреБрд▓ рд╡реИрд╕рд╛ рд╣реА рд╣реЛрддрд╛ рд╣реИред рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдПрдХ рдПрдирд┐рдореЗрдЯрд┐рдбреНрдЯрд╛рдЯрд╛ рдСрдмреНрдЬреЗрдХреНрдЯ рд╣реИ рдЬреЛ "рдерд╛" рдФрд░ "рдмрди рдЧрдпрд╛" рдХреЗ рдмреАрдЪ рдЕрдВрддрд░ рдХрд╛ рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рдХрд░рддрд╛ рд╣реИред рд╣рдореЗрдВ рд╕реНрдХреНрд░реАрди рдкрд░ рдкреНрд░рддрд┐рдмрд┐рдВрдмрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЗрд╕ рдЕрдВрддрд░ рдХреЗ рднрд╛рдЧ рдХреА рдЧрдгрдирд╛ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдореЗрдВ рдЗрд╕ рдЕрдВрддрд░ рдХреЛ рдХреЙрдкреА рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП рдФрд░ рдЗрд╕реЗ рдПрдиреАрдореЗрд╢рди рдХреЗ рд╡рд░реНрддрдорд╛рди рдЪрд░рдг рдХрд╛ рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рдХрд░рдиреЗ рд╡рд╛рд▓реА рд╕рдВрдЦреНрдпрд╛ рд╕реЗ рдЧреБрдгрд╛ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред рд╕рдВрд░рдЪрдирд╛ рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рдпрд╣ рд╕реНрд╡рдпрдВ рдЕрдВрддрд░ рдХреЛ рдкреНрд░рднрд╛рд╡рд┐рдд рдирд╣реАрдВ рдХрд░реЗрдЧрд╛, рд▓реЗрдХрд┐рди рдХрдХреНрд╖рд╛ рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ рдпрд╣ рд╣реЛрдЧрд╛ред рдкрд╣рд▓рд╛ рдлреНрд░реЗрдо рдЬреЛ рд╣рдо рдЦреАрдВрдЪрддреЗ рд╣реИрдВ рд╡рд╣ рд╣реИ "рд╕реНрдерд┐рддрд┐"ред рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдореЗрдВ рд╕реНрдЯреАрд▓ + рдЕрдВрддрд░ * рд╡рд░реНрддрдорд╛рди рдЕрд╡рд╕реНрдерд╛ - рдЕрдВрддрд░ рдХреА рдЧрдгрдирд╛ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рд╡рд░реНрдЧ рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рдкрд╣рд▓реЗ рдлреНрд░реЗрдо рдореЗрдВ рд╣рдо рдЕрдВрддрд░ рдХреЛ 0 рд╕реЗ рдЧреБрдгрд╛ рдХрд░рддреЗ рд╣реИрдВ, рдЗрд╕реЗ рд╢реВрдиреНрдп рдХрд░рддреЗ рд╣реИрдВ, рдФрд░ рдмрд╛рдж рдХреЗ рд╕рднреА рдлрд╝реНрд░реЗрдо рдЦреАрдВрдЪреЗ рдЬрд╛рддреЗ рд╣реИрдВ рддрд╛рдХрд┐ рдЕрдВрддрд░ = 0. рдпрд╛рдиреАред рдПрдиреАрдореЗрд╢рди рд╕рд╣реА рдврдВрдЧ рд╕реЗ рдЦреАрдВрдЪрд╛ рдЧрдпрд╛ рд▓рдЧрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рд╣рдо рдПрдХ рд░рд╛рдЬреНрдп рд╕реЗ рджреВрд╕рд░реЗ рд░рд╛рдЬреНрдп рдореЗрдВ рддрддреНрдХрд╛рд▓ рд╕рдВрдХреНрд░рдордг рджреЗрдЦрддреЗ рд╣реИрдВ, рдЬреИрд╕реЗ рдХрд┐ рдХреЛрдИ рдПрдиреАрдореЗрд╢рди рдирд╣реАрдВ рдерд╛ред

рдЖрдк рд╢рд╛рдпрдж рдХрд┐рд╕реА рдкреНрд░рдХрд╛рд░ рдХреЗ рдирд┐рдореНрди-рд╕реНрддрд░реАрдп рдХреЛрдб рдХреЛ рд▓рд┐рдЦ рд╕рдХрддреЗ рд╣реИрдВ рдЬреЛ рдЧреБрдгрд╛ рдкрд░рд┐рдгрд╛рдо рдХреЗ рд▓рд┐рдП рдирдП рдореЗрдореЛрд░реА рдкрддреЗ рдмрдирд╛рддрд╛ рд╣реИ - рд▓реЗрдХрд┐рди рдХреНрдпреЛрдВ? рдЖрдк рдХреЗрд╡рд▓ рд╕рдВрд░рдЪрдирд╛рдУрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ - рд╡реЗ рдЙрд╕реА рдХреЗ рд▓рд┐рдП рдмрдирд╛рдП рдЧрдП рд╣реИрдВред

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

рд╕реНрдХреНрд░реАрди рдПрдиреАрдореЗрд╢рди: .transition ()


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

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

рджреЛ рджреГрд╢реНрдп рдХреЗ рдмреАрдЪ рд╕реНрд╡рд┐рдЪ рдХрд░рдирд╛ рднреА рдПрдирд┐рдореЗрдЯреЗрдб рд╣реЛ рд╕рдХрддрд╛ рд╣реИред рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, .transition () рд╕рдВрд╢реЛрдзрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВред

struct TransitionView: View {
    let views: [AnyView] = [AnyView(CustomCircleTestView()), AnyView(SimpleBorderMove())]
    @State var currentViewInd = 0
    var body: some View {
        VStack{
            Spacer()
            ZStack{
                ForEach(views.indices, id: \.self){(ind: Int) in
                    Group{
                        if ind == self.currentViewInd{
                            self.views[ind]
                        }
                    }
                }
            }
            HStack{
                ForEach(views.indices, id: \.self){(ind: Int) in
                    RoundedRectangle(cornerRadius: 10)
                        .fill(ind == self.currentViewInd ? Color.green : Color.gray)
                        .overlay(
                            Text("\(ind + Int(1))"))
                        .onTapGesture{
                            withAnimation{
                                self.currentViewInd = ind
                            }
                    }
                }
            }
                .frame(height: 50)
            Spacer()
        }
    }
}

рдЖрдЗрдП рджреЗрдЦреЗрдВ рдХрд┐ рдпрд╣ рдХреИрд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рдЕрдЧреНрд░рд┐рдо рдореЗрдВ, рдпрд╣рд╛рдВ рддрдХ тАЛтАЛрдХрд┐ рдореВрд▓ рджреГрд╢реНрдп рдХреЗ рдкреНрд░рд╛рд░рдВрднрд┐рдХ рдЪрд░рдг рдореЗрдВ, рд╣рдордиреЗ рд╕рд░рдгреА рдореЗрдВ рдХрдИ рджреГрд╢реНрдп рдмрдирд╛рдП рдФрд░ рд░рдЦреЗред рд╕рд░рдгреА рдХрд┐рд╕реА рднреА рдкреНрд░рдХрд╛рд░ рдХреА рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рд╕рд░рдгреА рдХреЗ рддрддреНрд╡реЛрдВ рдХрд╛ рдкреНрд░рдХрд╛рд░ рдПрдХ рд╣реА рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП, рдЕрдиреНрдпрдерд╛ рдЙрдирдХрд╛ рдЙрдкрдпреЛрдЧ ForEach рдореЗрдВ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдкрд┐рдЫрд▓реЗ рд▓реЗрдЦ рд╕реЗ рдЕрдкрд╛рд░рджрд░реНрд╢реА рдкрд░рд┐рдгрд╛рдо рдкреНрд░рдХрд╛рд░ , рдпрд╛рдж рд╣реИ?

рдЕрдЧрд▓рд╛, рд╣рдордиреЗ рдЗрд╕ рд╕рд░рдгреА рдХреЗ рд╕реВрдЪрдХрд╛рдВрдХреЛрдВ рдХреА рдЧрдгрдирд╛ рдХреА, рдФрд░ рдЙрдирдореЗрдВ рд╕реЗ рдкреНрд░рддреНрдпреЗрдХ рдХреЗ рд▓рд┐рдП рд╣рдо рдЗрд╕ рд╕реВрдЪрдХрд╛рдВрдХ рджреНрд╡рд╛рд░рд╛ рджреГрд╢реНрдп рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рддреЗ рд╣реИрдВред рд╣рдореЗрдВ рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдордЬрдмреВрд░ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдФрд░ рд╡реНрдпреВ рдкрд░ рддреБрд░рдВрдд рдкреБрдирд░рд╛рд╡реГрддреНрдд рдирд╣реАрдВ рдХрд░рдирд╛ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ ForEach рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдореЗрдВ рдкреНрд░рддреНрдпреЗрдХ рддрддреНрд╡ рдХреЛ рдПрдХ рдЖрдВрддрд░рд┐рдХ рдкрд╣рдЪрд╛рдирдХрд░реНрддрд╛ рдЖрд╡рдВрдЯрд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рддрд╛рдХрд┐ SwiftUI рд╕рдВрдЧреНрд░рд╣ рдХреА рд╕рд╛рдордЧреНрд░реА рдкрд░ рдкреБрдирд░рд╛рд╡реГрддрд┐ рдХрд░ рд╕рдХреЗред рдПрдХ рд╡рд┐рдХрд▓реНрдк рдХреЗ рд░реВрдк рдореЗрдВ, рд╣рдореЗрдВ рдкреНрд░рддреНрдпреЗрдХ рджреГрд╢реНрдп рдореЗрдВ рдПрдХ рдкреНрд░реЙрдХреНрд╕реА рдкрд╣рдЪрд╛рдирдХрд░реНрддрд╛ рдмрдирд╛рдирд╛ рд╣реЛрдЧрд╛, рд▓реЗрдХрд┐рди рдХреНрдпреЛрдВ, рдпрджрд┐ рдЕрдиреБрдХреНрд░рдорд┐рдд рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ?

рд╣рдо рдкреНрд░рддреНрдпреЗрдХ рджреГрд╢реНрдп рдХреЛ рд╕рдВрдЧреНрд░рд╣ рд╕реЗ рдПрдХ рд╕реНрдерд┐рддрд┐ рдореЗрдВ рд▓рдкреЗрдЯрддреЗ рд╣реИрдВ, рдФрд░ рдХреЗрд╡рд▓ рддрднреА рджрд┐рдЦрд╛рддреЗ рд╣реИрдВ рдЬрдм рд╡рд╣ рд╕рдХреНрд░рд┐рдп рд╣реЛред рд╣рд╛рд▓рд╛рдБрдХрд┐, рдЕрдЧрд░-рдФрд░ рдХрдВрд╕реНрдЯреНрд░рдХреНрд╢рди рд╕рд┐рд░реНрдл рдпрд╣рд╛рдБ рдореМрдЬреВрдж рдирд╣реАрдВ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ, рддреЛ рдХрдВрдкрд╛рдЗрд▓рд░ рдЗрд╕реЗ рдлреНрд▓реЛ рдХрдВрдЯреНрд░реЛрд▓ рдХреЗ рд▓рд┐рдП рд▓реЗ рдЬрд╛рддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рд╣рдо рдпрд╣ рд╕рдм рдЧреНрд░реБрдк рдореЗрдВ рдбрд╛рд▓рддреЗ рд╣реИрдВ рддрд╛рдХрд┐ рдХрдВрдкрд╛рдЗрд▓рд░ рдХреЛ рдареАрдХ рд╕реЗ рд╕рдордЭ рдореЗрдВ рдЖ рдЬрд╛рдП рдХрд┐ рдпрд╣ рдХреНрдпрд╛ рд╣реИ, рдпрд╛ рдЗрд╕рд╕реЗ рдЕрдзрд┐рдХ рд╕рдЯреАрдХ рд╣реИ, рд╡реНрдпреВрдмреНрдпреВрд▓рд░ рдХреЛ рдПрдХ рд╡реИрдХрд▓реНрдкрд┐рдХ рдХрдВрдбреЗрдиреНрдХреЛрдиреНрдЯреЗрдВрдЯ рдХрдВрдЯреЗрдирд░ рдмрдирд╛рдиреЗ рдХреЗ рдирд┐рд░реНрджреЗрд╢ <рджреГрд╢реНрдп 1, рджреГрд╢реНрдп 2>ред

рдЕрдм, currentViewInd рдХрд╛ рдорд╛рди рдмрджрд▓рддреЗ рд╕рдордп, SwiftUI рдкрд┐рдЫрд▓реЗ рд╕рдХреНрд░рд┐рдп рджреГрд╢реНрдп рдХреЛ рдЫреБрдкрд╛рддрд╛ рд╣реИ, рдФрд░ рд╡рд░реНрддрдорд╛рди рдХреЛ рджрд┐рдЦрд╛рддрд╛ рд╣реИред рдЖрдкрдХреЛ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЗ рдЕрдВрджрд░ рдпрд╣ рдиреЗрд╡рд┐рдЧреЗрд╢рди рдХреИрд╕рд╛ рд▓рдЧрд╛?


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

.Transition рд╕рдВрд╢реЛрдзрдХ рдЬреЛрдбрд╝реЗрдВ, рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░реЗрдВред рдкреИрд░рд╛рдореАрдЯрд░ рдХреЗ рд░реВрдк рдореЗрдВ .scaleред рдпрд╣ рдЗрдирдореЗрдВ рд╕реЗ рдкреНрд░рддреНрдпреЗрдХ рджреГрд╢реНрдп рдХреА рдЙрдкрд╕реНрдерд┐рддрд┐ рдФрд░ рдЧрд╛рдпрдм рд╣реЛрдиреЗ рдХрд╛ рдПрдиреАрдореЗрд╢рди рдЕрд▓рдЧ рдмрдирд╛ рджреЗрдЧрд╛ - рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд╕реНрд╡рд┐рдлреНрдЯрдпреВрдЖрдИ рджреНрд╡рд╛рд░рд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдП рдЧрдП рдкрд╛рд░рджрд░реНрд╢рд┐рддрд╛ рдХреЗ рдмрдЬрд╛рдп рд╕реНрдХреЗрд▓рд┐рдВрдЧ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ред

                ForEach(views.indices, id: \.self){(ind: Int) in
                    Group{
                        if ind == self.currentViewInd{
                            self.views[ind]
                                .transition(.scale)
                        }
                    }
                }


рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ рджреГрд╢реНрдп рджрд┐рдЦрд╛рдИ рджреЗрддрд╛ рд╣реИ рдФрд░ рдЙрд╕реА рдПрдиреАрдореЗрд╢рди рдХреЗ рд╕рд╛рде рдЧрд╛рдпрдм рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ, рдХреЗрд╡рд▓ рдЧрд╛рдпрдм рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ рд░рд┐рд╡рд░реНрд╕ рдСрд░реНрдбрд░ рдореЗрдВ рд╕реНрдХреНрд░реЙрд▓ рдХрд░рддрд╛ рд╣реИред рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рд╣рдо рд╡реНрдпрдХреНрддрд┐рдЧрдд рд░реВрдк рд╕реЗ рдПрдХ рджреГрд╢реНрдп рдХреА рдЙрдкрд╕реНрдерд┐рддрд┐ рдФрд░ рдЧрд╛рдпрдм рд╣реЛрдиреЗ рджреЛрдиреЛрдВ рдХреЗ рд▓рд┐рдП рдПрдирд┐рдореЗрд╢рди рдЕрд╕рд╛рдЗрди рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдЗрд╕рдХреЗ рд▓рд┐рдП рдПрдХ рдЕрд╕рдордорд┐рдд рд╕рдВрдХреНрд░рдордг рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред

                    Group{
                        if ind == self.currentViewInd{
                            self.views[ind]
                               .transition(.asymmetric(
                                    insertion: insertion: AnyTransition.scale(scale: 0.1, anchor: .leading).combined(with: .opacity),
                                    removal: .move(edge: .trailing)))
                        }
                    }


рд╕реНрдХреНрд░реАрди рдкрд░ рджрд┐рдЦрд╛рдИ рджреЗрдиреЗ рдХреЗ рд▓рд┐рдП рд╕рдорд╛рди .scale рдПрдиреАрдореЗрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЕрдм рд╣рдордиреЗ рдЗрд╕рдХреЗ рдЙрдкрдпреЛрдЧ рдХреЗ рд▓рд┐рдП рдорд╛рдкрджрдВрдбреЛрдВ рдХреЛ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░ рджрд┐рдпрд╛ рд╣реИред рдпрд╣ рдПрдХ рдЖрдХрд╛рд░ рд╢реВрдиреНрдп (рдмрд┐рдВрджреБ) рд╕реЗ рд╢реБрд░реВ рдирд╣реАрдВ рд╣реЛрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рд╕рд╛рдорд╛рдиреНрдп рд╕реЗ 0.1 рдХреЗ рдЖрдХрд╛рд░ рдХреЗ рд╕рд╛рде рд╣реЛрддрд╛ рд╣реИред рдФрд░ рдЫреЛрдЯреА рдЦрд┐рдбрд╝рдХреА рдХреА рд╢реБрд░реБрдЖрддреА рд╕реНрдерд┐рддрд┐ рд╕реНрдХреНрд░реАрди рдХреЗ рдХреЗрдВрджреНрд░ рдореЗрдВ рдирд╣реАрдВ рд╣реИ, рд▓реЗрдХрд┐рди рдмрд╛рдПрдВ рдХрд┐рдирд╛рд░реЗ рдкрд░ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░ рджреА рдЧрдИ рд╣реИред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдПрдХ рд╕рдВрдХреНрд░рдордг рдЙрдкрд╕реНрдерд┐рддрд┐ рдХреЗ рд▓рд┐рдП рдЬрд┐рдореНрдореЗрджрд╛рд░ рдирд╣реАрдВ рд╣реИ, рд▓реЗрдХрд┐рди рджреЛред рдЙрдиреНрд╣реЗрдВ .combined (:) рдХреЗ рд╕рд╛рде рдЬреЛрдбрд╝рд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ, рд╣рдордиреЗ рдкрд╛рд░рджрд░реНрд╢рд┐рддрд╛ рдЬреЛрдбрд╝реА рд╣реИред

рджреГрд╢реНрдп рдХрд╛ рд▓реБрдкреНрдд рд╣реЛ рдЬрд╛рдирд╛ рдЕрдм рдПрдХ рдЕрдиреНрдп рдПрдиреАрдореЗрд╢рди рджреНрд╡рд╛рд░рд╛ рдкреНрд░рд╕реНрддреБрдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ - рд╕реНрдХреНрд░реАрди рдХреЗ рджрд╛рд╣рд┐рдиреЗ рдХрд┐рдирд╛рд░реЗ рдкрд░ рд╡реНрдпрд╛рдкрдХред рдореИрдВрдиреЗ рдПрдиреАрдореЗрд╢рди рдХреЛ рдереЛрдбрд╝рд╛ рдзреАрдорд╛ рдХрд░ рджрд┐рдпрд╛ рд╣реИ рддрд╛рдХрд┐ рдЖрдк рдЗрд╕реЗ рджреЗрдЦ рд╕рдХреЗрдВред

рдФрд░ рд╣рдореЗрд╢рд╛ рдХреА рддрд░рд╣, рдореИрдВ рдЯреНрд░рд╛рдВрдЬрд┐рдЯ рдПрдиреАрдореЗрд╢рди рдХреЗ рдЕрдкрдиреЗ рд╕рдВрд╕реНрдХрд░рдг рдХреЛ рд▓рд┐рдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдЗрдВрддрдЬрд╛рд░ рдирд╣реАрдВ рдХрд░ рд╕рдХрддрд╛ред рдпрд╣ рдПрдирд┐рдореЗрдЯреЗрдб рд░реВрдк рдпрд╛ рд╕рдВрд╢реЛрдзрдХ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рднреА рд╕рд░рд▓ рд╣реИред

struct SpinTransitionModifier: ViewModifier {
    let angle: Double
    let anchor: UnitPoint
    func body(content: Content) -> some View {
        content
            .rotationEffect(Angle(degrees: angle), anchor: anchor)
            .clipped()
    }
}

extension AnyTransition {
    static func spinIn(anchor: UnitPoint) -> AnyTransition {
        .modifier(
            active: SpinTransitionModifier(angle: -90, anchor: anchor),
            identity: SpinTransitionModifier(angle: 0, anchor: anchor))
    }
    static func spinOut(anchor: UnitPoint) -> AnyTransition {
        .modifier(
            active: SpinTransitionModifier(angle: 90, anchor: anchor),
            identity: SpinTransitionModifier(angle: 0, anchor: anchor))
    }
}


рд╢реБрд░реВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдо рд╕рд╛рдорд╛рдиреНрдп рд╕рдВрд╢реЛрдзрдХ рд▓рд┐рдЦрддреЗ рд╣реИрдВ рдЬрд┐рд╕рдореЗрдВ рд╣рдо рдПрдХ рдирд┐рд╢реНрдЪрд┐рдд рд╕рдВрдЦреНрдпрд╛ рдХреЛ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░рддреЗ рд╣реИрдВ - рдбрд┐рдЧреНрд░реА рдореЗрдВ рд░реЛрдЯреЗрд╢рди рдХрд╛ рдХреЛрдг, рд╕рд╛рде рд╣реА рдЙрд╕ рдмрд┐рдВрджреБ рдХреЗ рд╕рд╛рдкреЗрдХреНрд╖ рдмрд┐рдВрджреБ рдЬрд┐рд╕рдореЗрдВ рдпрд╣ рдШреБрдорд╛рд╡ рд╣реЛрддрд╛ рд╣реИред рдлрд┐рд░, рд╣рдо рджреЛ рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рд╕рд╛рде AnyTransition рдкреНрд░рдХрд╛рд░ рдХрд╛ рд╡рд┐рд╕реНрддрд╛рд░ рдХрд░рддреЗ рд╣реИрдВред рдпрд╣ рдПрдХ рд╣реЛ рд╕рдХрддрд╛ рдерд╛, рд▓реЗрдХрд┐рди рдпрд╣ рдореБрдЭреЗ рдЕрдзрд┐рдХ рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рд▓рдЧрд╛ред рдореБрдЭреЗ рдЙрдирдореЗрдВ рд╕реЗ рдкреНрд░рддреНрдпреЗрдХ рдХреЛ рд╕реАрдзреЗ рдирд╛рдо рдореЗрдВ рд░реЛрдЯреЗрд╢рди рдХреА рдбрд┐рдЧреНрд░реА рдХреЛ рдирд┐рдпрдВрддреНрд░рд┐рдд рдХрд░рдиреЗ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдмреЛрд▓рдиреЗ рд╡рд╛рд▓реЗ рдирд╛рдореЛрдВ рдХреЛ рд╕реМрдВрдкрдирд╛ рдЖрд╕рд╛рди рд▓рдЧрд╛ред

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

рддреЛ, spinIn рдХрд╛ рддрд╛рддреНрдкрд░реНрдп рд╣реИ рдХрд┐ рдореИрдВ рдЗрд╕реЗ рд╕реНрдХреНрд░реАрди рдХреЗ рдмрд╛рд╣рд░ рд╕реЗ рджреГрд╢реНрдп (рдпрд╛ рджреГрд╢реНрдп рдХреЗ рд▓рд┐рдП рдЖрд╡рдВрдЯрд┐рдд рд╕реНрдерд╛рди) рдХреЛ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдмрд┐рдВрджреБ рдХреЗ рдЪрд╛рд░реЛрдВ рдУрд░ рджрдХреНрд╖рд┐рдгрд╛рд╡рд░реНрдд рдШреБрдорд╛рдХрд░ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧ рдХрд░реВрдВрдЧрд╛ред рд╕реНрдкрд┐рдирдСрдЯ рдХрд╛ рдорддрд▓рдм рд╣реИ рдХрд┐ рджреГрд╢реНрдп рдЙрд╕реА рддрд░рд╣ рд╕реЗ рдЧрд╛рдпрдм рд╣реЛ рдЬрд╛рдПрдЧрд╛, рдЙрд╕реА рдмрд┐рдВрджреБ рдХреЗ рдЪрд╛рд░реЛрдВ рдУрд░ рдШреВрдорддреЗ рд╣реБрдП, рджрдХреНрд╖рд┐рдгрд╛рд╡рд░реНрдд рднреАред

рдореЗрд░реЗ рд╡рд┐рдЪрд╛рд░ рдХреЗ рдЕрдиреБрд╕рд╛рд░, рдпрджрд┐ рдЖрдк рджреГрд╢реНрдп рдХреА рдЙрдкрд╕реНрдерд┐рддрд┐ рдФрд░ рдЧрд╛рдпрдм рд╣реЛрдиреЗ рдХреЗ рд▓рд┐рдП рд╕рдорд╛рди рдмрд┐рдВрджреБ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдЖрдкрдХреЛ рдЗрд╕ рдмрд┐рдВрджреБ рдХреЗ рдЖрд╕рдкрд╛рд╕ рдкреВрд░реА рд╕реНрдХреНрд░реАрди рдХреЛ рдШреБрдорд╛рдиреЗ рдХрд╛ рдкреНрд░рднрд╛рд╡ рдорд┐рд▓рддрд╛ рд╣реИред

рд╕рднреА рдПрдиреАрдореЗрд╢рди рдорд╛рдирдХ рд╕рдВрд╢реЛрдзрдХ рдпрд╛рдВрддреНрд░рд┐рдХреА рдкрд░ рдЖрдзрд╛рд░рд┐рдд рд╣реИред рдпрджрд┐ рдЖрдк рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдХрд╕реНрдЯрдо рд╕рдВрд╢реЛрдзрдХ рд▓рд┐рдЦрддреЗ рд╣реИрдВ, рддреЛ рдЖрдкрдХреЛ рдПрдирд┐рдореЗрдЯреЗрдмрд▓ рдореЛрдбрд┐рдлрд╛рдпрд░ рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛рдУрдВ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП, рдЬреИрд╕рд╛ рдХрд┐ рд╣рдордиреЗ TwoParameterBorder рдХреЗ рд╕рд╛рде рдХрд┐рдпрд╛ рдерд╛, рдпрд╛ рдЗрд╕рдХреЗ рдЕрдВрджрд░ рдЕрдВрддрд░реНрдирд┐рд╣рд┐рдд рд╕рдВрд╢реЛрдзрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ рдЬреЛ рдЕрдкрдирд╛ рд╕реНрд╡рдпрдВ рдХрд╛ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдПрдиреАрдореЗрд╢рди рдкреНрд░рджрд╛рди рдХрд░рддреЗ рд╣реИрдВред рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ, рдореИрдВ рдЕрдкрдиреЗ SpinTransitionModifier рд╕рдВрд╢реЛрдзрдХ рдХреЗ рдЕрдВрджрд░ рдЕрдВрддрд░реНрдирд┐рд╣рд┐рдд .rotationEffect () рдПрдиреАрдореЗрд╢рди рдкрд░ рдирд┐рд░реНрднрд░ рдерд╛ред

.Transition () рд╕рдВрд╢реЛрдзрдХ рдХреЗрд╡рд▓ рд╕реНрдкрд╖реНрдЯ рдХрд░рддрд╛ рд╣реИ рдХрд┐ рдПрдиреАрдореЗрд╢рди рдХреЗ рдкреНрд░рд╛рд░рдВрдн рдФрд░ рдЕрдВрдд рдмрд┐рдВрджреБ рдХреЗ рд░реВрдк рдореЗрдВ рдХреНрдпрд╛ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВред рдЕрдЧрд░ рд╣рдореЗрдВ рдПрдирд┐рдореЗрд╢рди рд╢реБрд░реВ рдХрд░рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рдПрдирд┐рдореЗрдЯрд┐рдбрдбреЗрдЯрд╛ рд╕реНрдЯреЗрдЯ рдХрд╛ рдЕрдиреБрд░реЛрдз рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рддреЛ рдореМрдЬреВрджрд╛ рд╕реНрдЯреЗрдЯ рдХреЗ рдПрдирд┐рдореЗрдЯрд┐рдбреЗрдЯрд╛ рдореЛрдбрд┐рдлрд╝рд╛рдпрд░ рдХрд╛ рдЕрдиреБрд░реЛрдз рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЕрдВрддрд░ рдХреА рдЧрдгрдирд╛ рдХрд░реЗрдВ, рдФрд░ рдлрд┐рд░ 1 рд╕реЗ 0 рддрдХ рдХреА рдХрдореА рдХреЛ рдЪреЗрддрди рдХрд░реЗрдВ, рдлрд┐рд░ .transition () рдмрд╕ рдореВрд▓ рдбреЗрдЯрд╛ рдХреЛ рдмрджрд▓рддрд╛ рд╣реИред рдЖрдк рдЕрдкрдиреЗ рджреГрд╢реНрдп рдХреА рд╕реНрдерд┐рддрд┐ рд╕реЗ рд╕рдВрд▓рдЧреНрди рдирд╣реАрдВ рд╣реИрдВ, рдЖрдк рдЗрд╕рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдирд╣реАрдВ рд╣реИрдВред рдЖрдк рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдкреНрд░рд╛рд░рдВрднрд┐рдХ рдФрд░ рдЕрдВрддрд┐рдо рд╕реНрдерд┐рддрд┐ рдХреЛ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рддреЗ рд╣реИрдВ, рдЙрдирдореЗрдВ рд╕реЗ рдЖрдк рдПрдирд┐рдореЗрдЯреАрдбрд╛рдЯрд╛ рдкреНрд░рд╛рдкреНрдд рдХрд░рддреЗ рд╣реИрдВ, рдЕрдВрддрд░ рдХреА рдЧрдгрдирд╛ рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рдЗрд╕реЗ рдЪреЗрддрди рдХрд░рддреЗ рд╣реИрдВред рдлрд┐рд░, рдПрдиреАрдореЗрд╢рди рдХреЗ рдЕрдВрдд рдореЗрдВ, рдЖрдкрдХрд╛ рд╡рд░реНрддрдорд╛рди рджреГрд╢реНрдп рд╕рд╛рдордиреЗ рдЖрддрд╛ рд╣реИред

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

рдИрдорд╛рдирджрд╛рд░реА рд╕реЗ, рдпрд╣ рдПрдиреАрдореЗрд╢рди рдирд┐рдпрдВрддреНрд░рдг рддрдВрддреНрд░ рдореБрдЭреЗ рдмрд╣реБрдд рдордЬрдмреВрдд рд▓рдЧрддрд╛ рд╣реИ, рдФрд░ рдореБрдЭреЗ рдереЛрдбрд╝рд╛ рдЦреЗрдж рд╣реИ рдХрд┐ рд╣рдо рдЗрд╕реЗ рдХрд┐рд╕реА рднреА рдПрдиреАрдореЗрд╢рди рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдореИрдВ рдЕрдВрддрд╣реАрди рдмрдВрдж рдПрдиреАрдореЗрд╢рди рдХреЗ рдирд┐рд░реНрдорд╛рдг рдХреЗ рд▓рд┐рдП рдРрд╕реЗ рдордирд╛ рдирд╣реАрдВ рдХрд░реВрдВрдЧрд╛ред рд╣рд╛рд▓рд╛рдБрдХрд┐, рд╣рдо рдЗрд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЕрдЧрд▓реЗ рд▓реЗрдЦ рдореЗрдВ рдмрд╛рдд рдХрд░реЗрдВрдЧреЗред

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

                    Group{
                        if ind == self.currentViewInd{
                            //self.views[ind]
                            Rectangle()
                                .fill(Color.gray)
                                .frame(width: 100, height: 100)
                                .border(Color.black, width: 2)
                                .overlay(Text("\(ind + 1)"))
                              .transition(.asymmetric(
                                  insertion: .spinIn(anchor: .bottomTrailing),
                                  removal: .spinOut(anchor: .bottomTrailing)))
                        }
                    }


рдФрд░ рдЗрд╕ рдЖрдВрджреЛрд▓рди рдХреЛ рдФрд░ рдмреЗрд╣рддрд░ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП, рдореИрдВрдиреЗ SpinTransitionModifier modifier рд╕реЗ .clipped () рд╣рдЯрд╛ рджрд┐рдпрд╛:

struct SpinTransitionModifier: ViewModifier {
    let angle: Double
    let anchor: UnitPoint
    func body(content: Content) -> some View {
        content
            .rotationEffect(Angle(degrees: angle), anchor: anchor)
            //.clipped()
    }
}


рд╡реИрд╕реЗ, рдЕрдм рд╣рдореЗрдВ рдЕрдкрдиреЗ рд╕реНрд╡рдпрдВ рдХреЗ рд╕рдВрд╢реЛрдзрдХ рдореЗрдВ SpinTransitionModifier рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдпрд╣ рдХреЗрд╡рд▓ рджреЛ рдореЙрдбрд┐рдлрд╛рдпрд░реНрд╕, рд░реЛрдЯреЗрд╢рдирдПрдлрд╝реЗрдХреНрдЯ рдФрд░ рдХреНрд▓рд┐рдкреНрдб () рдХреЛ рдПрдХ рдореЗрдВ рдорд┐рд▓рд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдмрдирд╛рдпрд╛ рдЧрдпрд╛ рдерд╛, рддрд╛рдХрд┐ рд░реЛрдЯреЗрд╢рди рдПрдиреАрдореЗрд╢рди рд╣рдорд╛рд░реЗ рд╡реНрдпреВ рдХреЗ рд▓рд┐рдП рдЪреБрдиреЗ рдЧрдП рджрд╛рдпрд░реЗ рд╕реЗ рдЖрдЧреЗ рди рдЬрд╛рдПред рдЕрдм, рд╣рдо .rotationEffect () рдХреЛ рд╕реАрдзреЗ .modifier () рдХреЗ рдЕрдВрджрд░ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рд╣рдореЗрдВ SpinTransitionModifier рдХреЗ рд░реВрдк рдореЗрдВ рдПрдХ рдордзреНрдпрд╕реНрде рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИред

рдЬрдм рджреЗрдЦреЗрдВ рдорд░ рдЬрд╛рддрд╛ рд╣реИ


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

рджреВрд╕рд░реА рдУрд░, рд╣рдореЗрдВ рдЗрд╕ рджреГрд╢реНрдп рдХреЗ рджрд╛рдпрд░реЗ рд╕реЗ рдкрд░реЗ рд╕рднреА рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╕реНрдерд┐рддрд┐ рдХреЛ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред рдЗрд╕рдХреЗ рд▓рд┐рдП, @EnvironmentObject рд╡реИрд░рд┐рдПрдмрд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рд╕рдмрд╕реЗ рдЕрдЪреНрдЫрд╛ рд╣реИред

рдЬреАрд╡рди рдЪрдХреНрд░ рдкрд░ рд▓реМрдЯрддреЗ рд╣реБрдП, рдпрд╣ рднреА рдзреНрдпрд╛рди рджрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП рдХрд┐ .onAppear {} рд╕рдВрд╢реЛрдзрдХ, рдпрджрд┐ рдХреЛрдИ рдЗрд╕ рджреГрд╢реНрдп рдХреЗ рдЕрдВрджрд░ рдкрдВрдЬреАрдХреГрдд рд╣реИ, рддреЛ рд╕реНрдерд┐рддрд┐ рдмрджрд▓рдиреЗ рдХреЗ рддреБрд░рдВрдд рдмрд╛рдж рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ рдФрд░ рдПрдиреАрдореЗрд╢рди рд╢реБрд░реВ рд╣реЛрдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рд╣реА рд╕реНрдХреНрд░реАрди рдкрд░ рджреГрд╢реНрдп рдХреА рдЙрдкрд╕реНрдерд┐рддрд┐ рджрд┐рдЦрд╛рдИ рджреЗрддреА рд╣реИред рддрджрдиреБрд╕рд╛рд░, рдЧрд╛рдпрдм рдПрдиреАрдореЗрд╢рди рдХреЗ рдЕрдВрдд рдХреЗ рдмрд╛рдж onDisappear {} рдХреЛ рдЯреНрд░рд┐рдЧрд░ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдЗрд╕реЗ рдзреНрдпрд╛рди рдореЗрдВ рд░рдЦреЗрдВ рдпрджрд┐ рдЖрдк рдЙрдиреНрд╣реЗрдВ рд╕рдВрдХреНрд░рдордг рдПрдиреАрдореЗрд╢рди рдХреЗ рд╕рд╛рде рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдпреЛрдЬрдирд╛ рдмрдирд╛рддреЗ рд╣реИрдВред

рдЖрдЧреЗ рдХреНрдпрд╛ рд╣реЛрдЧрд╛?


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

рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рднрд╛рдЧ рд╣рдореЗрдВ рдЗрдВрддрдЬрд╛рд░ рдХрд░ рд░рд╣рд╛ рд╣реИ:

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

рдореИрдВ рдЗрд╕ рд╕рднреА рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╡рд┐рд╕реНрддрд╛рд░ рд╕реЗ рдмрд╛рдд рдХрд░реВрдВрдЧрд╛, рдЗрдВрджреНрд░рдзрдиреБрд╖ рдПрдиреАрдореЗрд╢рди рдмрдирд╛рдиреЗ рдХреЗ рдЙрджрд╛рд╣рд░рдг рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ, рдЬреИрд╕рд╛ рдХрд┐ рддрд╕реНрд╡реАрд░ рдореЗрдВ рд╣реИ:


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

All Articles