3DTouch - iPhone рдкрд░ рддрд░рд╛рдЬреВ: рдкреНрд░рд╛рд░рдВрдн рдХрд░рдирд╛

IPhone 6s рдФрд░ iPhone 6s Plus рдиреЗ 3D рдЯрдЪ рддрдХрдиреАрдХ рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рдиреЗ рд╡рд╛рд▓реА рд╕реНрдХреНрд░реАрди рдХреЗ рд╕рд╛рде рдмрд╛рдЬрд╛рд░ рдореЗрдВ рдкреНрд░рд╡реЗрд╢ рдХрд┐рдпрд╛, рдкреНрд▓рдо рдФрд░ рдЖрдбрд╝реВ рддреМрд▓рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдРрдк рд▓рдЧрднрдЧ рддреБрд░рдВрдд рдРрдк рд╕реНрдЯреЛрд░ рдореЗрдВ рджрд┐рдЦрд╛рдИ рджрд┐рдпрд╛ред

рдЫрд╡рд┐

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

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

рдирддреАрдЬрддрди, рд╕реНрдЯреЛрд░ рдореЗрдВ рдРрд╕реЗ рдХреЛрдИ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдирд╣реАрдВ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдХреЛрдИ рднреА рд╣рдореЗрдВ рдЗрд╕реЗ рдЕрдкрдиреЗ рд▓рд┐рдП рдмрдирд╛рдиреЗ рд╕реЗ рдирд╣реАрдВ рд░реЛрдХреЗрдЧрд╛ред

рдХрд╛рд░реНрдп


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

рдЫрд╡рд┐

рдкрд░рд┐рдпреЛрдЬрдирд╛ рдирд┐рд░реНрдорд╛рдг


Xcode рдЦреЛрд▓реЗрдВ, рдПрдХ рдирдпрд╛ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдмрдирд╛рдПрдВ, рд╕рд┐рдВрдЧрд▓ рд╡реНрдпреВ рдПрдкреНрд▓реАрдХреЗрд╢рди рдЯреЗрдореНрдкрд▓реЗрдЯ

рдЫрд╡рд┐

Xcode рдореЗрдВ рдПрдХ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХрд╛ рдирд┐рд░реНрдорд╛рдг


рд╕реНрдЯреЛрд░реАрдмреЛрд░реНрдб рдкрд░ рдЬрд╛рдПрдВ, рдХрдВрдЯреНрд░реЛрд▓рд░ рдкрд░ рддрддреНрд╡реЛрдВ рдХреЗ рдкреБрд╕реНрддрдХрд╛рд▓рдп рд╕реЗ рдХрдИ рдпреВрдмрд┐рд▓ рдХреЛ рдЦреАрдВрдЪреЗрдВ, рдЙрдиреНрд╣реЗрдВ рдирд┐рдпрдВрддреНрд░рдХ рдХреЗ рдКрдкрд░реА рдпрд╛ рдирд┐рдЪрд▓реЗ рдХрд┐рдирд╛рд░реЛрдВ рдХреЗ рдХрд░реАрдм рд░рдЦреЗрдВред рдпрд╣ рдЗрд╕ рддрд░рд╣ рдирд┐рдХрд▓рд╛:

рдЫрд╡рд┐

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

рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдореЗрдВ рдПрдХ рдирдИ рдлрд╝рд╛рдЗрд▓ рдЬреЛрдбрд╝реЗрдВ, рдЗрд╕реЗ ScaleView рдирд╛рдо рджреЗрдВ ред рдЗрд╕ рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рдПрдХ рд╕реНрдХреЗрд▓ рд╡реНрдпреВ рдХреНрд▓рд╛рд╕ рдмрдирд╛рдПрдВ, рдЬреЛ UIView рд╕реЗ рд╡рд┐рд░рд╛рд╕рдд рдореЗрдВ рдорд┐рд▓рд╛ рд╣реИред

рдЫрд╡рд┐

import UIKit class ScaleView: UIView { override func draw(_ rect: CGRect) { } } 

