рд╕реНрд╡рд┐рдлреНрдЯрдпреВрдЖрдИ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реБрдП рдирдкреБрдВрд╕рдХрддрд╛ред рднрд╛рдЧ 2: рдкрд╣реБрдВрдЪ рдХреЗ рд╕рд╛рде рдХреНрдпрд╛ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ?

рд╕рднреА рдХреЛ рдирдорд╕реНрдХрд╛рд░! рдЙрдиреНрдирдд рдкрд╛рдареНрдпрдХреНрд░рдо "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, рдЬреЛ рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛ рд╣реИ:

  1. рд╣рдореЗрдВ configuration.isOnрдпрд╣ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкрдврд╝рдирд╛ рд╣реЛрдЧрд╛ рдХрд┐ рдХреНрдпрд╛ рд╕реНрд╡рд┐рдЪ рдЪрд╛рд▓реВ рд╣реИред
  2. рд╣рдореЗрдВ рд╕реНрд╡рд┐рдЪрд┐рдВрдЧ рдХреЗ рдХрд╛рд░реНрдп рдХреЛ рд╕рдВрднрд╛рд▓рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдмрдЯрди рдкреНрд░рджрд╛рди рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рдпрд╛ рдХрдо рд╕реЗ рдХрдо рдРрд╕рд╛ рдХреБрдЫ 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)
    }
}

рдФрд░ рдпрд╣ рд╕рдм - рд╣рдордиреЗ рджреЛ рд╕реНрдерд╛рдиреЛрдВ рдкрд░ рдЕрдкрдиреЗ рд╕рд╛рдорд╛рдиреНрдп рдирд┐рдпреЛрдореЙрд░реНрдлрд┐рдХ рдбрд┐рдЬрд╛рдЗрди рдХреЛ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛!

рдкрд╣реБрдВрдЪ рдореЗрдВ рд╕реБрдзрд╛рд░


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

рдпрд╣ рд╡рд╣ рдХреНрд╖рдг рд╣реИ рдЬрд┐рд╕рдХреЗ рдЖрд╕рдкрд╛рд╕ рдореИрдВ рдХреБрдЫ рдЧрд▓рддрдлрд╣рдореА рдХрд╛ рдкрд╛рд▓рди рдХрд░рддрд╛ рд╣реВрдВ, рдЗрд╕рд▓рд┐рдП рдореИрдВ рдкрд╣рд▓реЗ рд╕реЗ рдХреБрдЫ рдмрд╛рддреЗрдВ рдХрд╣рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ:

  1. рд╣рд╛рдВ, рдореИрдВ рд╕рдордЭрддрд╛ рд╣реВрдВ рдХрд┐ рдорд╛рдирдХ Apple рдмрдЯрди рдиреАрд▓реЗ рд░рдВрдЧ рдХреЗ рдкрд╛рда рдХреА рддрд░рд╣ рд╣реА рджрд┐рдЦрддреЗ рд╣реИрдВ рдФрд░ рдЗрд╕рд▓рд┐рдП рдХрдо рд╕реЗ рдХрдо рдкрд╣рд▓реА рдирдЬрд╝рд░ рдореЗрдВ рдкрд░рд┐рдЪрд┐рдд рдмрдЯрди рдирд╣реАрдВ рдорд┐рд▓рддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдЙрдирдореЗрдВ рдПрдХ рдЙрдЪреНрдЪ рд╡рд┐рдкрд░реАрдд рдЕрдиреБрдкрд╛рдд рд╣реЛрддрд╛ рд╣реИред
  2. ┬л , , ┬╗ тАФ тАФ ┬л ┬╗, , , - .
  3. - 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 рдкрд░ рдкреВрд░реНрдг рд╕реНрд░реЛрдд рдХреЛрдб рдкреНрд░рд╛рдкреНрдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ ред

рдкрд╣рд▓реЗ рднрд╛рдЧ рдХреЛ рдкрдврд╝реЗрдВред



рдкрд╛рдареНрдпрдХреНрд░рдо рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЕрдзрд┐рдХ рдЬрд╛рдиреЗрдВред



All Articles