рд╕рднреА рдХреЛ рдирдорд╕реНрдХрд╛рд░! рдЙрдиреНрдирдд рдкрд╛рдареНрдпрдХреНрд░рдо "IOS рдбреЗрд╡рд▓рдкрд░" рдХреЗ рд▓реЙрдиреНрдЪ рдХреА рдкреНрд░рддреНрдпрд╛рд╢рд╛ рдореЗрдВ , рд╣рдо рд╕реНрд╡рд┐рдлреНрдЯрдпреВрдЖрдИ ( рдкрд╣рд▓реЗ рднрд╛рдЧ рдХреЛ рдкрдврд╝реЗрдВ ) рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реБрдП рдирд╡рд╢рд╛рд╕реНрддреНрд░рд╡рд╛рдж рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд▓реЗрдЦ рдХреЗ рджреВрд╕рд░реЗ рднрд╛рдЧ рдХрд╛ рдЕрдиреБрд╡рд╛рдж рдкреНрд░рдХрд╛рд╢рд┐рдд рдХрд░рддреЗ рд╣реИрдВ ред
рдбрд╛рд░реНрдХ рдереАрдо
рдЗрд╕рд╕реЗ рдкрд╣рд▓реЗ рдХрд┐ рд╣рдо рдпрд╣ рд╕рдордЭрдирд╛ рд╢реБрд░реВ рдХрд░реЗрдВ рдХрд┐ рд╣рдо рдХрд┐рд╕ рддрд░рд╣ рд╕реЗ рдиреНрдпреВрдореЙрд░реНрдлрд┐рдЬрд╝реНрдо рдХреА рдЙрдкрд▓рдмреНрдзрддрд╛ рдореЗрдВ рд╕реБрдзрд╛рд░ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдЖрдЗрдП рджреЗрдЦреЗрдВ рдХрд┐ рд╣рдо рдЕрдиреНрдп рджрд┐рд▓рдЪрд╕реНрдк рд╢реИрд▓рд┐рдпреЛрдВ рдХреЛ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдХреИрд╕реЗ рдкреНрд░рднрд╛рд╡ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░ рд╕рдХрддреЗ рд╣реИрдВредрдПрдХреНрд╕рдЯреЗрдВрд╢рди рдореЗрдВ рдкрд╣рд▓реЗ рджреЛ рдФрд░ рд░рдВрдЧ рдЬреЛрдбрд╝реЗрдВ Color
рддрд╛рдХрд┐ рд╣рдорд╛рд░реЗ рд╣рд╛рде рдореЗрдВ рдХрдИ рд╕реНрдерд┐рд░ рдореВрд▓реНрдп рд╣реЛрдВ:static let darkStart = Color(red: 50 / 255, green: 60 / 255, blue: 65 / 255)
static let darkEnd = Color(red: 25 / 255, green: 25 / 255, blue: 30 / 255)
рд╣рдо рдЙрдиреНрд╣реЗрдВ рдПрдХ рдкреГрд╖реНрдарднреВрдорд┐ рдХреЗ рд░реВрдк рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ ContentView
, рдореМрдЬреВрджрд╛ рдПрдХ рдХреА рдЬрдЧрд╣ Color.white
, рдЬреИрд╕рд╛ рдХрд┐ рдпрд╣рд╛рдБ рджрд┐рдЦрд╛рдпрд╛ рдЧрдпрд╛ рд╣реИ:var body: some View {
ZStack {
LinearGradient(Color.darkStart, Color.darkEnd)
рд╣рдорд╛рд░рд╛ SimpleButtonStyle
рдЕрдм рдЬрдЧрд╣ рд╕реЗ рдмрд╛рд╣рд░ рд▓рдЧ рд░рд╣рд╛ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдПрдХ рдЕрдВрдзреЗрд░реЗ рдкреГрд╖реНрдарднреВрдорд┐ рдкрд░ рдПрдХ рдЙрдЬреНрдЬреНрд╡рд▓ рд╕реНрдЯрд╛рдЗрд▓рд╛рдЗрдЬреЗрд╢рди рд▓рдЧрд╛рддрд╛ рд╣реИред рдЗрд╕рд▓рд┐рдП, рд╣рдо рдПрдХ рдирдИ рдбрд╛рд░реНрдХ рд╕реНрдЯрд╛рдЗрд▓ рдмрдирд╛рдиреЗ рдЬрд╛ рд░рд╣реЗ рд╣реИрдВ рдЬреЛ рдпрд╣рд╛рдВ рдмреЗрд╣рддрд░ рддрд░реАрдХреЗ рд╕реЗ рдХрд╛рдо рдХрд░рддреА рд╣реИ, рд▓реЗрдХрд┐рди рдЗрд╕ рдмрд╛рд░ рд╣рдо рдЗрд╕реЗ рджреЛ рднрд╛рдЧреЛрдВ рдореЗрдВ рд╡рд┐рднрд╛рдЬрд┐рдд рдХрд░реЗрдВрдЧреЗ: рдПрдХ рдмреИрдХрдЧреНрд░рд╛рдЙрдВрдб рд╡реНрдпреВ рдЬрд┐рд╕реЗ рд╣рдо рдХрд╣реАрдВ рднреА рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдФрд░ рдПрдХ рдмрдЯрди рд╕реНрдЯрд╛рдЗрд▓ рдЬреЛ рдЗрд╕реЗ рдкреИрдбрд┐рдВрдЧ рдФрд░ рдХрдВрдЯреЗрдВрдЯрд╢реИрдк рд╕рдВрд╢реЛрдзрдХ рдХреЗ рд╕рд╛рде рд▓рдкреЗрдЯрддрд╛ рд╣реИред рдпрд╣ рд╣рдореЗрдВ рдФрд░ рдЕрдзрд┐рдХ рд▓рдЪреАрд▓рд╛рдкрди рджреЗрдЧрд╛, рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рдмрд╛рдж рдореЗрдВ рджреЗрдЦреЗрдВрдЧреЗредрдирдпрд╛ рдмреИрдХрдЧреНрд░рд╛рдЙрдВрдб рджреГрд╢реНрдп рдЬрд┐рд╕реЗ рд╣рдо рдЬреЛрдбрд╝рдиреЗ рдЬрд╛ рд░рд╣реЗ рд╣реИрдВ, рд╡рд╣ рд╣рдореЗрдВ рдЕрдкрдиреЗ рджреГрд╢реНрдп рдкреНрд░рднрд╛рд╡ рдХреЗ рд▓рд┐рдП рдХрд┐рд╕реА рднреА рдЖрдХрд╛рд░ рдХреЛ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрдЧрд╛, рдЗрд╕рд▓рд┐рдП рдЕрдм рд╣рдо рдордВрдбрд▓рд┐рдпреЛрдВ рд╕реЗ рд╕рдВрд▓рдЧреНрди рдирд╣реАрдВ рд╣реИрдВред рдпрд╣ рдЗрд╕ рдмрд╛рдд рдкрд░ рднреА рдирдЬрд╝рд░ рд░рдЦреЗрдЧрд╛ рдХрд┐ рд╣рдорд╛рд░реЗ рдЙрддреНрддрд▓ рдкреНрд░рднрд╛рд╡ (рдЖрд╡рдХ рдпрд╛ рдЬрд╛рд╡рдХ) рдХреЛ рдЕрд╡рддрд▓ рдХрд░рдирд╛ рд╣реИ рдпрд╛ рдирд╣реАрдВ, рдпрд╣ рдЙрд╕ рд╕рдВрдкрддреНрддрд┐ рдкрд░ рдирд┐рд░реНрднрд░ рдХрд░рддрд╛ рд╣реИ, isHighlighted
рдЬрд┐рд╕реЗ рд╣рдо рдмрд╛рд╣рд░ рд╕реЗ рдмрджрд▓ рд╕рдХрддреЗ рд╣реИрдВредрд╣рдо рд╕рдмрд╕реЗ рд╕рд░рд▓ рдХреЗ рд╕рд╛рде рд╢реБрд░реВ рдХрд░реЗрдВрдЧреЗ, рдПрдХ рдЕрд╡рддрд▓ рдкреНрд░рднрд╛рд╡ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рд╕рдВрд╢реЛрдзрд┐рдд рдЫрд╛рдпрд╛ рдлреНрд▓рд┐рдк рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реБрдПред рдЗрд╕ рд╕рдВрд░рдЪрдирд╛ рдХреЛ рдЬреЛрдбрд╝реЗрдВ:struct DarkBackground<S: Shape>: View {
var isHighlighted: Bool
var shape: S
var body: some View {
ZStack {
if isHighlighted {
shape
.fill(Color.darkEnd)
.shadow(color: Color.darkStart, radius: 10, x: 5, y: 5)
.shadow(color: Color.darkEnd, radius: 10, x: -5, y: -5)
} else {
shape
.fill(Color.darkEnd)
.shadow(color: Color.darkStart, radius: 10, x: -10, y: -10)
.shadow(color: Color.darkEnd, radius: 10, x: 10, y: 10)
}
}
}
}
рд╕рдВрд╢реЛрдзрди рдпрд╣ рд╣реИ рдХрд┐ рдЬрдм рдмрдЯрди рджрдмрд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рдЫрд╛рдпрд╛ рдХрд╛ рдЖрдХрд╛рд░ рдХрдо рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ - рд╣рдо 10 рдХреЗ рдмрдЬрд╛рдп 5 рдмрд┐рдВрджреБрдУрдВ рдХреА рджреВрд░реА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВредрдлрд┐рд░ рд╣рдо рдЗрд╕реЗ DarkButtonStyle
рдкреИрдбрд┐рдВрдЧ рдФрд░ рд╕рд╛рдордЧреНрд░реА рдХреА рдорджрдж рд╕реЗ рд▓рдкреЗрдЯ рд╕рдХрддреЗ рд╣реИрдВ , рдЬреИрд╕рд╛ рдХрд┐ рдпрд╣рд╛рдВ рджрд┐рдЦрд╛рдпрд╛ рдЧрдпрд╛ рд╣реИ:struct DarkButtonStyle: ButtonStyle {
func makeBody(configuration: Self.Configuration) -> some View {
configuration.label
.padding(30)
.contentShape(Circle())
.background(
DarkBackground(isHighlighted: configuration.isPressed, shape: Circle())
)
}
}
рдЕрдВрдд рдореЗрдВ, рд╣рдо ContentView
рдЗрд╕реЗ рдмрджрд▓рдХрд░ рдЕрдкрдиреЗ рдмрдЯрди рдкрд░ рд▓рд╛рдЧреВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ ButtonStyle()
:.buttonStyle(DarkButtonStyle())
рдЖрдЗрдП рджреЗрдЦреЗрдВ рдХрд┐ рдХреНрдпрд╛ рд╣реБрдЖ - рд╣рд╛рд▓рд╛рдВрдХрд┐ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдмрд╣реБрдд рдЕрдзрд┐рдХ рдХреЛрдб рдирд╣реАрдВ рд╣реИ, рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдкрд░рд┐рдгрд╛рдо рдХрд╛рдлреА рдЕрдЪреНрдЫрд╛ рд▓рдЧ рд░рд╣рд╛ рд╣реИред
рдХреБрдЫ рдкреНрд░рдпреЛрдЧ
рдЕрдм рдкреНрд░рднрд╛рд╡ рдХреЗ рд╕рд╛рде рдкреНрд░рдпреЛрдЧ рдХрд░рдиреЗ рдХрд╛ рд╕рдордп рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдЖрдкрдХреЛ рдмреЗрд╣рддрд░ рдврдВрдЧ рд╕реЗ рд╕рдордЭрдиреЗ рдореЗрдВ рдорджрдж рдХрд░реЗрдЧрд╛ рдХрд┐ рд╕реНрд╡рд┐рдлреНрдЯрдпреВрдЖрдИ рдХреНрдпрд╛ рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рд╕рдХреНрд╖рдо рд╣реИредрдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рд╣рдо рдПрдХ рд░реИрдЦрд┐рдХ рдврд╛рд▓ рдЬреЛрдбрд╝рдХрд░ рдПрдХ рдЪрд┐рдХрдиреА рдЙрддреНрддрд▓ рдмрдЯрди рдмрдирд╛ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рджрдмрд╛рдП рдЬрд╛рдиреЗ рдкрд░ рдЗрд╕реЗ рдлреНрд▓рд┐рдк рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:if isHighlighted {
shape
.fill(LinearGradient(Color.darkEnd, Color.darkStart))
.shadow(color: Color.darkStart, radius: 10, x: 5, y: 5)
.shadow(color: Color.darkEnd, radius: 10, x: -5, y: -5)
} else {
shape
.fill(LinearGradient(Color.darkStart, Color.darkEnd))
.shadow(color: Color.darkStart, radius: 10, x: -10, y: -10)
.shadow(color: Color.darkEnd, radius: 10, x: 10, y: 10)
}
рдпрджрд┐ рдЖрдк рдЗрд╕реЗ рдЪрд▓рд╛рддреЗ рд╣реИрдВ, рддреЛ рдЖрдк рджреЗрдЦреЗрдВрдЧреЗ рдХрд┐ рдмрдЯрди рдХреЛ рджрдмрд╛рдиреЗ рдФрд░ рдЫреЛрдбрд╝рдиреЗ рдкрд░ рд╕реБрдЪрд╛рд░реВ рд░реВрдк рд╕реЗ рдКрдкрд░ рдФрд░ рдиреАрдЪреЗ рдПрдирд┐рдореЗрд╢рди рд╣реЛрддрд╛ рд╣реИред рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдПрдиреАрдореЗрд╢рди рдПрдХ рдЫреЛрдЯреЗ рд╕реЗ рдзреНрдпрд╛рди рднрдВрдЧ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдореИрдВ рдпрд╣ рд╡рд┐рдзрд┐ рдХреЛ рдпрд╣ рд╕рдВрд╢реЛрдзрдХ рдЬреЛрдбрд╝рдХрд░ рдЕрдХреНрд╖рдо рдХрд░рдиреЗ рдХреА рдЕрдиреБрд╢рдВрд╕рд╛ makeBody()
рд╕реЗ DarkButtonStyle
рд╡рд╣рд╛рдБ рд╕рдВрд╢реЛрдзрдХ рд╡рд░реНрддрдорд╛рди рдХреЗ рдмрд╛рдж, background()
:.animation(nil)
рдХреБрд╢рди рдмрдЯрди рдХрд╛ рдпрд╣ рдкреНрд░рднрд╛рд╡ рдЖрдХрд░реНрд╖рдХ рд╣реИ, рд▓реЗрдХрд┐рди рдЕрдЧрд░ рдЖрдк рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдпреЛрдЬрдирд╛ рдмрдирд╛ рд░рд╣реЗ рд╣реИрдВ, рддреЛ рдореИрдВ рдЖрдкрдХреЛ рд╕рд▓рд╛рд╣ рджреВрдВрдЧрд╛ рдХрд┐ рдмрдЯрди рдХреЛ рдереЛрдбрд╝рд╛ рдФрд░ рдЦрдбрд╝рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рддреАрди рдмрджрд▓рд╛рд╡реЛрдВ рдХреЛ рдЖрдЬрдорд╛рдПрдВредрд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рдЗрд╕ рддрдереНрдп рдХреЗ рдмрд╛рд╡рдЬреВрдж рдХрд┐ рдпрд╣ рдирд┐рдпреЛрдореЙрд░реНрдлрд╝рд┐рдХ рдбрд┐рдЬрд╝рд╛рдЗрди рдХреЗ рдХрдо-рд╡рд┐рдкрд░реАрдд рд╕рд┐рджреНрдзрд╛рдВрдд рдХрд╛ рд╡рд┐рд░реЛрдзрд╛рднрд╛рд╕реА рд╣реИ, рдореИрдВ рдЗрд╕реЗ рдмрд╛рд╣рд░ рдЦрдбрд╝рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рд╕рдлреЗрдж рдПрдХ рдХреЗ рд╕рд╛рде рдЧреНрд░реЗ рдЖрдЗрдХрди рдХреЛ рдмрджрд▓ рджреВрдВрдЧрд╛ред рддреЛ, ContentView
рдЖрдкрдХреЛ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреА:Image(systemName: "heart.fill")
.foregroundColor(.white)
рджреВрд╕рд░реЗ, рдпрджрд┐ рдЖрдк рджрдмрд╛рдП рдЧрдП рд░рд╛рдЬреНрдп рдореЗрдВ рдмрдЯрди рдХреЗ рд▓рд┐рдП рдУрд╡рд░рд▓реЗ рдЬреЛрдбрд╝рддреЗ рд╣реИрдВ, рддреЛ рдпрд╣ рди рдХреЗрд╡рд▓ рд╕рдорд╛рди рд░реВрдк рд╕реЗ рджрдмрд╛рдП рдЧрдП рд╡рд╛рд╕реНрддрд╡рд┐рдХ рднреМрддрд┐рдХ рдмрдЯрди рдХреА рддрд░рд╣ рдЕрдзрд┐рдХ рджрд┐рдЦрд╛рдИ рджреЗрдЧрд╛, рдмрд▓реНрдХрд┐ рдЗрд╕рдХреЗ рджрдмрд╛рдП рдЧрдП рд░рд╛рдЬреНрдп рдХреЛ рдЕрдирдкреНрд░реЗрд╕реНрдб рд╕реЗ рдЕрд▓рдЧ рдХрд░рдиреЗ рдореЗрдВ рднреА рдорджрдж рдХрд░реЗрдЧрд╛редрдпрд╣ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрдкрдХреЛ рд╕рдВрд╢реЛрдзрдХ рдбрд╛рд▓рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ overlay()
рдХреЗ рдмрд╛рдж fill()
рдЬрдм isHighlighted
рдЗрд╕реЗ рдпрд╣рд╛рдБ рдХреЗ рд░реВрдк рдореЗрдВ, рд╕рд╣реА рд╣реИ:if isHighlighted {
shape
.fill(LinearGradient(Color.darkEnd, Color.darkStart))
.overlay(shape.stroke(LinearGradient(Color.darkStart, Color.darkEnd), lineWidth: 4))
.shadow(color: Color.darkStart, radius: 10, x: 5, y: 5)
.shadow(color: Color.darkEnd, radius: 10, x: -5, y: -5)
рдПрдХ рднреА рддреЗрдЬ рджреЗрдЦреЛ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдк shadow()
рджрдмрд╛рдП рдЧрдП рд░рд╛рдЬреНрдп рдХреЗ рд▓рд┐рдП рджреЛ рд╕рдВрд╢реЛрдзрдХ рдирд┐рдХрд╛рд▓ рд╕рдХрддреЗ рд╣реИрдВ рдЬреЛ рдЕрдиреНрдпрдерд╛ рдУрд╡рд░рд▓реЗ рдкрд░ рдзреНрдпрд╛рди рдХреЗрдВрджреНрд░рд┐рдд рдХрд░рддреЗ рд╣реИрдВредрддреАрд╕рд░рд╛, рдЖрдк рдЕрдкреНрд░рдХрд╛рд╢рд┐рдд рд╕реНрдерд┐рддрд┐ рдореЗрдВ рдУрд╡рд░рд▓реЗ рдХреЛ рднреА рдЬреЛрдбрд╝ рд╕рдХрддреЗ рд╣реИрдВ, рдмрд╕ рдпрд╣ рдЪрд┐рд╣реНрдирд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐ рдпрд╣ рдПрдХ рдмрдЯрди рд╣реИред рдЗрд╕реЗ рддреБрд░рдВрдд рд▓рдЧрд╛рдПрдВ fill()
, рдЬреИрд╕реЗ:} else {
shape
.fill(LinearGradient(Color.darkStart, Color.darkEnd))
.overlay(shape.stroke(Color.darkEnd, lineWidth: 4))
.shadow(color: Color.darkStart, radius: 10, x: -10, y: -10)
.shadow(color: Color.darkEnd, radius: 10, x: 10, y: 10)
}

рдПрдХ рд╕реНрд╡рд┐рдЪ рд╢реИрд▓реА рдЬреЛрдбрд╝рдирд╛
рдЧреИрд░-рд░реВрдкрд╛рддреНрдордХ рдкреГрд╖реНрдарднреВрдорд┐ рд╢реИрд▓реА рд╕реЗ рдПрдХ рдмрдЯрди рд╢реИрд▓реА рдХреЛ рдЕрд▓рдЧ рдХрд░рдиреЗ рдХреЗ рдлрд╛рдпрджреЛрдВ рдореЗрдВ рд╕реЗ рдПрдХ рдпрд╣ рд╣реИ рдХрд┐ рдЕрдм рд╣рдо рдЙрд╕реА рдкреНрд░рднрд╛рд╡ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдПрдХ рд╕реНрд╡рд┐рдЪ рд╢реИрд▓реА рдЬреЛрдбрд╝ рд╕рдХрддреЗ рд╣реИрдВред рдЗрд╕рдХрд╛ рдорддрд▓рдм рд╣реИ рдХрд┐ рдПрдХ рдирдпрд╛ рдкреНрд░реЛрдЯреЛрдХреЙрд▓-рдХрдВрдкреНрд▓рд╛рдпрдВрдЯ рд╕реНрдЯреНрд░рдХреНрдЪрд░ ToggleStyle
рдмрдирд╛рдирд╛ ButtonStyle
, рдЬреЛ рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛ рд╣реИ:- рд╣рдореЗрдВ
configuration.isOn
рдпрд╣ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкрдврд╝рдирд╛ рд╣реЛрдЧрд╛ рдХрд┐ рдХреНрдпрд╛ рд╕реНрд╡рд┐рдЪ рдЪрд╛рд▓реВ рд╣реИред - рд╣рдореЗрдВ рд╕реНрд╡рд┐рдЪрд┐рдВрдЧ рдХреЗ рдХрд╛рд░реНрдп рдХреЛ рд╕рдВрднрд╛рд▓рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдмрдЯрди рдкреНрд░рджрд╛рди рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рдпрд╛ рдХрдо рд╕реЗ рдХрдо рдРрд╕рд╛ рдХреБрдЫ
onTapGesture()
рдпрд╛ рдРрд╕рд╛ рдХреБрдЫ ред
рдЗрд╕ рд╕рдВрд░рдЪрдирд╛ рдХреЛ рдЕрдкрдиреА рдкрд░рд┐рдпреЛрдЬрдирд╛ рдореЗрдВ рдЬреЛрдбрд╝реЗрдВ:struct DarkToggleStyle: ToggleStyle {
func makeBody(configuration: Self.Configuration) -> some View {
Button(action: {
configuration.isOn.toggle()
}) {
configuration.label
.padding(30)
.contentShape(Circle())
}
.background(
DarkBackground(isHighlighted: configuration.isOn, shape: Circle())
)
}
}
рд╣рдо рдЙрдирдореЗрдВ рд╕реЗ рдПрдХ рдХреЛ рд░рдЦрдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ ContentView
рддрд╛рдХрд┐ рдЖрдк рдЗрд╕реЗ рд╕реНрд╡рдпрдВ рдкрд░рдЦ рд╕рдХреЗрдВ, рдЗрд╕рд▓рд┐рдП рдЗрд╕ рд╕рдВрдкрддреНрддрд┐ рдХреЛ рдЬреЛрдбрд╝рдХрд░ рд╢реБрд░реВ рдХрд░реЗрдВ:@State private var isToggled = false
рдлрд┐рд░ рдореМрдЬреВрджрд╛ рдмрдЯрди VStack
рдХреЛ 40 рдХреЗ рдмрд░рд╛рдмрд░ рд░рд┐рдХреНрддрд┐ рдХреЗ рд╕рд╛рде рд▓рдкреЗрдЯреЗрдВ рдФрд░ рдЗрд╕реЗ рдиреАрдЪреЗ рд░рдЦреЗрдВ:Toggle(isOn: $isToggled) {
Image(systemName: "heart.fill")
.foregroundColor(.white)
}
.toggleStyle(DarkToggleStyle())
рдЖрдкрдХреА рд╕рдВрд░рдЪрдирд╛ ContentView
рдЗрд╕ рддрд░рд╣ рджрд┐рдЦрдиреА рдЪрд╛рд╣рд┐рдП:struct ContentView: View {
@State private var isToggled = false
var body: some View {
ZStack {
LinearGradient(Color.darkStart, Color.darkEnd)
VStack(spacing: 40) {
Button(action: {
print("Button tapped")
}) {
Image(systemName: "heart.fill")
.foregroundColor(.white)
}
.buttonStyle(DarkButtonStyle())
Toggle(isOn: $isToggled) {
Image(systemName: "heart.fill")
.foregroundColor(.white)
}
.toggleStyle(DarkToggleStyle())
}
}
.edgesIgnoringSafeArea(.all)
}
}
рдФрд░ рдпрд╣ рд╕рдм - рд╣рдордиреЗ рджреЛ рд╕реНрдерд╛рдиреЛрдВ рдкрд░ рдЕрдкрдиреЗ рд╕рд╛рдорд╛рдиреНрдп рдирд┐рдпреЛрдореЙрд░реНрдлрд┐рдХ рдбрд┐рдЬрд╛рдЗрди рдХреЛ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛!рдкрд╣реБрдВрдЪ рдореЗрдВ рд╕реБрдзрд╛рд░
рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рд╡рд┐рднрд┐рдиреНрди рдирдпреВрдореЛрд░реНрдлрд┐рдХ рд╢реИрд▓рд┐рдпреЛрдВ рдХреЗ рд╕рд╛рде рдЦреЗрд▓рдиреЗ рдХреЗ рд▓рд┐рдП рдкрд░реНрдпрд╛рдкреНрдд рд╕рдордп рдерд╛, рд▓реЗрдХрд┐рди рдЕрдм рдореИрдВ рдЗрд╕ рдбрд┐рдЬрд╛рдЗрди рдХреА рд╕рдорд╕реНрдпрд╛рдУрдВ рдкрд░ рдзреНрдпрд╛рди рдХреЗрдВрджреНрд░рд┐рдд рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ: рдХрдВрдЯреНрд░рд╛рд╕реНрдЯ рдХреА рдЕрддреНрдпрдзрд┐рдХ рдХрдореА рдХрд╛ рдорддрд▓рдм рд╣реИ рдХрд┐ рдмрдЯрди рдФрд░ рдЕрдиреНрдп рдорд╣рддреНрд╡рдкреВрд░реНрдг рдирд┐рдпрдВрддреНрд░рдг рдЙрдирдХреЗ рдЖрд╕рдкрд╛рд╕ рд╕реЗ рдмрд╛рд╣рд░ рдЦрдбрд╝реЗ рд╣реЛрдиреЗ рдХреЗ рд▓рд┐рдП рдкрд░реНрдпрд╛рдкреНрдд рдирд╣реАрдВ рд╣реИрдВ, рдЬреЛ рдЙрди рд▓реЛрдЧреЛрдВ рдХреЗ рд▓рд┐рдП рдЕрдкрдиреЗ рдЕрдиреБрдкреНрд░рдпреЛрдЧреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдореБрд╢реНрдХрд┐рд▓ рдмрдирд╛рддрд╛ рд╣реИ рдЕрдкреВрд░реНрдг рджреГрд╖реНрдЯрд┐редрдпрд╣ рд╡рд╣ рдХреНрд╖рдг рд╣реИ рдЬрд┐рд╕рдХреЗ рдЖрд╕рдкрд╛рд╕ рдореИрдВ рдХреБрдЫ рдЧрд▓рддрдлрд╣рдореА рдХрд╛ рдкрд╛рд▓рди рдХрд░рддрд╛ рд╣реВрдВ, рдЗрд╕рд▓рд┐рдП рдореИрдВ рдкрд╣рд▓реЗ рд╕реЗ рдХреБрдЫ рдмрд╛рддреЗрдВ рдХрд╣рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ:- рд╣рд╛рдВ, рдореИрдВ рд╕рдордЭрддрд╛ рд╣реВрдВ рдХрд┐ рдорд╛рдирдХ Apple рдмрдЯрди рдиреАрд▓реЗ рд░рдВрдЧ рдХреЗ рдкрд╛рда рдХреА рддрд░рд╣ рд╣реА рджрд┐рдЦрддреЗ рд╣реИрдВ рдФрд░ рдЗрд╕рд▓рд┐рдП рдХрдо рд╕реЗ рдХрдо рдкрд╣рд▓реА рдирдЬрд╝рд░ рдореЗрдВ рдкрд░рд┐рдЪрд┐рдд рдмрдЯрди рдирд╣реАрдВ рдорд┐рд▓рддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдЙрдирдореЗрдВ рдПрдХ рдЙрдЪреНрдЪ рд╡рд┐рдкрд░реАрдд рдЕрдиреБрдкрд╛рдд рд╣реЛрддрд╛ рд╣реИред
- ┬л , , ┬╗ тАФ тАФ ┬л ┬╗, , , - .
- - SwiftUI, , VoiceOver Apple.
рдЖрдкрдиреЗ рдкрд╣рд▓реЗ рд╣реА рджреЗрдЦрд╛ рд╣реИ рдХрд┐ рдХреИрд╕реЗ рд╣рдордиреЗ рддрддреНрдХрд╛рд▓ рд╡рд┐рдкрд░реАрдд рд╡реГрджреНрдзрд┐ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЧреНрд░реЗ рдЖрдЗрдХрди рдХреЛ рд╕рдлреЗрдж рдореЗрдВ рдмрджрд▓ рджрд┐рдпрд╛, рд▓реЗрдХрд┐рди рдпрджрд┐ рдЖрдк рдЙрдиреНрд╣реЗрдВ рдЕрдзрд┐рдХ рд╕реБрд▓рдн рдмрдирд╛рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рддреЛ рдмрдЯрди рдФрд░ рд╕реНрд╡рд┐рдЪ рдХреЛ рдЕрднреА рднреА рдЕрдзрд┐рдХ рд╡рд┐рдкрд░реАрдд рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИредрдЗрд╕рд▓рд┐рдП, рд╣рдо рдЗрд╕ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░рдиреЗ рдЬрд╛ рд░рд╣реЗ рд╣реИрдВ рдХрд┐ рд╣рдо рдХреНрдпрд╛ рдмрджрд▓рд╛рд╡ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рддрд╛рдХрд┐ рддрддреНрд╡ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдмрд╛рд╣рд░ рдЦрдбрд╝реЗ рд╣реЛрдВредрд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рдореИрдВ рдЪрд╛рд╣реВрдВрдЧрд╛ рдХрд┐ рдЖрдк рд╣рдорд╛рд░реЗ рдПрдХреНрд╕рдЯреЗрдВрд╢рди рдореЗрдВ рджреЛ рдирдП рд░рдВрдЧ рдЬреЛрдбрд╝реЗрдВ:static let lightStart = Color(red: 60 / 255, green: 160 / 255, blue: 240 / 255)
static let lightEnd = Color(red: 30 / 255, green: 80 / 255, blue: 120 / 255)
рджреВрд╕рд░реЗ, рдореМрдЬреВрджрд╛ рдПрдХ рдХреЛ рдбреБрдкреНрд▓рд┐рдХреЗрдЯ рдХрд░реЗрдВ DarkBackground
рдФрд░ рдХреЙрдкреА рдХреЛ рдирд╛рдо рджреЗрдВ ColorfulBackground
ред рд╣рдо рдПрдХ рдкрд▓ рдореЗрдВ рдЗрд╕рд╕реЗ рдирд┐рдкрдЯ рд▓реЗрдВрдЧреЗ, рд▓реЗрдХрд┐рди рдлрд┐рд░, рдкрд╣рд▓реЗ рд╣рдореЗрдВ рдХреБрдЫ рддреИрдпрд╛рд░реА рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИредрддреАрд╕рд░рд╛,, рдмрдЯрди рдФрд░ рд╕реНрд╡рд┐рдЪ рдХреЗ рдЕрдВрдзреЗрд░реЗ рд╢реИрд▓реА рдирдХрд▓ рдЙрдиреНрд╣реЗрдВ рдирд╛рдо рдмрджрд▓рдиреЗ ColorfulButtonStyle
рдФрд░ ColorfulToggleStyle
, рдФрд░ рдлрд┐рд░ рдЙрдиреНрд╣реЗрдВ рдирдпрд╛ рдПрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ ColorfulBackground
рдкреГрд╖реНрдарднреВрдорд┐ рдХреЗ рд░реВрдк рдореЗрдВредрддреЛ рдЙрдиреНрд╣реЗрдВ рдЗрд╕ рддрд░рд╣ рджрд┐рдЦрдирд╛ рдЪрд╛рд╣рд┐рдП:struct ColorfulButtonStyle: ButtonStyle {
func makeBody(configuration: Self.Configuration) -> some View {
configuration.label
.padding(30)
.contentShape(Circle())
.background(
ColorfulBackground(isHighlighted: configuration.isPressed, shape: Circle())
)
.animation(nil)
}
}
struct ColorfulToggleStyle: ToggleStyle {
func makeBody(configuration: Self.Configuration) -> some View {
Button(action: {
configuration.isOn.toggle()
}) {
configuration.label
.padding(30)
.contentShape(Circle())
}
.background(
ColorfulBackground(isHighlighted: configuration.isOn, shape: Circle())
)
}
}
рдФрд░ рдЕрдВрдд рдореЗрдВ, рдмрдЯрди рдХреЛ рд╕рдВрдкрд╛рджрд┐рдд рдХрд░реЗрдВ рдФрд░ ContentView
рдирдИ рд╢реИрд▓реА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕реНрд╡рд┐рдЪ рдХрд░реЗрдВ :Button(action: {
print("Button tapped")
}) {
Image(systemName: "heart.fill")
.foregroundColor(.white)
}
.buttonStyle(ColorfulButtonStyle())
Toggle(isOn: $isToggled) {
Image(systemName: "heart.fill")
.foregroundColor(.white)
}
.toggleStyle(ColorfulToggleStyle())
рдЖрдк рдЪрд╛рд╣реЗрдВ рддреЛ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдЪрд▓рд╛ рд╕рдХрддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдЗрд╕рдХрд╛ рдХреЛрдИ рдорддрд▓рдм рдирд╣реАрдВ рд╣реИ - рдпрд╣ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдирд╣реАрдВ рдмрджрд▓рд╛ рд╣реИредрд╣рдорд╛рд░реЗ рдЬреАрд╡рди рдХреЗ рд░рдВрдЧреАрди рд╕рдВрд╕реНрдХрд░рдг рдХреЛ рд▓рд╛рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдо рдореЙрдбрд┐рдлрд╛рдпрд░реНрд╕ рдХреЛ рдмрджрд▓рдиреЗ fill()
рдФрд░ overlay()
рджрдмрд╛рдП рдЧрдП рдФрд░ рдЕрдкреНрд░рднрд╛рд╡рд┐рдд рд░рд╛рдЬреНрдпреЛрдВ рдХреЗ рд▓рд┐рдП рдЬрд╛ рд░рд╣реЗ рд╣реИрдВ ред рддреЛ, рдЬрдм isHighlighted
рд╕рдЪ рд╣реИ, рдмрджрд▓рдиреЗ рдХреЗ darkStart
рджреЛрдиреЛрдВ darkEnd
рдХреЗ рд▓рд┐рдП lightStart
рдФрд░ lightEnd
, рдЗрд╕ рддрд░рд╣:if isHighlighted {
shape
.fill(LinearGradient(Color.lightEnd, Color.lightStart))
.overlay(shape.stroke(LinearGradient(Color.lightStart, Color.lightEnd), lineWidth: 4))
.shadow(color: Color.darkStart, radius: 10, x: 5, y: 5)
.shadow(color: Color.darkEnd, radius: 10, x: -5, y: -5)
рдпрджрд┐ рдЖрдк рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЛ рдлрд┐рд░ рд╕реЗ рдЪрд▓рд╛рддреЗ рд╣реИрдВ, рддреЛ рдЖрдк рджреЗрдЦреЗрдВрдЧреЗ рдХрд┐ рдпрд╣ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдХрд╛рдлреА рд╕реБрдзрд╛рд░ рд╣реБрдЖ рд╣реИ: рджрдмрд╛рдП рдЧрдП рд░рд╛рдЬреНрдп рдореЗрдВ рдЕрдм рдПрдХ рдЙрдЬреНрдЬреНрд╡рд▓ рдиреАрд▓рд╛ рд░рдВрдЧ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдпрд╣ рд╕реНрдкрд╖реНрдЯ рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ рдЬрдм рдмрдЯрди рджрдмрд╛рдП рдЬрд╛рддреЗ рд╣реИрдВ рдФрд░ рд╕реНрд╡рд┐рдЪ рд╕рдХреНрд░рд┐рдп рд╣реЛрддреЗ рд╣реИрдВред рд▓реЗрдХрд┐рди рд╣рдо рдХреБрдЫ рдФрд░ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ - рд╣рдо рдмрдЯрди рдХреЗ рдЪрд╛рд░реЛрдВ рдУрд░ рдПрдХ рд╣реА рд░рдВрдЧ рдЬреЛрдбрд╝ рд╕рдХрддреЗ рд╣реИрдВ рдЬрдм рдЗрд╕реЗ рджрдмрд╛рдпрд╛ рдирд╣реАрдВ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рдЗрд╕ рдкрд░ рдзреНрдпрд╛рди рдЖрдХрд░реНрд╖рд┐рдд рдХрд░рдиреЗ рдореЗрдВ рдорджрдж рдХрд░рддрд╛ рд╣реИред
рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдореМрдЬреВрджрд╛ overlay()
рдЧреИрд░-рддрдирд╛рд╡рдкреВрд░реНрдг рд╕реНрдерд┐рддрд┐ рдХреЛ рдЗрд╕рдореЗрдВ рдмрджрд▓реЗрдВ :.overlay(shape.stroke(LinearGradient(Color.lightStart, Color.lightEnd), lineWidth: 4))
рддреЛ, рд╕рдорд╛рдкреНрдд рдмрдЯрди рд╢реИрд▓реА рдЗрд╕ рддрд░рд╣ рджрд┐рдЦрдирд╛ рдЪрд╛рд╣рд┐рдП:ZStack {
if isHighlighted {
shape
.fill(LinearGradient(Color.lightEnd, Color.lightStart))
.overlay(shape.stroke(LinearGradient(Color.lightStart, Color.lightEnd), lineWidth: 4))
.shadow(color: Color.darkStart, radius: 10, x: 5, y: 5)
.shadow(color: Color.darkEnd, radius: 10, x: -5, y: -5)
} else {
shape
.fill(LinearGradient(Color.darkStart, Color.darkEnd))
.overlay(shape.stroke(LinearGradient(Color.lightStart, Color.lightEnd), lineWidth: 4))
.shadow(color: Color.darkStart, radius: 10, x: -10, y: -10)
.shadow(color: Color.darkEnd, radius: 10, x: 10, y: 10)
}
}
рдЕрдм рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЛ рдлрд┐рд░ рд╕реЗ рдЪрд▓рд╛рдПрдВ, рдФрд░ рдЖрдк рджреЗрдЦреЗрдВрдЧреЗ рдХрд┐ рдмрдЯрди рдФрд░ рд╕реНрд╡рд┐рдЪ рдХреЗ рдЪрд╛рд░реЛрдВ рдУрд░ рдПрдХ рдиреАрд▓реА рдЕрдВрдЧреВрдареА рджрд┐рдЦрд╛рдИ рджреА рд╣реИ, рдФрд░ рдЬрдм рдЗрд╕реЗ рдХреНрд▓рд┐рдХ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рддреЛ рдпрд╣ рдиреАрд▓реЗ рд░рдВрдЧ рд╕реЗ рднрд░ рдЬрд╛рддрд╛ рд╣реИ - рдпрд╣ рдмрд╣реБрдд рдЕрдзрд┐рдХ рд╕реБрд▓рдн рд╣реИред
рдирд┐рд╖реНрдХрд░реНрд╖
рд╡реНрдпрд╡рд╣рд╛рд░ рдореЗрдВ, рдЖрдкрдХреЗ рдкрд╛рд╕ рдПрдХ рдкрд░рд┐рдпреЛрдЬрдирд╛ рдореЗрдВ рдХрдИ рдЕрд▓рдЧ-рдЕрд▓рдЧ рдмрдЯрди рд╢реИрд▓реА рдирд╣реАрдВ рд╣реЛрдЧреА, рдХрдо рд╕реЗ рдХрдо рдпрджрд┐ рдЖрдк рдЕрдкрдиреЗ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ рдХреЗ рд▓рд┐рдП рд╕рд┐рд░рджрд░реНрдж рдмрдирд╛рдирд╛ рдкрд╕рдВрдж рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВред рд▓реЗрдХрд┐рди рдпрд╣ рдкреНрд░рдпреЛрдЧ рдХреЗ рд▓рд┐рдП рдПрдХ рджрд┐рд▓рдЪрд╕реНрдк рд╕реНрдерд╛рди рд╣реИ, рдФрд░ рдореБрдЭреЗ рдЖрд╢рд╛ рд╣реИ рдХрд┐ рдЖрдк рдореЗрд░реЗ рд▓реЗрдЦ рдХреЗ рдЗрд╕ рд╡рд┐рдЪрд╛рд░ рдХреЛ рдкрдХрдбрд╝ рд▓реЗрдВрдЧреЗ, рдХреНрдпреЛрдВрдХрд┐ рдЖрдк рдЕрдкрдиреА рдкреАрда рдХреЛ рддреЛрдбрд╝рдиреЗ рдХреЗ рдмрд┐рдирд╛ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рд╕реБрдВрджрд░ рдкреНрд░рднрд╛рд╡ рдмрдирд╛ рд╕рдХрддреЗ рд╣реИрдВредрдореИрдВрдиреЗ рдмрд╛рд░-рдмрд╛рд░ рдХрд╣рд╛ рд╣реИ рдХрд┐ рдЖрдкрдХреЛ рд╣рдореЗрд╢рд╛ рдЕрдкрдиреЗ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреА рдЙрдкрд▓рдмреНрдзрддрд╛ рдХреА рдирд┐рдЧрд░рд╛рдиреА рдХрд░рдиреА рдЪрд╛рд╣рд┐рдП, рдФрд░ рдЗрд╕рдХрд╛ рдорддрд▓рдм рд╣реИ рдХрд┐ рд╡реЙрдЗрд╕рдУрд╡рд░ рдЖрдкрдХреЗ рдпреВрдЬрд░ рдЗрдВрдЯрд░рдлреЗрд╕ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░реЗрдВ рдХрд┐ рдЖрдкрдХреЗ рдмрдЯрди рдЗрдВрдЯрд░реИрдХреНрдЯрд┐рд╡ рджрд┐рдЦрддреЗ рд╣реИрдВ, рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░реЗрдВ рдХрд┐ рдЖрдкрдХреЗ рдкрд╛рда рд▓реЗрдмрд▓ рдФрд░ рдЖрдЗрдХрди рдкреГрд╖реНрдарднреВрдорд┐ рдХреЗ рд▓рд┐рдП рдкрд░реНрдпрд╛рдкреНрдд рд╡рд┐рдкрд░реАрдд рдЕрдиреБрдкрд╛рдд рд░рдЦрддреЗ рд╣реИрдВ (рдХрдо рд╕реЗ рдХрдо 4.5: 1, рд▓реЗрдХрд┐рди 7: 1 рддрдХ рд╣реИрдВ), рдФрд░ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░реЗрдВ рдХрд┐ рдЖрдкрдХреЗ рдХреНрд▓рд┐рдХ рдХрд░рдиреЗ рдпреЛрдЧреНрдп рдХреНрд╖реЗрддреНрд░ рдЖрд░рд╛рдорджрд╛рдпрдХ рд╣реИрдВ рдФрд░ рдмрдбрд╝рд╛ (рдХрдо рд╕реЗ рдХрдо 44x44 рдкрд┐рдХреНрд╕реЗрд▓)редрдФрд░ рд╕реНрд╡рд░реНрдЧ рдХреА рдЦрд╛рддрд┐рд░, рд╕реНрд╡рд┐рдлреНрдЯрдпреВрдЖрдИ рдХреЗ рдЕрдкрдиреЗ рдЬреНрдЮрд╛рди рдХрд╛ рдкреНрд░рдпреЛрдЧ рдХрд░рдиреЗ рдФрд░ рд╡рд┐рд╕реНрддрд╛рд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдиреЛрдореЛрд░реНрдлрд┐рдХ рдбрд┐рдЬрд╝рд╛рдЗрди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ, рд▓реЗрдХрд┐рди рдпрд╣ рдХрднреА рдирд╣реАрдВ рднреВрд▓рдирд╛ рдЪрд╛рд╣рд┐рдП рдХрд┐ рдпрджрд┐ рдЖрдк рдПрдХ рдирдП рдлреИрд╢рди рдбрд┐рдЬрд╛рдЗрди рдкреНрд░рд╡реГрддреНрддрд┐ рдХреЗ рд▓рд┐рдП рдкреНрд░рдпреЛрдЬреНрдп рдХрд╛ рддреНрдпрд╛рдЧ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдЖрдк рдХреБрдЫ рднреА рдирд╣реАрдВ рдЬреАрддреЗредрдЖрдк рдЗрд╕ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдХреЗ рд▓рд┐рдП GitHub рдкрд░ рдкреВрд░реНрдг рд╕реНрд░реЛрдд рдХреЛрдб рдкреНрд░рд╛рдкреНрдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ редрдкрд╣рд▓реЗ рднрд╛рдЧ рдХреЛ рдкрдврд╝реЗрдВред
рдкрд╛рдареНрдпрдХреНрд░рдо рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЕрдзрд┐рдХ рдЬрд╛рдиреЗрдВред