рдЬреВрди рдореЗрдВ, рд╣рдордиреЗ рдкрд╣рд▓реА рдмрд╛рд░
SwiftUI рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╕реБрдирд╛ - iOS рдФрд░ macOS (iPadOS) рдРрдкреНрд╕ рдореЗрдВ UI рддрддреНрд╡реЛрдВ рдХреЗ рд╕рд╛рде рдмрдирд╛рдиреЗ рдФрд░ рдХрд╛рдо рдХрд░рдиреЗ рдХрд╛ рдПрдХ рдмрд┐рд▓реНрдХреБрд▓ рдирдпрд╛ рддрд░реАрдХрд╛ред рдпрд╣ рдЧрд░реНрдорд┐рдпреЛрдВ рдореЗрдВ рдХреНрд░рд┐рд╕рдорд╕ рдХреА рддрд░рд╣ рдорд╣рд╕реВрд╕ рдХрд┐рдпрд╛ред рдпрд╣ рдирдпрд╛ рд╣реИ, рдпрд╣ рдШреЛрд╖рдгрд╛рддреНрдордХ рд╣реИ, рдпрд╣ рд╕реЗрдХреНрд╕реА рд╣реИ! рдФрд░ рдЕрдм, iOS 13 рдЬрд╛рд░реА рд╣реЛрдиреЗ рдХреЗ рдХреБрдЫ рд╣рдлреНрддреЗ рдмрд╛рдж, рд╣рдо рдЕрдкрдиреЗ рд╕рднреА рдкреНрд░реЛрдЬреЗрдХреНрдЯреНрд╕ рдореЗрдВ SwiftUI рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рд╢реБрд░реВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдЖрдЗрдП рдЬрд╛рдиреЗрдВ рдХрд┐ рдЗрд╕ рдЕрджреНрднреБрдд рдЙрдкрдХрд░рдг рдХрд╛ рдЙрдкрдпреЛрдЧ рдХреИрд╕реЗ рдХрд░реЗрдВ рдЬреЛ рдХрд┐ Apple рдиреЗ рд╣рдореЗрдВ рджрд┐рдпрд╛ рдерд╛, рдХреНрд▓рд╛рд╕рд┐рдХ рдЯрд┐рдВрдбрд░-рдПрд╕реНрдХ рд╕реНрд╡рд╛рдЗрдк рдХрд╛рд░реНрдб рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдПред
рдЗрд╕ рд▓реЗрдЦ рдореЗрдВ, рдореИрдВ рдЖрдкрдХреЛ рдХреЗрд╡рд▓ рдХреБрдЫ рдкрдВрдХреНрддрд┐рдпреЛрдВ рдХреЗ рд╕рд╛рде рдПрдХ рдЯрд┐рдВрдбрд░ рдЬреИрд╕рд╛ рдХрд╛рд░реНрдб рджреГрд╢реНрдп рдФрд░ рд╡реНрдпрд╡рд╣рд╛рд░ (рдХрд╛рд░реНрд░рд╡рд╛рдИ рдХреЗ рд▓рд┐рдП рд╕реНрд╡рд╛рдЗрдк рдХрд░рдирд╛) рдкреНрд░рд╛рдкреНрдд рдХрд░рдирд╛ рджрд┐рдЦрд╛рддрд╛ рд╣реВрдВред
рдЗрд╕реЗ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдореЗрдВ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдмрд╛рддреЗрдВ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ:
- рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рджреГрд╢реНрдп рдмрдирд╛рдПрдБ
- рдиреЗрд╡реАрдЧреЗрд╢рди рдмрдирд╛рдПрдБ
- рдмреЙрдЯрдордмрд╛рд░ рд╡реНрдпреВ рдмрдирд╛рдПрдВ
- рд╕реНрд╡рд╛рдЗрдкрд╡реНрдпреВ рдмрдирд╛рдПрдВ
- ContentView рдХреЗ рдЕрдВрджрд░ рдпрд╣ рд╕рдм рдПрдХ рд╕рд╛рде рд░рдЦреЗрдВ
рддреЛ рдЪрд▓рд┐рдП рд╢реБрд░реВ рдХрд░рддреЗ рд╣реИрдВред
UserView
UserView рджреЛ рд╕рдмрд╡реНрдпреВ рд╕реЗ рдмрдирд╛рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдПрдХ
NameView рд╣реИ рдЬрд┐рд╕рдореЗрдВ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдирд╛рдо, рдЖрдпреБ рдФрд░ рд╢реМрдХ рд╢рд╛рдорд┐рд▓ рд╣реИрдВ, рдФрд░ рджреВрд╕рд░рд╛ рджреГрд╢реНрдп рдХреЗрд╡рд▓ рдПрдХ рдЕрд╡рддрд╛рд░ рджреГрд╢реНрдп рд╣реИ рдЬреЛ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЗ рдкреНрд░реЛрдлрд╝рд╛рдЗрд▓ рдЪрд┐рддреНрд░ рдХреЛ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рддрд╛ рд╣реИред
struct NameView: View { let name: String let age: Int let hobby: String var body: some View { VStack(alignment: .leading) { Spacer() Text("\(name), \(age)") .font(.title) .fontWeight(.semibold) .foregroundColor(.white) Text(hobby) .font(.system(size: 16)) .fontWeight(.regular) .foregroundColor(.white) } .padding() } }
рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рд╣рдореЗрдВ
NameView рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рдиреЗ рдХреА
рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ , рдпрд╣ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдирд╛рдо, рдЖрдпреБ рдФрд░ рд╢реМрдХ рдХрд╛ рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рдХрд░реЗрдЧрд╛ред
NameView рд╡реНрдпреВ рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рдХреЗ рдЕрдиреБрд░реВрдк рд╣реИ, рдЬрд┐рд╕рдХрд╛ рдЙрдкрдпреЛрдЧ SwiftUI рдореЗрдВ рдХрд╕реНрдЯрдо рджреГрд╢реНрдпреЛрдВ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рджреГрд╢реНрдп рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рдХреА рдХреЗрд╡рд▓ рдПрдХ рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ рдФрд░ рдпрд╣ рд╢рд░реАрд░ рдХреА рд╕рдВрдкрддреНрддрд┐ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рддрд╛ рд╣реИ рдЬреЛ рджреГрд╢реНрдп рд╕рдВрд░рдЪрдирд╛ рдХреЛ рд╡рд╛рдкрд╕ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП рдФрд░ рдЗрд╕рдХреЗ рд╡реНрдпрд╡рд╣рд╛рд░ рдХрд╛ рд╡рд░реНрдгрди рдХрд░рддрд╛ рд╣реИред рдЖрдк рдЖрдзрд┐рдХрд╛рд░рд┐рдХ
Apple рджрд╕реНрддрд╛рд╡реЗрдЬрд╝ рдореЗрдВ
рджреГрд╢реНрдп рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЕрдзрд┐рдХ рдЬрд╛рдирдХрд╛рд░реА рдкреНрд░рд╛рдкреНрдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред
рдЖрдЗрдП рдЗрд╕
рджреГрд╢реНрдп рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╣рдорд╛рд░реЗ рджреНрд╡рд╛рд░рд╛ рдЙрдкрдпреЛрдЧ рдХреА рдЬрд╛рдиреЗ рд╡рд╛рд▓реА рд╡рд╕реНрддреБрдУрдВ рдХреЛ рддреЛрдбрд╝ рджреЗрдВ:
- VStack рдЬреЛ рд╕рднреА рд╡рд╕реНрддреБрдУрдВ рдХреЗ рд▓рд┐рдП рдПрдХ рдХрдВрдЯреЗрдирд░ рдХреА рддрд░рд╣ рдХрд╛рд░реНрдп рдХрд░рддрд╛ рд╣реИ рдЬреЛ рдЙрдиреНрд╣реЗрдВ рд▓рдВрдмрд╡рдд рд░реВрдк рд╕реЗ рд╕рдВрд░реЗрдЦрд┐рдд рдХрд░рддрд╛ рд╣реИ
- рд╕реНрдкреЗрд╕рд░ рдЬреЛ рд╕реНрд╡рд┐рдлреНрдЯрдпреВрдЖрдИ рдХреЛ рдмрддрд╛рддрд╛ рд╣реИ рдХрд┐ рдЗрд╕ рджреГрд╢реНрдп рдХреЛ рддрд▓ рдкрд░ рд╕рдВрд░реЗрдЦрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП
- рдкрд╛рда рдЬреЛ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдЧреБрдгреЛрдВ рдХреЗ рд╕рд╛рде рдирд╛рдо рдФрд░ рдЙрдореНрд░ рдХреЗ рд╕рд╛рде рд▓реЗрдмрд▓ рдХрд╛ рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рдХрд░рддрд╛ рд╣реИ:
- рджреВрд╕рд░рд╛ рдЯреЗрдХреНрд╕реНрдЯ рдСрдмреНрдЬреЗрдХреНрдЯ рдЬрд┐рд╕рдореЗрдВ рд╕рдорд╛рди рдЧреБрдг рд╣реИрдВ рдФрд░ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЗ рд╢реМрдХ рдХреЛ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рддрд╛ рд╣реИ
рдХреГрдкрдпрд╛ рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ рд╣рдо рдпрд╣рд╛рдВ рд░рд┐рдЯрд░реНрди рд╕реНрдЯреЗрдЯрдореЗрдВрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд░ рд░рд╣реЗ рд╣реИрдВ, рд╢рд░реАрд░ рдХреА рд╕рдВрдкрддреНрддрд┐ рдХреЗ рдЕрдВрджрд░, рд▓реЗрдХрд┐рди рдЗрд╕рдХреЗ рдмрдЬрд╛рдп рд╣рдо рдПрдХ VStack рд▓реМрдЯрд╛ рд░рд╣реЗ рд╣реИрдВред рд╕реНрд╡рд┐рдлреНрдЯрдпреВрдЖрдИ рд╕реНрд╡рд┐рдлреНрдЯ 5.0 рдореЗрдВ рд▓рд╛рдЧреВ рдХрд┐рдП рдЧрдП рдУрдорд┐рдЯ-рд░рд┐рдЯрд░реНрди рдкреНрд░рд╕реНрддрд╛рд╡ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣рд╛ рд╣реИред рдЖрдк рдЗрд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЕрдзрд┐рдХ рдЬрд╛рдирдХрд╛рд░реА
рдпрд╣рд╛рдВ рджреЗрдЦ рд╕рдХрддреЗ
рд╣реИрдВ ред
AvatarView
рдЗрд╕ рддрд░рд╣ рд╕реЗ
рдЕрд╡рддрд╛рд░рд╡рд╛рдж рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ:
struct AvatarView: View { let image: UIImage var body: some View { Image(uiImage: image) .resizable() .overlay( Rectangle() .fill(LinearGradient(gradient: Gradient(colors: [.clear, .black]), startPoint: .center, endPoint: .bottom)) .clipped() ) .cornerRadius(12.0) } }
рдЖрдЗрдП рдЙрди рдШрдЯрдХреЛрдВ рдореЗрдВ рдЧреЛрддрд╛ рд▓рдЧрд╛рдПрдБ рдЬреЛ рдЗрд╕ рдЕрд╡рддрд╛рд░ рдЗрдХрд╛рдИ рдХреЛ рдмрдирд╛ рд░рд╣реЗ рд╣реИрдВ:
- рдЪрд┐рддреНрд░ - рдЬреЛ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреА рддрд╕реНрд╡реАрд░ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рддрд╛ рд╣реИ
- resizable - рдпрд╣ рд╡рд┐рдзрд┐ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рддреА рд╣реИ рдХрд┐ рдЫрд╡рд┐ рдХреЛ рдЙрд╕ рд╕реНрдерд╛рди рдкрд░ рдлрд┐рдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрдХрд╛рд░ рдмрджрд▓рдирд╛ рдЪрд╛рд╣рд┐рдП рдЬрд╣рд╛рдВ рдпрд╣ рдПрдореНрдмреЗрдбреЗрдб рд╣реИ
- рдУрд╡рд░рд▓реЗ (рдЖрдпрдд) - рдпрд╣рд╛рдБ рд╣рдо рдЧреНрд░реЗрдбрд┐рдПрдВрдЯ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░ рд░рд╣реЗ рд╣реИрдВ рдЬреЛ NameView рдХреЗ рд▓рд┐рдП рдПрдХ рдЕрдЪреНрдЫрд╛ рдмреИрдХрдЧреНрд░рд╛рдЙрдВрдб рд╣реЛрдЧрд╛, рдпрд╣ рдЧреНрд░реЗрдбрд┐рдПрдВрдЯ рдЗрдореЗрдЬ рд╕реЗрдВрдЯрд░ рдкрд░ рд╢реБрд░реВ рд╣реЛрддрд╛ рд╣реИ рдФрд░ рд╕рдмрд╕реЗ рдиреАрдЪреЗ рдлрд┐рдирд┐рд╢ рдХрд░рддрд╛ рд╣реИ, рдЗрд╕рдореЗрдВ рд╢реБрд░реБрдЖрдд рдореЗрдВ рд╕рд╛рдл рд░рдВрдЧ рдФрд░ рд╕рдмрд╕реЗ рдиреАрдЪреЗ рдмреНрд▓реИрдХ рд╣реИ
- рдХреЛрдиреЗрд░реЗрдбрд┐рдпрд╕ - рдЪрд┐рддреНрд░ рдореЗрдВ рдПрдХ рдХреЙрд░реНрдирд┐рдпрд╕ рддреНрд░рд┐рдЬреНрдпрд╛ рд╣реЛрдЧреА
рдФрд░ рдЕрдм рдЗрди рджреЛ рд╡рд┐рдЪрд╛рд░реЛрдВ рдХреЛ рдПрдХ рдПрдХрд▓ рдХрдВрдЯреЗрдирд░ рджреГрд╢реНрдп рдореЗрдВ рдПрдореНрдмреЗрдб рдХрд░реЗрдВ, рдЬрд┐рд╕рдХрд╛ рдирд╛рдо
UserView рд╣реИ ред
UserView
struct UserView: View { let userModel: UserModel var body: some View { ZStack(alignment: .leading) { AvatarView(image: userModel.image) NameView(name: userModel.name, age: userModel.age, hobby: userModel.hobby) } .shadow(radius: 12.0) .cornerRadius(12.0) } }
рдпрд╣рд╛рдБ рдХреНрдпрд╛ рд╣реЛ рд░рд╣рд╛ рд╣реИ:
- ZStack - рдпрд╣ рдПрдХ рд╕реНрдЯреИрдХ рджреГрд╢реНрдп рд╣реИ рдЬреЛ рдПрдХ рд╣реА рдЕрдХреНрд╖ рдкрд░ рдЕрдкрдиреЗ рдмрдЪреНрдЪреЛрдВ рдХреЛ рд╕рдВрд░реЗрдЦрд┐рдд рдХрд░реЗрдЧрд╛ред рдЖрдк рдпрд╣рд╛рдВ ZStack рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЕрдзрд┐рдХ рдкрдврд╝ рд╕рдХрддреЗ рд╣реИрдВ
- AvatarView - рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдЕрд╡рддрд╛рд░ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдкреНрд░рджрд╛рди рдХреА рдЧрдИ рдЫрд╡рд┐ рд╡рд╛рд▓рд╛ рд╣рдорд╛рд░рд╛ рдЕрд╡рддрд╛рд░ рджреГрд╢реНрдп
- NameView - рд╣рдорд╛рд░рд╛ рдирд╛рдо рджреГрд╢реНрдп рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдореЙрдбрд▓ рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдирд╛рдо рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рддрд╛ рд╣реИ
рдЗрди рд╕рднреА рд╕реНрдЯреЗрдкреНрд╕ рдХреЗ рдмрд╛рдж рдРрдк рдХреЛ рд░рди рдХрд░реЗрдВред рдЖрдкрдХреЛ рдирд┐рдореНрди рд╕реНрдХреНрд░реАрди рдорд┐рд▓реЗрдЧреА:
рдЕрдм рдПрдХ рдЫреЛрдЯреА рд╕рд╣рд╛рдпрдХ рд╡рд┐рдзрд┐ рдЬреЛрдбрд╝реЗрдВред рдЗрд╕рд╕реЗ рдкрд╣рд▓реЗ рдХрд┐ рдореИрдВ рдЖрдкрдХреЛ рджрд┐рдЦрд╛рдКрдВ рдХрд┐ рдХреИрд╕реЗ рдиреЗрд╡рд┐рдЧреЗрд╢рдирд╡реНрдпреВ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдЪрд▓реЛ рдПрдХ рд╕рд╣рд╛рдпрдХ рд╡рд┐рдзрд┐ рдмрдирд╛рддреЗ рд╣реИрдВ, рдЬреЛ рдЗрд╕ рддрд░рд╣ рджрд┐рдЦрддрд╛ рд╣реИ:
struct ViewFactory { static func button(_ name: String, renderingMode: Image.TemplateRenderingMode = .original) -> some View { Button(action: {}) { Image(name) .renderingMode(renderingMode) } } }
рдпрд╣рд╛рдВ, рд╣рдордиреЗ рдПрдХ рдмрдЯрди рдлреИрдХреНрдЯрд░реА рд╡рд┐рдзрд┐ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд┐рдпрд╛ рд╣реИ, рдЬреЛ рдХрд┐рд╕реА рджрд┐рдП рдЧрдП рдЪрд┐рддреНрд░ рдФрд░ рд░реЗрдВрдбрд░рд┐рдВрдЧ рдореЛрдб рд╕реЗ рдПрдХ рдирдпрд╛ рдмрдЯрди рдмрдирд╛рддрд╛ рд╣реИред рдХреЛрдИ рдПрдХреНрд╢рди рд╣реИрдВрдбрд▓рд░ рдирд╣реАрдВ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рд╡рд╣ рдЗрд╕ рд▓реЗрдЦ рдХреЗ рджрд╛рдпрд░реЗ рд╕реЗ рдмрд╛рд╣рд░ рд╣реИред
NavigationView
struct NavigationView: View { var body: some View { HStack { ViewFactory.button("profile_icon") Spacer() ViewFactory.button("fire_icon") .scaleEffect(2) Spacer() ViewFactory.button("chat_icon") } } }
SwiftUI рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ рд╕рдорд╛рди рдЪреМрдбрд╝рд╛рдИ рдХреЗ рд╕реНрдкреЗрд╕рд░ рдмрдирд╛ рджреЗрдЧрд╛, рдФрд░ рдпрд╣ рд╣рдореЗрдВ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдиреЗрд╡рд┐рдЧреЗрд╢рди рджреГрд╢реНрдп рджреЗрдЧрд╛:
BottomBarView
struct BottomBarView: View { var body: some View { HStack { ViewFactory.button("back_icon", renderingMode: .template) .foregroundColor(.orange) .background( GeometryReader { geometry in Circle() .offset(x: 2.5) .foregroundColor(.white) .shadow(color: .gray, radius: 12) .frame(width: geometry.size.width * 1.5, height: geometry.size.height * 1.5) } ) Spacer() ... }
рдЙрдкрд░реЛрдХреНрдд рдХреЛрдб рд╕реНрдирд┐рдкреЗрдЯ рдореЗрдВ, рд╣рдордиреЗ рдЕрдкрдиреЗ рдмрд╛рд░ рд╡реНрдпреВ рд╕реЗ рдкрд╣рд▓рд╛ рдмрдЯрди рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд┐рдпрд╛ рд╣реИред рдпрд╣рд╛рдБ рдХреНрдпрд╛ рд╣реЛ рд░рд╣рд╛ рд╣реИ:
- ViewFactory.button - рдпрд╣рд╛рдБ рд╣рдо рдкреНрд░рддрд┐рдкрд╛рджрди рдХреЗ рд╕рд╛рде рдЫрд╡рд┐ рдХреЗ рд╕рд╛рде рдмрдЯрди рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╣рдорд╛рд░реА рд╕рд╣рд╛рдпрдХ рд╡рд┐рдзрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣реЗ рд╣реИрдВред рдореЗрдореЛрд░реАред рдЬреЛ рдЖрдкрдХреЛ рдЗрд╕ рдЫрд╡рд┐ рдХреЗ рд▓рд┐рдП рдПрдХ рдХрд╕реНрдЯрдо рд░рдВрдЧ рдбрд╛рд▓рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред
- .foregroundColor - рд╣рдорд╛рд░реЗ рд╡рд┐рдЪрд╛рд░ рдХрд╛ рд░рдВрдЧ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рдирд╛
- .background - рдпрд╣ рд╡рд┐рдзрд┐ рджреА рдЧрдИ рд╡рд╕реНрддреБ рдХреА рдкреГрд╖реНрдарднреВрдорд┐ рджреГрд╢реНрдп рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рддреА рд╣реИ
- рдЬрд┐рдпреЛрдореЗрдЯреНрд░реА рд░рд╛рдЗрдбрд░ - рдПрдХ рдХрдВрдЯреЗрдирд░ рджреГрд╢реНрдп рдЬреЛ рдЕрдкрдиреА рд╕рд╛рдордЧреНрд░реА рдХреЛ рдЕрдкрдиреЗ рд╕реНрд╡рдпрдВ рдХреЗ рдЖрдХрд╛рд░ рдХреЗ рдПрдХ рдлрд╝рдВрдХреНрд╢рди рдХреЗ рд░реВрдк рдореЗрдВ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рддрд╛ рд╣реИ рдФрд░ рдЕрдВрддрд░рд┐рдХреНрд╖ рдХреЛ рд╕рдордиреНрд╡рд┐рдд рдХрд░рддрд╛ рд╣реИред рд╣рдо рдПрдХ рдмрдЯрди рдХреЗ рд╡рд░реНрддрдорд╛рди рдЖрдХрд╛рд░ рдХреЛ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдФрд░ рджрд┐рдП рдЧрдП рдлреНрд░реЗрдо рдХреЗ рд╕рд╛рде рдкреГрд╖реНрдарднреВрдорд┐ рд╕рд░реНрдХрд▓ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣реЗ рд╣реИрдВред рдпрд╣рд╛рдБ рдЬреНрдпрд╛рдорд┐рддрд┐ рдкрд╛рдардХреЛрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЕрдзрд┐рдХ рдЬрд╛рдиреЗрдВред
- рд╡реГрддреНрдд - рдкреГрд╖реНрдарднреВрдорд┐ рдХреА рдЖрдХреГрддрд┐ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рддрд╛ рд╣реИ
- .offset - рд╕рд░реНрдХрд▓ x- рдЕрдХреНрд╖ рдСрдлрд╝рд╕реЗрдЯ
- .foregroundColor - рд╕рд░реНрдХрд▓ рдЯрд┐рдВрдЯ рд░рдВрдЧ
- .рд╢рд╛рджреЛ - рд╡реГрддреНрдд рдЫрд╛рдпрд╛
- .frame - рдЬреНрдпрд╛рдорд┐рддрд┐ рд░реАрдбрд░ рдХреЗ рдЖрдХрд╛рд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд╕рд░реНрдХрд▓ рдлреНрд░реЗрдо рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рддрд╛ рд╣реИ (рдпрд╣рд╛рдВ рд╣рдо рдПрдХ рдкреГрд╖реНрдарднреВрдорд┐ рд╕рд░реНрдХрд▓ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░ рд░рд╣реЗ рд╣реИрдВ, рд╡рд░реНрддрдорд╛рди рд╕реНрдерд┐рддрд┐ рд╕реЗ 1.5x рдмрдбрд╝рд╛ рд╣реИ)
рдЕрдм рдмрд╛рдХреА рдмрдЯрди рд▓рд╛рдЧреВ рдХрд░рддреЗ рд╣реИрдВ:
struct BottomBarView: View { var body: some View { HStack { ViewFactory.button("back_icon", renderingMode: .template) .foregroundColor(.orange) .background( GeometryReader { geometry in Circle() .offset(x: 2.5) .foregroundColor(.white) .shadow(color: .gray, radius: 12) .frame(width: geometry.size.width * 1.5, height: geometry.size.height * 1.5) } ) Spacer() ViewFactory.button("close_icon", renderingMode: .template) .foregroundColor(.red) .background( GeometryReader { geometry in Circle().foregroundColor(.white) .frame(width: geometry.size.width * 2, height: geometry.size.height * 2) .shadow(color: .gray, radius: 12) } ) Spacer() ViewFactory.button("approve_icon", renderingMode: .template) .foregroundColor(.green) .background( GeometryReader { geometry in Circle() .foregroundColor(.white) .shadow(color: .gray, radius: 12) .frame(width: geometry.size.width * 2, height: geometry.size.height * 2) } ) Spacer() ViewFactory.button("boost_icon", renderingMode: .template) .foregroundColor(.purple) .background( GeometryReader { geometry in Circle() .foregroundColor(.white) .shadow(color: .gray, radius: 12) .frame(width: geometry.size.width * 1.5, height: geometry.size.height * 1.5) } ) } .padding([.leading, .trailing]) } }
рдФрд░ рдЗрд╕рдХреЗ рдкрд░рд┐рдгрд╛рдорд╕реНрд╡рд░реВрдк рдЕрдм рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдпрд╣ рд╕реБрдВрджрд░ рджреГрд╢реНрдп рд╣реИ:
SwipeView
рдпрд╣ рдЦрдВрдб рдЕрдзрд┐рдХ рдЙрдиреНрдирдд рд╕реНрд╡рд┐рдлреНрдЯрдпреВрдЖрдИ рдХреЗ рд▓рд┐рдП рд╣реИред рдпрд╣ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рд╣реИ рдЬрд╣рд╛рдВ рдЪреАрдЬреЗрдВ рджрд┐рд▓рдЪрд╕реНрдк рд╣реЛрддреА рд╣реИрдВред рд╣рдо рдПрдХреНрд╢рди рджреГрд╢реНрдп рдкрд░ рд╕реНрд╡рд╛рдЗрдк рдЬреЗрд╕реНрдЪрд░ рд▓рд╛рдЧреВ рдХрд░рдирд╛ рдЪрд╛рд╣реЗрдВрдЧреЗред рдпрд╣ рд╡реНрдпрд╡рд╣рд╛рд░ PageViewController рдХреЗ рд▓рд┐рдП рдПрдХ рдЕрдЪреНрдЫрд╛ рдЙрдкрдпреЛрдЧ рдорд╛рдорд▓рд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ рджреГрд╢реНрдп рдирд┐рдпрдВрддреНрд░рдХ рдЬрд▓реНрдж рд╣реА рдЗрддрд┐рд╣рд╛рд╕ рд╣реЛрдЧрд╛, рдЗрд╕рд▓рд┐рдП рдпрд╣ рд╡рд╣ рдЬрдЧрд╣ рд╣реИ рдЬрд╣рд╛рдВ рд╣рдо рд╕реНрд╡рд┐рдлреНрдЯрдпреВрдЖрдИ рдХреА рд╡рд╛рд╕реНрддрд╡рд┐рдХ рд╢рдХреНрддрд┐ рджрд┐рдЦрд╛ рд╕рдХрддреЗ рд╣реИрдВред
рддреЛ рдЖрдЗрдпреЗ рджреЗрдЦрддреЗ рд╣реИрдВ рдХрд┐ SwipeView рдХреИрд╕реЗ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ:
struct SwipeView: View { @State private var offset: CGFloat = 0 @State private var index = 0 let users = [...] let spacing: CGFloat = 10 var body: some View { GeometryReader { geometry in return ScrollView(.horizontal, showsIndicators: true) { HStack(spacing: self.spacing) { ForEach(self.users) { user in UserView(userModel: user) .frame(width: geometry.size.width) } } } .content.offset(x: self.offset) .frame(width: geometry.size.width, alignment: .leading) .gesture( DragGesture() .onChanged({ value in self.offset = value.translation.width - geometry.size.width * CGFloat(self.index) }) .onEnded({ value in if -value.predictedEndTranslation.width > geometry.size.width / 2, self.index < self.users.count - 1 { self.index += 1 } if value.predictedEndTranslation.width > geometry.size.width / 2, self.index > 0 { self.index -= 1 } withAnimation { self.offset = -(geometry.size.width + self.spacing) * CGFloat(self.index) } }) ) } } }
рдпрд╣рд╛рдВ рд╣рдордиреЗ рдХреБрдЫ рдирдИ рд░реЛрдЪрдХ рд╕реНрд╡рд┐рдлреНрдЯрдпреВрдЖрдИ рдЕрд╡рдзрд╛рд░рдгрд╛рдУрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рд╣реИ:
- @ рд░рд╛рдЬреНрдп - рдХрд┐рд╕реА рджрд┐рдП рдЧрдП рдкреНрд░рдХрд╛рд░ рдХрд╛ рд▓рдЧрд╛рддрд╛рд░ рдореВрд▓реНрдп, рдЬрд┐рд╕рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдПрдХ рджреГрд╢реНрдп рдкрдврд╝рддрд╛ рд╣реИ рдФрд░ рдореВрд▓реНрдп рдХреА рдирд┐рдЧрд░рд╛рдиреА рдХрд░рддрд╛ рд╣реИ, рдЬрд┐рд╕рдХрд╛ рдЕрд░реНрде рд╣реИ рдХрд┐ рдЬрдм рднреА рдпрд╣ рд╕рдВрдкрддреНрддрд┐ рдмрджрд▓ рдЬрд╛рдПрдЧреА, рддреЛ рджрд┐рдП рдЧрдП рд░рд╛рдЬреНрдп рдЕрджреНрдпрддрди рдореЗрдВ рд╕рдорд╛рдпреЛрдЬрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рджреГрд╢реНрдп рдкреБрдирдГ рд▓реЛрдб рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред рдЖрдк рдпрд╣рд╛рдВ рд╕реНрдЯреЗрдЯ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЕрдзрд┐рдХ рдЬрд╛рдирдХрд╛рд░реА рдкреНрд░рд╛рдкреНрдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ ред
- DragGesture - рдЗрд╕ рдСрдмреНрдЬреЗрдХреНрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдкреНрд░рддреНрдпреЗрдХ рд╕реНрд╡рд╛рдЗрдк рдХреЛ рдкрд╣рдЪрд╛рдирдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ рдЬреЛ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рд╕реНрдХреНрд░реАрди рдкрд░ рдмрдирд╛рддрд╛ рд╣реИред рдЖрдк рдЗрд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдпрд╣рд╛рдБ рдФрд░ рдЕрдзрд┐рдХ рдкрдврд╝ рд╕рдХрддреЗ рд╣реИрдВ: developer.apple.com/documentation/swiftui/draggesture
- @ рд░рд╛рдЬреНрдп рдирд┐рдЬреА рд╕рдВрд╕реНрдХрд░рдг рдСрдлрд╝рд╕реЗрдЯ: CGFloat = 0 - рдЗрд╕ рдЧреБрдг рдХрд╛ рдЙрдкрдпреЛрдЧ рд╡рд░реНрддрдорд╛рди рд╕реНрдХреНрд░реЙрд▓ рджреГрд╢реНрдп рдСрдлрд╕реЗрдЯ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ рдЬрдм рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рд╕реНрдХреНрд░реАрди рдкрд░ рд╕реНрд╡рд╛рдЗрдк рдХрд░реЗрдВрдЧреЗред
- @ рд░рд╛рдЬреНрдп рдирд┐рдЬреА рд╕рдВрд╕реНрдХрд░рдг рдЕрдиреБрдХреНрд░рдордгрд┐рдХрд╛ = 0 - рдпрд╣ рдЧреБрдг рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рддрд╛ рд╣реИ рдХрд┐ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХрд╛ рджреГрд╢реНрдп рд╡рд░реНрддрдорд╛рди рдореЗрдВ рд╕реНрдХреНрд░реАрди рдкрд░ рд╣реИ
- рд╕реНрдХреНрд░реЙрд▓рд╡реНрдпреВ - рд╕рдВрдХреЗрддрдХ рдХреЗ рдмрд┐рдирд╛ рдХреНрд╖реИрддрд┐рдЬ рд╕реНрдХреНрд░реЙрд▓ рджреГрд╢реНрдп, рдЬреЛ рд╣рдорд╛рд░реЗ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рджреГрд╢реНрдп рдХреЗ рд▓рд┐рдП рдПрдХ рдХрдВрдЯреЗрдирд░ рд╣реЛрдЧрд╛
- HStack - рдХреНрд╖реИрддрд┐рдЬ рд╕реНрдЯреИрдХ рджреГрд╢реНрдп рдЬрд┐рд╕рдореЗрдВ рд╕рднреА рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рджреГрд╢реНрдп рд╣реЛрддреЗ рд╣реИрдВ
- content.offset (self.offset) - рдпрд╣ рдСрдлрд╝рд╕реЗрдЯ рд╕реНрдЯреЗрдЯ рдФрд░ рд╕реНрдХреНрд░реЙрд▓ рд╡реНрдпреВ рдХрдВрдЯреЗрдВрдЯ рдСрдлрд╝рд╕реЗрдЯ рдХреЗ рдмреАрдЪ рдПрдХ рд╕рдВрдмрдВрдз рдмрдирд╛ рд░рд╣рд╛ рд╣реИред рдЗрд╕рдХрд╛ рдорддрд▓рдм рдпрд╣ рд╣реИ рдХрд┐ рдЬрдм рднреА рдСрдлрд╝рд╕реЗрдЯ рдкреНрд░реЙрдкрд░реНрдЯреА рдмрджрд▓реЗрдЧреА, рд╕реНрдХреНрд░реЙрд▓ рд╡реНрдпреВ рдСрдлрд╝рд╕реЗрдЯ рднреА рдЕрдкрдбреЗрдЯ рд╣реЛ рдЬрд╛рдПрдВрдЧреЗ
рд╣рдо рдкреНрд░рддреНрдпреЗрдХ рддрддреНрд╡ рдХреЗ рд▓рд┐рдП рдПрдХ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛
рджреГрд╢реНрдп рдмрдирд╛рдХрд░ рдореМрдЬреВрджрд╛ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ рдкрд░
рднрд░реЛрд╕рд╛ рдХрд░ рд░рд╣реЗ рд╣реИрдВ:
- .frame - рдпрд╣рд╛рдВ рд╣рдо рд╕реНрдХреНрд░реЙрд▓ рд╡реНрдпреВ рдлреНрд░реЗрдо рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░ рд░рд╣реЗ рд╣реИрдВ рдЬреЛ рд╕реНрдХреНрд░реАрди рдХреА рдЪреМрдбрд╝рд╛рдИ рдореЗрдВ рдлрд┐рдЯ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП, рдФрд░ рдЗрд╕рдХреЗ рдХрдВрдЯреЗрдирд░ рдореЗрдВ рдареАрдХ рд╕реЗ рд╕рдВрд░реЗрдЦрд┐рдд рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП
- .esture - рдпрд╣рд╛рдБ рд╣рдо рдЕрдкрдиреА DragGesture рдСрдмреНрдЬреЗрдХреНрдЯ рдЬреЛрдбрд╝ рд░рд╣реЗ рд╣реИрдВ
DragGesture рдереЛрдбрд╝рд╛ рдЬрдЯрд┐рд▓ рд╣реИ, рд▓реЗрдХрд┐рди рдлрд┐рд░ рднреА, рдпрд╣ рдХреЛрдб рдХреЗ рдХреБрдЫ рд╣реА рдкрдВрдХреНрддрд┐рдпреЛрдВ рдореЗрдВ рд╕рднреА
рдкреЗрдЬрд┐рдиреЗрд╢рди рддрд░реНрдХ рдЬреЛрдбрд╝рддрд╛ рд╣реИред рдЪрд▓реЛ рдиреАрдЪреЗ
рдЦреАрдВрдЪреЗрдВрдЧреНрд░реЗрд╕реНрдЯреБрд░ :
- onChanged () - рдЬрдм рднреА рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рд╢реБрд░реВ рд╣реЛрддрд╛ рд╣реИ рдФрд░ рдЗрд╢рд╛рд░реЗ рдХреЛ рдЦреАрдВрдЪрдиреЗ рдХреЗ рджреМрд░рд╛рди рдпрд╣ рдмреНрд▓реЙрдХ рдЖрд╣реНрд╡рд╛рди рдХрд░рддрд╛ рд╣реИ, рддреЛ рдпрд╣рд╛рдВ рд╣рдо рд╡рд░реНрддрдорд╛рди рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рджреГрд╢реНрдп рдСрдлрд╕реЗрдЯ рдХреА рдЧрдгрдирд╛ рдХрд░ рд░рд╣реЗ рд╣реИрдВ рдЬреЛ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ рдХреА рдЙрдВрдЧрд▓реА рдХрд╛ рдЕрдиреБрд╕рд░рдг рдХрд░рддрд╛ рд╣реИ
- onEnded () - рдпрд╣рд╛рдВ рд╣рдореЗрдВ рд╕реВрдЪрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдЬрдм рдбреНрд░реИрдЧ рдЬреЗрд╕реНрдЪрд░ рд╕рдорд╛рдкреНрдд рд╣реЛрддрд╛ рд╣реИ, рддреЛ рд╣рдореЗрдВ рдпрд╣ рдЧрдгрдирд╛ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рдХрд┐ рдХреНрдпрд╛ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдЗрд╕ рджреГрд╢реНрдп (рдмрд╛рдПрдВ рдпрд╛ рджрд╛рдПрдВ) рдХреЛ рд╕реНрд╡рд╛рдЗрдк рдХрд░рдирд╛ рдЪрд╛рд╣реЗрдЧрд╛, рдпрд╛ рд╢рд╛рдпрдж рдпрд╣ рдЗрд╢рд╛рд░рд╛ рдЪрд┐рд╣реНрдирд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛, рдФрд░ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдЗрд╕ рд╕реНрдХреНрд░реАрди рдкрд░ рд░рд╣рдирд╛ рдкрд╕рдВрдж рдХрд░реЗрдВрдЧреЗ
- withAnimation - рдпрд╣ рдХреНрд▓реЛрдЬрд░ рдПрдиреАрдореЗрд╢рди рдХреЗ рд╕рд╛рде рд▓рдЧрд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдФрд░ рдСрдлрд╝рд╕реЗрдЯ рдХреЛ рд╕реНрдореВрдерд▓реА рдмрджрд▓рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ
contentView
struct ContentView: View { var body: some View { VStack { NavigationView() .padding(.bottom) SwipeView() .padding(.bottom) BottomBarView() } .padding() } }
рдЗрд╕ рдмрд┐рдВрджреБ рдкрд░ рд╣рдорд╛рд░реА рд╕рд╛рдордЧреНрд░реА рджреГрд╢реНрдп рдмреЗрд╣рдж рд╕рд░рд▓ рд╣реИ - рдпрд╣ рдЙрди рд╕рднреА рд╡рд┐рдЪрд╛рд░реЛрдВ рдХреЛ рдмрдирд╛рддрд╛ рд╣реИ рдЬреЛ рд╣рдордиреЗ рдкрд╣рд▓реЗ рдмрдирд╛рдП рдереЗ, рдПрдХ рдКрд░реНрдзреНрд╡рд╛рдзрд░ рд╕реНрдЯреИрдХ (
VStack ) рдХреЗ рдЕрдВрджрд░ред
рдиреЗрд╡реАрдЧреЗрд╢рди рд╡реНрдпреВ рдФрд░
рд╕реНрд╡рд╛рдЗрдкрд╡реНрдпреВ рдХреЗ рд▓рд┐рдП рд╣рдордиреЗ рдиреАрдЪреЗ рдХреА рддрд░рдл рдХреБрдЫ рдбрд┐рдлреЙрд▓реНрдЯ рдкреИрдбрд┐рдВрдЧ рдЬреЛрдбрд╝реА рд╣реИ, рдФрд░ рдкреВрд░реЗ
рд╡реАрд╕реНрдЯреИрдХ рдореЗрдВ
рдкреИрдбрд┐рдВрдЧреНрд╕ рдХреЛ рд╕рднреА рдХрд┐рдирд╛рд░реЛрдВ рдкрд░ рдЬреЛрдбрд╝рд╛ рдЧрдпрд╛ рд╣реИред
рдпрд╣ рдмрд╛рдд рд╣реИред рд╣реЛ рдЧрдпрд╛ред рдпрд╣ рд╣рдорд╛рд░рд╛ рдРрдк рдЕрдм рдХреИрд╕рд╛ рджрд┐рдЦрддрд╛ рд╣реИ:
рдЕрдВрддрд┐рдо рд╡рд┐рдЪрд╛рд░
рдЬреИрд╕рд╛ рдХрд┐ рд╣рдо рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рд╕реНрд╡рд┐рдлреНрдЯрдпреВрдЖрдИ рдмрд╣реБрдд рд╢рдХреНрддрд┐рд╢рд╛рд▓реА рдЙрдкрдХрд░рдг рд╣реИ, рдпрд╣ рд╣рдореЗрдВ рдПрдХ рдЫреЛрдЯреА рдШреЛрд╖рдгрд╛ рдХреЛрдб рдореЗрдВ рдпреВрдЖрдИ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рдиреЗ рдФрд░ рд╣реЗрд░рдлреЗрд░ рдХрд░рдиреЗ рдХрд╛ рдПрдХ рдЖрд╕рд╛рди рддрд░реАрдХрд╛ рджреЗрддрд╛ рд╣реИред
рд░рд┐рдПрдХреНрдЯрд┐рд╡ рдиреЗрдЯрд┐рд╡ рдбреЗрд╡рд▓рдкрд░реНрд╕ рдЗрд╕ рдШреЛрд╖рдгрд╛рддреНрдордХ рдкреНрд░рддрд┐рдорд╛рди рдХреЛ рддреБрд░рдВрдд рдкрд╣рдЪрд╛рди рд▓реЗрдВрдЧреЗред
рд▓реЗрдХрд┐рди рдпрд╛рдж рд░рдЦреЗрдВ: SwiftUI рдЕрднреА рднреА рд╡рд┐рдХрд╛рд╕ рдХреЗ рдЕрдзреАрди рд╣реИ рдФрд░ рдЕрднреА рдХреЗ рд▓рд┐рдП рдмреЗрд╣рдж рдЕрд╕реНрдерд┐рд░ рд╣реЛ рд╕рдХрддрд╛ рд╣реИред рдпрджрд┐ рдЖрдк рдЗрд╕ рдкрд░рд┐рдпреЛрдЬрдирд╛ рдХреЗ рд▓рд┐рдП рд╕рднреА рдХреЛрдб рдЖрдзрд╛рд░ рдХреА рдЬрд╛рдВрдЪ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ рддреЛ рдЖрдк рдЗрд╕реЗ
рдЬреАрдердм рдкрд░ рдкрд╛ рд╕рдХрддреЗ рд╣реИрдВред
рдпрджрд┐ рдЖрдкрдХреЗ рдкрд╛рд╕ SwiftUI рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХреЛрдИ рд╡рд┐рдЪрд╛рд░ рдпрд╛ рдкреНрд░рд╢реНрди рд╣реИрдВ, рддреЛ рдЙрдиреНрд╣реЗрдВ рдЯрд┐рдкреНрдкрдгрд┐рдпреЛрдВ рдореЗрдВ рд╕рд╛рдЭрд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕реНрд╡рддрдВрддреНрд░ рдорд╣рд╕реВрд╕ рдХрд░реЗрдВред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдЕрдЧрд░ рдЖрдкрдХреЛ рдпрд╣ рд▓реЗрдЦ рдЕрдЪреНрдЫрд╛ рд▓рдЧрд╛ рд╣реЛ, рддреЛ рдХреГрдкрдпрд╛ рд╣рдореЗрдВ рд╢рдмреНрдж рдХреЛ рдлреИрд▓рд╛рдиреЗ рдореЗрдВ рдорджрдж рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЗрд╕реЗ рдЕрдкрдиреЗ рд╕рдореБрджрд╛рдп рдХреЗ рд╕рд╛рде рд╕рд╛рдЭрд╛ рдХрд░реЗрдВ!