рдЗрд╕рдХреЗ рдмрд╛рдж, StoryBoard рдкрд░ рдЬрд╛рдПрдВ , рдЗрд╕реЗ UIView рддрддреНрд╡реЛрдВ рдХреЗ рдкреБрд╕реНрддрдХрд╛рд▓рдп рд╕реЗ рдирд┐рдпрдВрддреНрд░рдХ рдореЗрдВ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░реЗрдВ рдФрд░ рдЗрд╕реЗ рд╣рдорд╛рд░реЗ рдирд┐рдпрдВрддреНрд░рдХ рдХреЗ рдХреЗрдВрджреНрд░ рдореЗрдВ рд░рдЦреЗрдВред рдирдП рдЬреЛрдбрд╝реЗ рдЧрдП UIView рдХрд╛ рдЪрдпрди рдХрд░реЗрдВ рдФрд░ рдЖрдЗрдбреЗрдВрдЯрд┐рдЯреА рдЗрдВрд╕реНрдкреЗрдХреНрдЯрд░ рдиреЗ ScaleView рд╡рд░реНрдЧ рд╕реЗрдЯ рдХрд┐рдпрд╛ рдЬреЛ рд╣рдордиреЗ рдкрд╣рд▓реЗ рдмрдирд╛рдпрд╛ рдерд╛ред

рдЫрд╡рд┐

рд╕рд╛рде рд╣реА, рд╕реНрдерд┐рд░рд╛рдВрдХ рдХреА рд╕рд╣рд╛рдпрддрд╛ рд╕реЗ, рдЖрдк рд╕реНрдХреНрд░реАрди рдкрд░ рддрддреНрд╡реЛрдВ рдХреА рд╕рд╛рдкреЗрдХреНрд╖ рд╡реНрдпрд╡рд╕реНрдерд╛ рдХреЗ рд▓рд┐рдП рдирд┐рдпрдо рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдпрд╣ рдореЗрд░реЗ рд▓рд┐рдП рдЗрд╕ рддрд░рд╣ рджрд┐рдЦрддрд╛ рд╣реИ:

рдЫрд╡рд┐

рдордВрдбрд▓рд┐рдпрд╛рдВ рдмрдирд╛рдПрдВ


ScaleView.swift рдлрд╝рд╛рдЗрд▓ рдкрд░ рдЬрд╛рдПрдВред рд╕реНрдХреЗрд▓рд╡реНрдпреВ рдХреНрд▓рд╛рд╕ рдореЗрдВ , рд╣рдордиреЗ рдбреНрд░рд╛ (_ rect :) рд╡рд┐рдзрд┐ рдмрдирд╛рдИ, рдЬрд┐рд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рд╣рдо рдЗрд╕ UIView рдХреЗ рдкреНрд░рджрд░реНрд╢рди рдХреНрд╖реЗрддреНрд░ рдХреЗ рдЕрдВрджрд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд░реЗрдВрдЧреЗред

рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдХреЛрдб рдХреЛ рдбреНрд░рд╛ (_ rect :) рд╡рд┐рдзрд┐ рдореЗрдВ рдЬреЛрдбрд╝реЗрдВ

 override func draw(_ rect: CGRect) { let context = UIGraphicsGetCurrentContext() // 1 context?.setStrokeColor(UIColor.red.cgColor) // 2 context?.setLineWidth(14.0) // 3 context?.addArc(center: CGPoint(x: 375 / 2, y: 375 / 2), radius: 375 / 2 - 14, startAngle: 0, endAngle: 2 * CGFloat(M_PI), clockwise: true) // 4 context?.strokePath() // 5 } 

  1. рд╣рдореЗрдВ рдЧреНрд░рд╛рдлрд┐рдХ рд╕рдВрджрд░реНрдн рдорд┐рд▓рддрд╛ рд╣реИ рдЬрд┐рд╕рдореЗрдВ рд╣рдо рдЖрдХрд░реНрд╖рд┐рдд рдХрд░реЗрдВрдЧреЗ
  2. рд╣рдо рдЙрд╕ рд░рдВрдЧ рдХреЛ рд╕реЗрдЯ рдХрд░рддреЗ рд╣реИрдВ рдЬрд┐рд╕рдХреЗ рд╕рд╛рде рд╣рдо рдЖрдХрд░реНрд╖рд┐рдд рдХрд░реЗрдВрдЧреЗред рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ рд▓рд╛рд▓ рд╣реИ
  3. рдЙрд╕ рд░реЗрдЦрд╛ рдХреА рдЪреМрдбрд╝рд╛рдИ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░реЗрдВ рдЬрд┐рд╕рдХреЗ рд╕рд╛рде рд╣рдо рдЖрдХрд░реНрд╖рд┐рдд рдХрд░реЗрдВрдЧреЗред
  4. рд╣рдо рдПрдХ рдЪрд╛рдк рдХреЗ рд░реВрдк рдореЗрдВ рдбреНрд░рд╛рдЗрдВрдЧ рдХреЗ рд▓рд┐рдП рдкрде рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рддреЗ рд╣реИрдВ, рдЬрд┐рд╕рдХрд╛ рдХреЗрдВрджреНрд░ рд╕реНрдХреЗрд▓рд╡реНрдпреВ рдХреЗ рдХреЗрдВрджреНрд░ рдореЗрдВ рд╕реНрдерд┐рдд рд╣реИ, рдЬрд┐рд╕рдореЗрдВ рд╕реНрдХреЗрд▓ рд╡реНрдпреВ 14 рдХреА рдЪреМрдбрд╝рд╛рдИ рдХреЗ рдмрд░рд╛рдмрд░ рддреНрд░рд┐рдЬреНрдпрд╛ рд╣реИ (рдпрд╣ рджреГрд╢реНрдп рджреГрд╢реНрдп рдореЗрдВ рдЪрд╛рдк рдХреЛ рдлрд┐рдЯ рдХрд░рдирд╛ рд╣реИ), рдФрд░ рдПрдХ рд▓рдВрдмреА рдЪрд╛рдк - рдкреВрд░реЗ рдкрд░рд┐рдзрд┐ рдХреЗ рдЖрд╕рдкрд╛рд╕ 360 рдбрд┐рдЧреНрд░реАред рдХреГрдкрдпрд╛ рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ рд╕реНрдерд┐рд░рд╛рдВрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдореЗрд░реА рдЪреМрдбрд╝рд╛рдИ рдЕрдВрдХ рдкрд┐рдЫрд▓реЗ рдкреИрд░рд╛рдЧреНрд░рд╛рдл рдореЗрдВ рд╣рд╛рд░реНрдб-рдХреЛрдбрд┐рдд рд╣реИрдВред
  5. рд╣рдо рджрд┐рдП рдЧрдП рдорд╛рдкрджрдВрдбреЛрдВ рдХреЗ рд╕рд╛рде рджрд┐рдП рдЧрдП рдкрде рдкрд░ рдЖрдХрд░реНрд╖рд┐рдд рд╣реЛрддреЗ рд╣реИрдВ

рдЖрдк рдЗрд╕реЗ рд╕рддреНрдпрд╛рдкрди рдХреЗ рд▓рд┐рдП рд╕рдВрдХрд▓рд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдЖрдк рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдмрд┐рд▓реНрдбрд░ рдореЗрдВ рд╕реАрдзреЗ рдкрд░рд┐рд╡рд░реНрддрди рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдирд┐рд░реНрджреЗрд╢ рднреА рд╕реЗрдЯ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред

рд╕рднреА рдЬрд╛рджреВ @IBDesignable рдирд┐рд░реНрджреЗрд╢ рдореЗрдВред рдЗрд╕ рдирд┐рд░реНрджреЗрд╢ рдХреЗ рд╕рд╛рде рд╕реНрдХреЗрд▓ рд╡реНрдпреВ рд╡рд░реНрдЧ рдХреЛ рдЪрд┐рд╣реНрдирд┐рдд рдХрд░реЗрдВ ред

 import UIKit @IBDesignable class ScaleView: UIView { override func draw(_ rect: CGRect) { let context = UIGraphicsGetCurrentContext() context?.setStrokeColor(UIColor.red.cgColor) context?.setLineWidth(14.0) context?.addArc(center: CGPoint(x: 375 / 2, y: 375 / 2), radius: 375 / 2 - 14, startAngle: 0, endAngle: 2 * CGFloat(M_PI), clockwise: true) context?.strokePath() } } 

рдЙрд╕рдХреЗ рдмрд╛рдж, StoryBoard рдкрд░ рдЬрд╛рдПрдВ , рдереЛрдбрд╝рд╛ рдЗрдВрддрдЬрд╛рд░ рдХрд░реЗрдВ рдФрд░ рдЖрдкрдХреЛ ViewController рдХреЗ рдХреЗрдВрджреНрд░ рдореЗрдВ рдПрдХ рдЪрд┐рддреНрд░рд┐рдд рд▓рд╛рд▓ рд╕рд░реНрдХрд▓ рджрд┐рдЦрд╛рдИ рджреЗрдЧрд╛

рдЫрд╡рд┐

рдЖрдЗрдП рдЕрднреНрдпрд╛рд╕ рдХрд░реЗрдВ рдФрд░ рдПрдХ рдФрд░ рд╡реГрддреНрдд рдХреЛ рдЫреЛрдЯрд╛ рдФрд░ рдкрддрд▓рд╛ рдЦреАрдВрдЪреЗрдВред рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, ScaleView рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рдирд┐рдореНрди рдХреЛрдб рдХреЛ рдбреНрд░рд╛ (_ rect :) рд╡рд┐рдзрд┐ рдореЗрдВ рдЬреЛрдбрд╝реЗрдВ :

 context?.setLineWidth(1.0) context?.setStrokeColor(UIColor.lightGray.cgColor) context?.addArc(center: CGPoint(x: 375 / 2, y: 375 / 2), radius: 375 / 4 - 14, startAngle: 0, endAngle: 2 * CGFloat(M_PI), clockwise: true) context?.strokePath() 

рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рд╕реНрдкрд╖реНрдЯ рд╣реИ, рдФрд░ рдЗрд╕рд▓рд┐рдП рд╣рдордиреЗ рдЬреЛрдбрд╝рд╛ред рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рд╣рдордиреЗ рд╕реНрдХреЗрд▓рд╡реНрдпреВ рдХреА рдЪреМрдбрд╝рд╛рдИ рдФрд░ рдПрдХ рдмрд┐рдВрджреБ рдХреА рдЪреМрдбрд╝рд╛рдИ рдХреЗ рдПрдХ рдФрд░ рд╕рд░реНрдХрд▓, рдЧреНрд░реЗ, рд░реЗрдбреА рдХреЛ рдЬреЛрдбрд╝рд╛ ред

StoryBoard рдореЗрдВ рдкрд░рд┐рдгрд╛рдо:

рдЫрд╡рд┐

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

 @IBOutlet weak var scaleView: ScaleView! @IBOutlet weak var forceLabel: UILabel! @IBOutlet weak var grammLabel: UILabel! 

рд╕реАрдзреЗ - рд╕реАрдзреЗ рддрд░рд╛рдЬреВ


рдЗрд╕рд▓рд┐рдП, рд╣рдо рд╕реНрдХреНрд░реАрди рдХреЛ рджрдмрд╛рдиреЗ рдХреЗ рдмрд▓ рдХреЛ рдорд╛рдкрдиреЗ рдХреЗ рдХреНрд╖рдг рдХреЗ рдХрд░реАрдм рдЖрдПред ViewController рдкрд░ рдЬрд╛рдПрдВ рдФрд░ viewDidLoad () рдкрджреНрдзрддрд┐ рдореЗрдВ рд╕рднреА UILabel рдХреЗ рд▓рд┐рдП рд╕реНрдЯрд╛рд░реНрдЯ рд╡реИрд▓реНрдпреВ рдЬреЛрдбрд╝реЗрдВ

 override func viewDidLoad() { super.viewDidLoad() forceLabel.text = "0% force" grammLabel.text = "0 " } 

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

 override func touchesMoved(_ touches: Set<UITouch>, with event: UIEvent?) { if let touch = touches.first { // 1 if #available(iOS 9.0, *) { // 2 if traitCollection.forceTouchCapability == UIForceTouchCapability.available { // 3 if touch.force >= touch.maximumPossibleForce { // 4 forceLabel.text = "100%+ force" grammLabel.text = "385 " } else { let force = (touch.force / touch.maximumPossibleForce) * 100 // 5 let grams = force * 385 / 100 // 6 let roundGrams = Int(grams) // 7 forceLabel.text = "\(Int(force))% force" // 8 grammLabel.text = "\(roundGrams) " } } } } } 

рддреБрд▓рд╛ рдЖрдИрдУрдПрд╕ рдЖрд╡реЗрджрди рдХреЗ рд╕рднреА рдпрд╛рдВрддреНрд░рд┐рдХреА рдЗрд╕ рд╡рд┐рдзрд┐ рд╣реИред рдмрд╛рдХреА рд╕рдм рдХреБрдЫ рдЬреЛ рд╣рдо рдЗрд╕ рдкрд╛рда рдореЗрдВ рдЖрдЧреЗ рдХрд░реЗрдВрдЧреЗ рд╡рд╣ рд╕реБрдзрд╛рд░ рд╣реИред рд╣рдордиреЗ рдкрд╣рд▓реЗ рд╣реА рд╕рднреА рдмреБрдирд┐рдпрд╛рджреА рдХрд╛рдо рдХрд░ рд▓рд┐рдП рд╣реИрдВред рдЪрд▓реЛ рдЗрд╕реЗ рдЕрд▓рдЧ рд▓реЗ рдЬрд╛рдУ

  1. рд╕реНрдХреНрд░реАрди рдХреЗ рдЯрдЪ рдХреЗ рдкреВрд░реЗ рд╕реЗрдЯ рд╕реЗ, рд╣рдо рдкрд╣рд▓реЗ рдХреЛ рдЪреБрдирддреЗ рд╣реИрдВ
  2. рдпрд╣ рдирд┐рд░реНрджреЗрд╢ рдбрд┐рд╡рд╛рдЗрд╕ рдкрд░ рд╕реНрдерд╛рдкрд┐рдд рдСрдкрд░реЗрдЯрд┐рдВрдЧ рд╕рд┐рд╕реНрдЯрдо рдХреА рдЬрд╛рдВрдЪ рдХрд░рддрд╛ рд╣реИ рдФрд░ рдХреЗрд╡рд▓ рддрднреА рдЖрдЧреЗ рдмрдврд╝рддрд╛ рд╣реИ рдЬрдм рдСрдкрд░реЗрдЯрд┐рдВрдЧ рд╕рд┐рд╕реНрдЯрдо рд╕рдВрд╕реНрдХрд░рдг 9.0 рдпрд╛ рдЕрдзрд┐рдХ рд╣реИред 3 рдбреА рдЯрдЪ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХреЗрд╡рд▓ iOS рдХреЗ 9 рд╡реЗрдВ рд╕рдВрд╕реНрдХрд░рдг рдХреЗ рд╕рд╛рде рд╕рдВрднрд╡ рд╣реЛ рдЧрдпрд╛ред рдкрд╣рд▓реЗ рдХреЗ рд╕рдВрд╕реНрдХрд░рдгреЛрдВ рдХреЗ рджрд░реНрдж рдореЗрдВ рдЗрд╕реЗ рд╕рдВрднрд╛рд▓рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░рдиреЗ рдХрд╛ рдХреЛрдИ рдорддрд▓рдм рдирд╣реАрдВ рд╣реИ
  3. рдФрд░ рдЗрд╕ рдкрдВрдХреНрддрд┐ рдореЗрдВ, рдбрд┐рд╡рд╛рдЗрд╕ рдХреЛ 3 рдбреА рдЯрдЪ рдлрд╝рдВрдХреНрд╢рди рдХреЗ рд╕рд╛рде рд╕реНрдХреНрд░реАрди рдХреЗ рд▓рд┐рдП рд╕рдорд░реНрдерди рдХреЗ рд▓рд┐рдП рдкрд░реАрдХреНрд╖рдг рдХрд┐рдпрд╛ рдЬрд╛ рд░рд╣рд╛ рд╣реИред рдЖрдЦрд┐рд░рдХрд╛рд░, рдЖрдИрдУрдПрд╕ рд╕рдВрд╕реНрдХрд░рдг 10 рднреА рдЖрдИрдлреЛрди 6 рдкрд░ рдЦрдбрд╝рд╛ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЗрд╕рд╕реЗ рдЗрд╕ рд╕реНрдорд╛рд░реНрдЯрдлреЛрди рдХреА рд╕реНрдХреНрд░реАрди рджрдмрд╛рдиреЗ рдХреЗ рдмрд▓ рдХреЛ рднреЗрджрдирд╛ рд╢реБрд░реВ рдирд╣реАрдВ рдХрд░реЗрдЧреАред рдпрд╣ рдирд┐рд░реАрдХреНрд╖рдг рд╕рдЦреНрдд Apple рдЖрд╡рд╢реНрдпрдХрддрд╛рдУрдВ рдХреЗ рддрд╣рдд рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред
  4. рдПрдХ рд╕реНрдкрд░реНрд╢ рдореЗрдВ рдПрдХ рдмрд▓ рдЧреБрдг рд╣реЛрддрд╛ рд╣реИ рдЬрд┐рд╕рдореЗрдВ рдкреНрд░рддреНрдпреЗрдХ рдмрд╛рд░ рд╕реНрдкрд░реНрд╢ рдХрд░рдиреЗ рдкрд░ рдмрд▓ рд╕рдВрдЪрд╛рд░рд┐рдд рд╣реЛрддрд╛ рд╣реИред (_: :) рд╡рд┐рдзрд┐ рдХрд╛рдо рдХрд░рддреА рд╣реИред рдФрд░ рдЗрд╕ рдкрдВрдХреНрддрд┐ рдореЗрдВ рд╣рдо рд╡рд░реНрддрдорд╛рди рджрдмрд╛рд╡ рдмрд▓ рдХреЗ рдореВрд▓реНрдп рдФрд░ рджрдмрд╛рд╡ рдмрд▓ рдХреЗ рдЕрдзрд┐рдХрддрдо рд╕рдВрднрд╡ рдореВрд▓реНрдп рдХреА рддреБрд▓рдирд╛ рдХрд░рддреЗ рд╣реИрдВред рдФрд░ рдпрджрд┐ рджрдмрд╛рдиреЗ рд╡рд╛рд▓реА рд╢рдХреНрддрд┐ рдЕрдзрд┐рдХрддрдо рд╕реЗ рдЕрдзрд┐рдХ рд╣реИ, рддреЛ рд╣рдорд╛рд░реЗ рдпреВрдЖрдИрдмреЗрд▓ рдореЗрдВ рд╣рдо рдЕрдзрд┐рдХрддрдо рдореВрд▓реНрдпреЛрдВ рдХреЛ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░рддреЗ рд╣реИрдВ, рдЕрд░реНрдерд╛рддреН рдмрд▓ рдХрд╛ 100 % рдФрд░ 385 рдЧреНрд░рд╛рдоред рдпрд╣ рдзреНрдпрд╛рди рджрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП рдХрд┐ рдпрд╣ 385 рдЧреНрд░рд╛рдо рдХреНрдпреЛрдВ рд╣реИред рддрдереНрдп рдпрд╣ рд╣реИ рдХрд┐ 3 рдбреА рдЯрдЪ рддрдХрдиреАрдХ рдЗрд╕ рддрд░рд╣ рд╕реЗ рдмрдирд╛рдИ рдЧрдИ рд╣реИ рдХрд┐ 100% рджрдмрд╛рд╡ рдмрд▓ 385 рдЧреНрд░рд╛рдо рд╕реЗ рдореЗрд▓ рдЦрд╛рддреА рд╣реИред рддрджрдиреБрд╕рд╛рд░, рджрдмрд╛рдиреЗ рдХреЗ рдмрд▓ рдХрд╛ рдкреНрд░рддрд┐рд╢рдд рдкреНрд░рд╛рдкреНрдд рдХрд░реЗрдВ, рд╣рдо рдЖрд╕рд╛рдиреА рд╕реЗ рдЧреНрд░рд╛рдо рдореЗрдВ рд╡рдЬрди рдХреА рдЧрдгрдирд╛ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред
  5. рдпрд╣рд╛рдБ рд╣рдо рдпреЗ рдЧрдгрдирд╛ рдХрд░рддреЗ рд╣реИрдВред рдЗрд╕ рдкрдВрдХреНрддрд┐ рдореЗрдВ рд╣рдо рджрдмрд╛рд╡ рдХреЗ рдкреНрд░рддрд┐рд╢рдд рдХреА рдЧрдгрдирд╛ рдХрд░рддреЗ рд╣реИрдВ
  6. рдпрд╣рд╛рдВ рд╣рдо рдЧреНрд░рд╛рдо рдореЗрдВ рд╡рдЬрди рдХреА рдЧрдгрдирд╛ рдХрд░рддреЗ рд╣реИрдВ, рд╕реВрддреНрд░ 100% = 385 рдЧреНрд░рд╛рдо рдХреЗ рдЖрдзрд╛рд░ рдкрд░
  7. рдпрд╣ рдкреВрд░реЗ рдХреЗ рд▓рд┐рдП рдЧреНрд░рд╛рдо рдХреА рдПрдХ рд╕рд░рд▓ рдЧреЛрд▓рд╛рдИ рд╣реИ
  8. рд╣рдо рдЕрдкрдиреЗ рдпреВрдмрд┐рд▓ рдХреЗ рдЧреНрд░рд╛рдо рдореЗрдВ рдкреНрд░рддрд┐рд╢рдд рд╢рдХреНрддрд┐ рдФрд░ рд╡рдЬрди рдХреЛ рдкрд╛рд╕ рдХрд░рддреЗ рд╣реИрдВ

рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЛ рд╢реБрд░реВ рдХрд░рдиреЗ рдФрд░ рдЬрд╛рдВрдЪрдиреЗ рд╕реЗ рдкрд╣рд▓реЗ, рдЖрдкрдХреЛ рдПрдХ рдФрд░ рддрд░реАрдХрд╛ рдЬреЛрдбрд╝рдирд╛ рд╣реЛрдЧрд╛ рдЬреЛ рддрдм рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ рдЬрдм рд╕реНрдХреНрд░реАрди рдкрд░ рд╕рднреА рдЯрдЪ рдЯрдЪ рд╣реЛ рдЬрд╛рддреЗ рд╣реИрдВ рдФрд░ (: :) , рддрд╛рдХрд┐ рд╣рдорд╛рд░реЗ UILabels рдХреА рдкреНрд░рд╛рд░рдВрднрд┐рдХ рд╕реНрдерд┐рддрд┐ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рд╣реЛ рд╕рдХреЗ рдФрд░ рдЙрдирдореЗрдВ 0% рдФрд░ 0 рдЧреНрд░рд╛рдо рдорд╛рдиреЛрдВ рдХреЛ рдкрд╛рд╕ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХреЗред рдЗрд╕ рд╡рд┐рдзрд┐ рдХреЛ ViewController рдХреНрд▓рд╛рд╕ рдореЗрдВ рдЬреЛрдбрд╝реЗрдВред

 override func touchesEnded(_ touches: Set<UITouch>, with event: UIEvent?) { forceLabel.text = "0% force" grammLabel.text = "0 " } 

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

рдЫрд╡рд┐

рд╢реЛрдзрди


рдореБрдЦреНрдп рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рддреИрдпрд╛рд░ рд╣реИ, рд▓реЗрдХрд┐рди рдЬрдм рдореИрдВрдиреЗ рдЗрд╕ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЛ рд▓рд┐рдЦрд╛, рддреЛ рдореИрдВрдиреЗ рддреАрди рдЪреАрдЬреЛрдВ рдХреЛ рдЬреЛрдбрд╝рдиреЗ рдХрд╛ рдлреИрд╕рд▓рд╛ рдХрд┐рдпрд╛:

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

рд╣рдо рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рд▓реЗрдЦреЛрдВ рдореЗрдВ рдЗрди рдкрд░рд┐рд╡рд░реНрдзрди рд╕реЗ рдирд┐рдкрдЯреЗрдВрдЧреЗ :-)

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


All Articles