рд╕реНрд╡рд┐рдлреНрдЯрдпреВрдЖрдИ рдореЗрдВ рдЯрд┐рдВрдбрд░ рд╕реНрд╡рд╛рдЗрдк рдХрд╛рд░реНрдб рдХреИрд╕реЗ рд▓рд╛рдЧреВ рдХрд░реЗрдВ

рдЬреВрди рдореЗрдВ, рд╣рдордиреЗ рдкрд╣рд▓реА рдмрд╛рд░ 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 рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХреЛрдИ рд╡рд┐рдЪрд╛рд░ рдпрд╛ рдкреНрд░рд╢реНрди рд╣реИрдВ, рддреЛ рдЙрдиреНрд╣реЗрдВ рдЯрд┐рдкреНрдкрдгрд┐рдпреЛрдВ рдореЗрдВ рд╕рд╛рдЭрд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕реНрд╡рддрдВрддреНрд░ рдорд╣рд╕реВрд╕ рдХрд░реЗрдВред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдЕрдЧрд░ рдЖрдкрдХреЛ рдпрд╣ рд▓реЗрдЦ рдЕрдЪреНрдЫрд╛ рд▓рдЧрд╛ рд╣реЛ, рддреЛ рдХреГрдкрдпрд╛ рд╣рдореЗрдВ рд╢рдмреНрдж рдХреЛ рдлреИрд▓рд╛рдиреЗ рдореЗрдВ рдорджрдж рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЗрд╕реЗ рдЕрдкрдиреЗ рд╕рдореБрджрд╛рдп рдХреЗ рд╕рд╛рде рд╕рд╛рдЭрд╛ рдХрд░реЗрдВ!

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


All Articles