IOS рдХреЗ рд▓рд┐рдП рдЕрдкрдирд╛ рдХрдВрдкреЛрдиреЗрдВрдЯ рдХреИрд╕реЗ рд▓рд┐рдЦреЗрдВ

рдЫрд╡рд┐

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

Apple UITextField , UIButton рдФрд░ UISwitch рд╕рд╣рд┐рдд рд▓рдЧрднрдЧ 20 рд╡рд┐рднрд┐рдиреНрди UI рдШрдЯрдХреЛрдВ рдХреЗ рд╕рд╛рде рдбреЗрд╡рд▓рдкрд░ рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИред рдорд╛рдирдХ рдирд┐рдпрдВрддреНрд░рдг рдХреА рд╕рднреА рд╢рдХреНрддрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ, рдЖрдк рдХрдИ рдЕрд▓рдЧ-рдЕрд▓рдЧ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рд╡рд┐рдХрд▓реНрдк рдмрдирд╛ рд╕рдХрддреЗ рд╣реИрдВред рдЬреИрд╕рд╛ рдХрд┐ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ, рдХрднреА-рдХрднреА рдРрд╕реА рдЪреАрдЬрд╝ рдХреА рдЬрд╝рд░реВрд░рдд рд╣реЛрддреА рд╣реИ рдЬрд┐рд╕реЗ рдорд╛рдирдХ рдШрдЯрдХреЛрдВ рджреНрд╡рд╛рд░рд╛ рдорд╣рд╕реВрд╕ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред

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

рдЫрд╡рд┐

рд╣рд╛рд▓рд╛рдВрдХрд┐ рдпрд╣ рд╡рд┐рдХрд▓реНрдк рдХрд╛рдо рдХрд░реЗрдЧрд╛, рдпрд╣ рдореВрд▓реНрдп рд╕реАрдорд╛ рдХреА рдЕрд╡рдзрд╛рд░рдгрд╛ рдХреЛ рдмрд╣реБрдд рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ рдирд╣реАрдВ рдмрддрд╛рддрд╛ рд╣реИред рджреЛ рд╕реНрд▓рд╛рдЗрдбрд░ рдХреЗ рд╕рд╛рде рдПрдХ рд╕реНрд▓рд╛рдЗрдбрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдмреЗрд╣рддрд░ рд╣реЛрдЧрд╛ рдЬреЛ рдиреНрдпреВрдирддрдо рдФрд░ рдЕрдзрд┐рдХрддрдо рдХреЗ рд▓рд┐рдП рдЬрд┐рдореНрдореЗрджрд╛рд░ рд╣реИрдВ:

рдЫрд╡рд┐

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

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

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

рдпрд╣ рдкрд╛рда рдЖрдкрдХреЛ рджрд┐рдЦрд╛рдПрдЧрд╛ рдХрд┐ рдЕрдкрдиреЗ рд╕реНрд╡рдпрдВ рдХреЗ RangeSlider рдирд┐рдпрдВрддреНрд░рдг рдХреЛ рдХреИрд╕реЗ рд╡рд┐рдХрд╕рд┐рдд рдХрд┐рдпрд╛ RangeSlider рдЬреЛ рдЙрдкрд░реЛрдХреНрдд рд╕рдорд╕реНрдпрд╛ рдХреЛ рд╣рд▓ рдХрд░рддрд╛ рд╣реИред рдореМрдЬреВрджрд╛ рдШрдЯрдХреЛрдВ рдХреЛ рд╡рд┐рд╕реНрддрд╛рд░рд┐рдд рдХрд░рдиреЗ, рдПрдкреАрдЖрдИ рд╡рд┐рдХрд╕рд┐рдд рдХрд░рдиреЗ рдФрд░ рдпрд╣рд╛рдВ рддрдХ тАЛтАЛрдХрд┐ рдЕрдкрдиреА рд░рдЪрдирд╛ рдХреЛ рд╕рд╛рд░реНрд╡рдЬрдирд┐рдХ рдкрд╣реБрдВрдЪ рдореЗрдВ рд░рдЦрдиреЗ рдЬреИрд╕реЗ рдореБрджреНрджреЗ рдкреНрд░рднрд╛рд╡рд┐рдд рд╣реЛрдВрдЧреЗред

рдЗрддрдирд╛ рдкрд░реНрдпрд╛рдкреНрдд рд╕рд┐рджреНрдзрд╛рдВрдд! рдпрд╣ рдЕрдиреБрд░реВрдкрдг рд╢реБрд░реВ рдХрд░рдиреЗ рдХрд╛ рд╕рдордп рд╣реИ!

рд╢реБрд░реБрдЖрдд


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

рдЫрд╡рд┐

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

рдХрд╕реНрдЯрдо рдирд┐рдпрдВрддреНрд░рдг рдмрдирд╛рддреЗ рд╕рдордп рдЖрдкрдХреЛ рдЬреЛ рдкрд╣рд▓рд╛ рдирд┐рд░реНрдгрдп рд▓реЗрдирд╛ рд╣реЛрдЧрд╛, рд╡рд╣ рдореМрдЬреВрджрд╛ рд╡рд░реНрдЧ рд╣реИ рдЬреЛ рдЖрдкрдХреЛ рд╡рд┐рд░рд╛рд╕рдд рдореЗрдВ рдорд┐рд▓реЗрдЧрд╛ рдпрд╛ рд╡рд┐рд╕реНрддрд╛рд░рд┐рдд рдХрд░реЗрдЧрд╛ред рдпрд╣ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИ рдХрд┐ рд╡рд░реНрдЧ UIView ред

рдпрджрд┐ рдЖрдк Apple UIKit рдХреЗ рд╡рд┐рднрд┐рдиреНрди рдШрдЯрдХреЛрдВ рдХреЛ рдХрд░реАрдм рд╕реЗ рджреЗрдЦрддреЗ рд╣реИрдВ, рддреЛ рдЖрдк рджреЗрдЦреЗрдВрдЧреЗ рдХрд┐ рдХрдИ рддрддреНрд╡реЛрдВ рдЬреИрд╕реЗ рдХрд┐ UILabel рдФрд░ UIWebView рд╕реАрдзреЗ UIView рд╡рд┐рд░рд╛рд╕рдд рдореЗрдВ рдорд┐рд▓рд╛ рд╣реИред рд▓реЗрдХрд┐рди рдЬреИрд╕рд╛ рдХрд┐ рдпрд╣ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ, рдРрд╕реЗ рддрддреНрд╡ рд╣реИрдВ рдЬреЛ UIControl рд╡рд┐рд░рд╛рд╕рдд рдореЗрдВ UIControl , рдЬреИрд╕рд╛ рдХрд┐ рдЗрд╕ рдЖрдВрдХрдбрд╝реЗ рдореЗрдВ рджрд┐рдЦрд╛рдпрд╛ рдЧрдпрд╛ рд╣реИ:

рдЫрд╡рд┐

рдиреЛрдЯ: рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рддрддреНрд╡реЛрдВ рдХрд╛ рдПрдХ рд╡рд┐рд╕реНрддреГрдд рдкрджрд╛рдиреБрдХреНрд░рдо рдпрд╣рд╛рдВ рдкрд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ: UIKit рдлреНрд░реЗрдорд╡рд░реНрдХ рд╕рдВрджрд░реНрдн ред


UIControl рдХреНрд▓рд╛рд╕ рдЯрд╛рд░рдЧреЗрдЯ-рдПрдХреНрд╢рди рдЯреЗрдореНрдкрд▓реЗрдЯ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рддрд╛ рд╣реИ, рдЬреЛ рдЕрдирд┐рд╡рд╛рд░реНрдп рд░реВрдк рд╕реЗ рдШрдЯрдХ рдкрд░рд┐рд╡рд░реНрддрдиреЛрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╕реВрдЪрд┐рдд рдХрд░рдиреЗ рдХрд╛ рдПрдХ рддрд░реАрдХрд╛ рд╣реИред UIControl рдореЗрдВ рдХрд┐рд╕реА рд╡рд╕реНрддреБ рдХреА рд╕реНрдерд┐рддрд┐ рдХреА рдирд┐рдЧрд░рд╛рдиреА рд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд рдХрдИ рдЧреБрдг UIControl рд╣реЛрддреЗ рд╣реИрдВред рдЖрдк рд╣рдорд╛рд░реЗ рдШрдЯрдХ рдХреЛ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдмрд╕ рдРрд╕реЗ рдЯреЗрдореНрдкрд▓реЗрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВрдЧреЗ, рдЗрд╕рд▓рд┐рдП UIControl рдПрдХ рдЙрддреНрдХреГрд╖реНрдЯ рд╢реБрд░реБрдЖрдд рдХреЗ рд░реВрдк рдореЗрдВ рдХрд╛рдо рдХрд░реЗрдЧрд╛ред

рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдиреЗрд╡рд┐рдЧреЗрдЯрд░ рдореЗрдВ CERangeSlider рд╕рдореВрд╣ рдкрд░ рд░рд╛рдЗрдЯ-рдХреНрд▓рд┐рдХ рдХрд░реЗрдВ рдФрд░ рдирдИ рдлрд╝рд╛рдЗрд▓ рдЪреБрдиреЗрдВ, рдлрд┐рд░ iOS -> рдХреЛрдХреЛ рдЯрдЪ -> рдСрдмреНрдЬреЗрдХреНрдЯрд┐рд╡-рд╕реА рдХреНрд▓рд╛рд╕ рдФрд░ рдиреЗрдХреНрд╕реНрдЯ рдкрд░ рдХреНрд▓рд┐рдХ рдХрд░реЗрдВред рд╡рд░реНрдЧ CERangeSlider рдХрд╛ рдирд╛рдо, рдФрд░ "рдЙрдкрд╡рд░реНрдЧ" рдлрд╝реАрд▓реНрдб рдореЗрдВ , UIControl рджрд░реНрдЬ рдХрд░реЗрдВред рдЕрдЧрд▓рд╛ рдХреНрд▓рд┐рдХ рдХрд░реЗрдВ рдФрд░ рд╡рд░реНрдЧ рдХреЗ рд▓рд┐рдП рднрдВрдбрд╛рд░рдг рд╕реНрдерд╛рди рдХрд╛ рдЪрдпрди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдмрдирд╛рдПрдБ ред

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

CEViewController.m рдЦреЛрд▓реЗрдВ рдФрд░ рдирд┐рдореНрди рдкрдВрдХреНрддрд┐ рдкреЗрд╕реНрдЯ рдХрд░реЗрдВ:

 #import "CERangeSlider.h" 


рдЙрд╕реА рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рдЕрдЧрд▓рд╛ рдПрдХ рдЪрд░ рдЬреЛрдбрд╝реЗрдВ:

 @implementation CEViewController { CERangeSlider* _rangeSlider; } 


рдирд┐рдореНрди рдХреЛрдб рдмреНрд▓реЙрдХ рдХреЗ viewDidLoad рдорд╛рдирдХ viewDidLoad рдмрджрд▓реЗрдВ:

 - (void)viewDidLoad { [super viewDidLoad]; // Do any additional setup after loading the view, typically from a nib. NSUInteger margin = 20; CGRect sliderFrame = CGRectMake(margin, margin, self.view.frame.size.width - margin * 2, 30); _rangeSlider = [[CERangeSlider alloc] initWithFrame:sliderFrame]; _rangeSlider.backgroundColor = [UIColor redColor]; [self.view addSubview:_rangeSlider]; } 


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

рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдмрдирд╛рдПрдВ рдФрд░ рдЪрд▓рд╛рдПрдВ; рдЖрдкрдХреЛ рдирд┐рдореНрди рд╕реНрдХреНрд░реАрди рджреЗрдЦрдиреА рдЪрд╛рд╣рд┐рдП:

рдЫрд╡рд┐

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

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


рдорд╛рдирдХ рдШрдЯрдХ рдЧреБрдг рдЬреЛрдбрд╝реЗрдВ


CERangeSlider.h рдЦреЛрд▓реЗрдВ рдФрд░ @interface рдФрд░ @end: рдмреАрдЪ рдирд┐рдореНрди рдЧреБрдг рдЬреЛрдбрд╝реЗрдВ @end:

 @property (nonatomic) float maximumValue; @property (nonatomic) float minimumValue; @property (nonatomic) float upperValue; @property (nonatomic) float lowerValue; 

рдпреЗ рдЪрд╛рд░ рдЧреБрдг рдШрдЯрдХ рдХреА рд╕реНрдерд┐рддрд┐ рдХрд╛ рд╡рд░реНрдгрди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкрд░реНрдпрд╛рдкреНрдд рд╣реИрдВ - рд╕реАрдорд╛ рдХреЗ рдЕрдзрд┐рдХрддрдо рдФрд░ рдиреНрдпреВрдирддрдо рдореВрд▓реНрдп, рдФрд░ рд╡рд░реНрддрдорд╛рди рдирд┐рдЪрд▓реЗ рдФрд░ рдКрдкрд░реА рдереНрд░реЗрд╕рд╣реЛрд▓реНрдбред

рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ рдбрд┐рдЬрд╝рд╛рдЗрди рдХрд┐рдП рдЧрдП рдирд┐рдпрдВрддреНрд░рдгреЛрдВ рдореЗрдВ рдорд╛рдирдХ рд╕реЗрдЯрд┐рдВрдЧреНрд╕ рд╣реЛрдиреА рдЪрд╛рд╣рд┐рдП, рдЕрдиреНрдпрдерд╛ рд╡реЗ рд╕реНрдХреНрд░реАрди рдкрд░ рдкреНрд░рд╕реНрддреБрдд рдХрд░рддреЗ рд╕рдордп рдереЛрдбрд╝рд╛ рдЕрдЬреАрдм рджрд┐рдЦреЗрдВрдЧреЗред CERangeSlider.m рдЦреЛрд▓реЗрдВ, initWithFrame: рдвреВрдВрдвреЗрдВ initWithFrame: Xcode рджреНрд╡рд╛рд░рд╛ рдЙрддреНрдкрдиреНрди рд╡рд┐рдзрд┐, рдФрд░ рдЗрд╕реЗ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдХреЛрдб рд╕реЗ рдмрджрд▓реЗрдВ:

 - (id)initWithFrame:(CGRect)frame { self = [super initWithFrame:frame]; if (self) { // Initialization code _maximumValue = 10.0; _minimumValue = 0.0; _upperValue = 8.0; _lowerValue = 2.0; } return self; } 

рдЕрдм рдШрдЯрдХ рдХреЗ рдЗрдВрдЯрд░реИрдХреНрдЯрд┐рд╡ рддрддреНрд╡реЛрдВ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХрд╛ рд╕рдордп рд╣реИ: рд╕реНрд▓рд╛рдЗрдбрд░реНрд╕ рдФрд░ рдПрдХ рдкреНрд░рдЧрддрд┐ рдкрдЯреНрдЯреА рдЬрд┐рд╕ рдкрд░ рд╡реЗ рд╕реНрдерд┐рдд рд╣реИрдВред

рдЪрд┐рддреНрд░ рдмрдирд╛рдо CoreGraphics


рд╕реНрдХреНрд░реАрди рдкрд░ рдЖрдЗрдЯрдо рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рдиреЗ рдХреЗ рджреЛ рддрд░реАрдХреЗ рд╣реИрдВ:
  1. рдЫрд╡рд┐ рдШрдЯрдХ рдХреЗ рднрд╛рдЧ рдХреЗ рд░реВрдк рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ,
  2. рдкрд░рддреЛрдВ рдФрд░ рдХреЛрд░ рдЧреНрд░рд╛рдлрд┐рдХреНрд╕ рдХреЗ рд╕рдВрдпреЛрдЬрди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВред

рдкреНрд░рддреНрдпреЗрдХ рд╡рд┐рдзрд┐ рдХреЗ рдЕрдкрдиреЗ рдкреЗрд╢реЗрд╡рд░реЛрдВ рдФрд░ рд╡рд┐рдкрдХреНрд╖ рд╣реИрдВред



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

рдЗрд╕ рдкрд╛рда рдореЗрдВ рд╣рдо рджреВрд╕рд░реЗ рджреГрд╖реНрдЯрд┐рдХреЛрдг - рдХреЛрд░ рдЧреНрд░рд╛рдлрд┐рдХреНрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВрдЧреЗред

рдиреЛрдЯ: рдЙрддреНрд╕реБрдХрддрд╛ рд╕реЗ, Apple рдЕрдкрдиреЗ рдШрдЯрдХреЛрдВ рдореЗрдВ рдЧреНрд░рд╛рдлрд┐рдХ рд╕рдВрд╕рд╛рдзрдиреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдкрд╕рдВрдж рдХрд░рддрд╛ рд╣реИред рд╕рдмрд╕реЗ рдЕрдзрд┐рдХ рд╕рдВрднрд╛рд╡рдирд╛ рд╣реИ, рдпрд╣ рдЗрд╕ рддрдереНрдп рдХреЗ рдХрд╛рд░рдг рд╣реИ рдХрд┐ рд╡реЗ рдкреНрд░рддреНрдпреЗрдХ рддрддреНрд╡ рдХреЗ рд▓рд┐рдП рдорд╛рдирдХ рдЖрдХрд╛рд░ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рдЗрд╕рдХреЗ рдкреВрд░реНрдг рдЕрдиреБрдХреВрд▓рди рдХреА рдЕрдиреБрдорддрд┐ рдирд╣реАрдВ рджреЗрддреЗ рд╣реИрдВред

Xcode рдореЗрдВ, рдкреНрд░реЛрдЬреЗрдХреНрдЯ рд╕реЗрдЯрд┐рдВрдЧреНрд╕ рд╡рд┐рдВрдбреЛ рдкрд░ рдЬрд╛рдПрдВред рдлрд┐рд░ рдмрд┐рд▓реНрдб рдлрд╝реЗрдЬрд╝ рдЯреИрдм рдФрд░ рд▓рд┐рдВрдХ рдмрд╛рдЗрдирд░реА рд▓рд╛рдЗрдмреНрд░рд░реАрдЬрд╝ рд╕реЗрдХреНрд╢рди рдХрд╛ рдЪрдпрди рдХрд░реЗрдВред рд╕реВрдЪреА рдореЗрдВ QuartzCore.framework рдЬреЛрдбрд╝реЗрдВред рдЗрд╕ рдврд╛рдВрдЪреЗ рдХреЗ рд╡рд░реНрдЧреЛрдВ рдФрд░ рд╡рд┐рдзрд┐рдпреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдШрдЯрдХ рдХреЛ рдореИрдиреНрдпреБрдЕрд▓ рд░реВрдк рд╕реЗ рдкреНрд░рд╕реНрддреБрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред

рдпрд╣ рд╕реНрдХреНрд░реАрдирд╢реЙрдЯ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рддрд╛ рд╣реИ рдХрд┐ рдпрджрд┐ рдЖрдк рднреНрд░рдорд┐рдд рд╣реИрдВ рддреЛ QuartzCore.framework рдХреЛ рдХреИрд╕реЗ рдЦреЛрдЬреЗрдВ рдФрд░ рдЬреЛрдбрд╝реЗрдВ:

рдЫрд╡рд┐

CERangeSlider.m рдЦреЛрд▓реЗрдВ рдФрд░ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдкрдВрдХреНрддрд┐ рдЬреЛрдбрд╝реЗрдВ:

 #import <QuartzCore/QuartzCore.h> 

@implementation рд╣реЛрдиреЗ рдХреЗ рддреБрд░рдВрдд рдмрд╛рдж, рдЙрд╕реА рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рдирд┐рдореНрди рдЪрд░ рдЬреЛрдбрд╝реЗрдВ:

 @implementation CERangeSlider { CALayer* _trackLayer; CALayer* _upperKnobLayer; CALayer* _lowerKnobLayer; float _knobWidth; float _useableTrackLength; } 

рдЖрдкрдХреЗ рдШрдЯрдХ рдХреЗ рд╡рд┐рднрд┐рдиреНрди рддрддреНрд╡реЛрдВ рдХреЛ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЗрди рддреАрди рдкрд░рддреЛрдВ - _trackLayer , _upperKnobLayer рдФрд░ _lowerKnobLayer рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред рджреЛ рдЪрд░ _knobWidth рдФрд░ _useableTrackLength рдХрд╛ рдЙрдкрдпреЛрдЧ рдЗрди рддрддреНрд╡реЛрдВ рдХреЗ рдорд╛рдкрджрдВрдбреЛрдВ рдХреЛ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред

CERangeSlider.m рдореЗрдВ initWithFrame: рдФрд░ if (self) { } рдмреНрд▓реЙрдХ: рдореЗрдВ рдирд┐рдореНрди рдХреЛрдб рдЬреЛрдбрд╝реЗрдВ:

 _trackLayer = [CALayer layer]; _trackLayer.backgroundColor = [UIColor blueColor].CGColor; [self.layer addSublayer:_trackLayer]; _upperKnobLayer = [CALayer layer]; _upperKnobLayer.backgroundColor = [UIColor greenColor].CGColor; [self.layer addSublayer:_upperKnobLayer]; _lowerKnobLayer = [CALayer layer]; _lowerKnobLayer.backgroundColor = [UIColor greenColor].CGColor; [self.layer addSublayer:_lowerKnobLayer]; [self setLayerFrames]; 

рдпрд╣ рдХреЛрдб рдмреНрд▓реЙрдХ рддреАрди рд▓реЗрдпрд░реНрд╕ рдмрдирд╛рддрд╛ рд╣реИ рдФрд░ рдЙрдиреНрд╣реЗрдВ рдмрдЪреНрдЪреЛрдВ рдХреЗ рд░реВрдк рдореЗрдВ рдореБрдЦреНрдп рд░реВрдк рд╕реЗ рдЬреЛрдбрд╝рддрд╛ рд╣реИред рдЕрдм рдЙрд╕реА рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рдирд┐рдореНрди рд╡рд┐рдзрд┐рдпрд╛рдБ рдЬреЛрдбрд╝реЗрдВ:

 - (void) setLayerFrames { _trackLayer.frame = CGRectInset(self.bounds, 0, self.bounds.size.height / 3.5); [_trackLayer setNeedsDisplay]; _knobWidth = self.bounds.size.height; _useableTrackLength = self.bounds.size.width - _knobWidth; float upperKnobCentre = [self positionForValue:_upperValue]; _upperKnobLayer.frame = CGRectMake(upperKnobCentre - _knobWidth / 2, 0, _knobWidth, _knobWidth); float lowerKnobCentre = [self positionForValue:_lowerValue]; _lowerKnobLayer.frame = CGRectMake(lowerKnobCentre - _knobWidth / 2, 0, _knobWidth, _knobWidth); [_upperKnobLayer setNeedsDisplay]; [_lowerKnobLayer setNeedsDisplay]; } - (float) positionForValue:(float)value { return _useableTrackLength * (value - _minimumValue) / (_maximumValue - _minimumValue) + (_knobWidth / 2); } 

setLayerFrames рд╕реНрд▓рд╛рдЗрдбрд░ рдХреЗ рд╡рд░реНрддрдорд╛рди рдореВрд▓реНрдпреЛрдВ рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рд╕реНрд▓рд╛рдЗрдбрд░реНрд╕ рдФрд░ рдкреНрд░рдЧрддрд┐ рдмрд╛рд░ рджреЛрдиреЛрдВ рдХреЗ рд▓рд┐рдП рдЖрдХрд╛рд░ рд╕реЗрдЯ рдХрд░рддрд╛ рд╣реИред positionForValue рдШрдЯрдХ рдХреЗ рдЕрдзрд┐рдХрддрдо рдФрд░ рдиреНрдпреВрдирддрдо рдореВрд▓реНрдпреЛрдВ рдХреЗ рдмреАрдЪ рдХреА рджреВрд░реА рдХреЛ рдорд╛рдкрдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рд╕рд░рд▓ рдЕрдиреБрдкрд╛рдд рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ, рд╕реНрдХреНрд░реАрди рдХреЗ рдирд┐рд░реНрджреЗрд╢рд╛рдВрдХ рдХреЗ рд▓рд┐рдП рдорд╛рди рдХреЛ рдмрд╛рдВрдзрддрд╛ рд╣реИред

рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЛ рд╕рдВрдХрд▓рд┐рдд рдХрд░реЗрдВ рдФрд░ рдЪрд▓рд╛рдПрдВред рдЖрдкрдХрд╛ рд╕реНрд▓рд╛рдЗрдбрд░ рдЖрдХрд╛рд░ рд▓реЗрдирд╛ рд╢реБрд░реВ рдХрд░ рджреЗрддрд╛ рд╣реИ! рдпрд╣ рдХреБрдЫ рдЗрд╕ рддрд░рд╣ рджрд┐рдЦрдирд╛ рдЪрд╛рд╣рд┐рдП:

рдЫрд╡рд┐

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

рдЕрдиреНрддрд░рдХреНрд░рд┐рдпрд╛рд╢реАрд▓рддрд╛ рдШрдЯрдХ рдЬреЛрдбрд╝реЗрдВ


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

CERangeSlider рдЧреНрд░реБрдк рдореЗрдВ рдПрдХ рдирдИ рдлрд╝рд╛рдЗрд▓ рдЬреЛрдбрд╝реЗрдВ: New File -> iOS -> рдХреЛрдХреЛрдЖ рдЯрдЪ -> рдСрдмреНрдЬреЗрдХреНрдЯрд┐рд╡-рд╕реА рдХреНрд▓рд╛рд╕ , рдЗрд╕реЗ рдХреИрд▓реЗрдпрд░ рдХрд╛ рдЙрдкрд╡рд░реНрдЧ рдмрдирд╛рддреЗ рд╣реИрдВ рдФрд░ рдЗрд╕реЗ CERangeSliderKnobLayer рдирд╛рдо рджреЗрддреЗ рд╣реИрдВ ред

рдирдП рдмрдиреЗ CERangeSliderKnobLayer.h рдХреЛ рдЦреЛрд▓реЗрдВ рдФрд░ рдЗрд╕рдХреА рд╕рд╛рдордЧреНрд░реА рдХреЛ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдХреЗ рд╕рд╛рде рдмрджрд▓реЗрдВ:

 #import <QuartzCore/QuartzCore.h> @class CERangeSlider; @interface CERangeSliderKnobLayer : CALayer @property BOOL highlighted; @property (weak) CERangeSlider* slider; @end 

рдпрд╣ рдХреЛрдб рджреЛ рдЧреБрдгреЛрдВ рдХреЛ рдЬреЛрдбрд╝рддрд╛ рд╣реИ, рдЬрд┐рдирдореЗрдВ рд╕реЗ рдПрдХ рдЗрдВрдЧрд┐рдд рдХрд░рддрд╛ рд╣реИ рдХрд┐ рд╕реНрд▓рд╛рдЗрдбрд░ рд╣рд╛рдЗрд▓рд╛рдЗрдЯ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдФрд░ рджреВрд╕рд░рд╛ рдорд╛рддрд╛-рдкрд┐рддрд╛ рд╕реНрд▓рд╛рдЗрдбрд░ рдХреЛ рдЗрдВрдЧрд┐рдд рдХрд░рддрд╛ рд╣реИред рдЕрдм CERangeSliderKnobLayer.m рдЦреЛрд▓реЗрдВ рдФрд░ #import рдЬреЛрдбрд╝реЗрдВ:

 #import "CERangeSliderKnobLayer.h" 


рдЗрд╕рдХреЗ рдмрд╛рдж _lowerKnobLayer @implementation рдмреНрд▓реЙрдХ рдореЗрдВ _upperKnobLayer рдФрд░ _lowerKnobLayer рдХрд╛ рдкреНрд░рдХрд╛рд░ рдмрджрд▓реЗрдВ:

 CERangeSliderKnobLayer* _upperKnobLayer; CERangeSliderKnobLayer* _lowerKnobLayer; 

рдпреЗ рдкрд░рддреЗрдВ рдЕрдм рдирдП рдмрдиреЗ CERangeSliderKnobLayer рдХреНрд▓рд╛рд╕ рдХреА рд╡рд╕реНрддреБрдПрдВ рд╣реИрдВ ред

рдЙрд╕реА CERangeSlider.m рдореЗрдВ initWithFrame: рдвреВрдВрдвреЗрдВ initWithFrame: рдФрд░ рдХреЛрдб рдХреЛрдб рдХреЛ upperKnobLayer рдФрд░ lowerKnobLayer рдХреЛ рдирд┐рдореНрди рдХреЛрдб рдмреНрд▓реЙрдХ рдХреЗ рд╕рд╛рде lowerKnobLayer :

 _upperKnobLayer = [CERangeSliderKnobLayer layer]; _upperKnobLayer.slider = self; _upperKnobLayer.backgroundColor = [UIColor greenColor].CGColor; [self.layer addSublayer:_upperKnobLayer]; _lowerKnobLayer = [CERangeSliderKnobLayer layer]; _lowerKnobLayer.slider = self; _lowerKnobLayer.backgroundColor = [UIColor greenColor].CGColor; [self.layer addSublayer:_lowerKnobLayer]; 

рдпрд╣ рдХреЛрдб рдЙрди рдкрд░рддреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╣рдорд╛рд░реЗ рджреНрд╡рд╛рд░рд╛ рдмрдирд╛рдИ рдЧрдИ рдХрдХреНрд╖рд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ рдФрд░ рдЙрдирдХреА slider рд╕рдВрдкрддреНрддрд┐ рдХреЛ self рд╕реЗрдЯ рдХрд░рддрд╛ рд╣реИред рдЕрдкрдиреЗ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдХреЛ рдЪрд▓рд╛рдПрдВ рдФрд░ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░реЗрдВ рдХрд┐ рд╕рдм рдХреБрдЫ рд╕реНрдХреНрд░реАрдирд╢реЙрдЯ рдХреЗ рд╕рдорд╛рди рд╣реИ:

рдЫрд╡рд┐

рдЕрдм рдЬрдм рдЖрдкрдХреА рдкрд░рддреЗрдВ рдЬрдЧрд╣ рдореЗрдВ рд╣реИрдВ, рддреЛ рдЖрдкрдХреЛ рд╕реНрд▓рд╛рдЗрдбрд░реНрд╕ рдХреЛ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░рдиреЗ рдХреА рдХреНрд╖рдорддрд╛ рдХрд╛ рдПрд╣рд╕рд╛рд╕ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред

рдХреНрд▓рд┐рдХ рд╣реИрдВрдбрд▓рд░реНрд╕ рдЬреЛрдбрд╝реЗрдВ


CERangeSlider.m рдЦреЛрд▓реЗрдВ рдФрд░ рдЪрд░ рдШреЛрд╖рдгрд╛ рдмреНрд▓реЙрдХ рдХреЗ рддрд╣рдд рдирд┐рдореНрди рдХреЛрдб рдЬреЛрдбрд╝реЗрдВ:

 CGPoint _previousTouchPoint; 

рдЗрд╕ рдЪрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХреНрд▓рд┐рдХ рдирд┐рд░реНрджреЗрд╢рд╛рдВрдХ рдХреЛ рдЯреНрд░реИрдХ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред рдЖрдк рдЕрдкрдиреЗ рдШрдЯрдХ рдХреЗ рд▓рд┐рдП рд╡рд┐рднрд┐рдиреНрди рдХреНрд▓рд┐рдХ рдФрд░ рд░рд┐рд▓реАрдЬрд╝ рдЗрд╡реЗрдВрдЯ рдЯреНрд░реИрдХ рдХрд░рдиреЗ рдХреА рдпреЛрдЬрдирд╛ рдХреИрд╕реЗ рдмрдирд╛рддреЗ рд╣реИрдВ?

UIControl рдЯреНрд░реИрдХрд┐рдВрдЧ рдХреНрд▓рд┐рдХ рдХреЗ рд▓рд┐рдП рдХрдИ рддрд░реАрдХреЗ рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИред UIControl UIControl рдЕрдкрдиреЗ рд╕реНрд╡рдпрдВ рдХреЗ рддрд░реНрдХ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЗрди рд╡рд┐рдзрд┐рдпреЛрдВ рдХреЛ рдУрд╡рд░рд░рд╛рдЗрдб рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдЖрдкрдХреЗ рдирд┐рдпрдВрддреНрд░рдг рдореЗрдВ, рдЖрдк рдирд┐рдореНрди рддреАрди рд╡рд┐рдзрд┐рдпреЛрдВ рдХреЛ рдУрд╡рд░рд░рд╛рдЗрдб рдХрд░рддреЗ рд╣реИрдВ: beginTrackingWithTouch , beginTrackingWithTouch continueTrackingWithTouch рдФрд░ endTrackingWithTouch ред

CERangeSlider.m рдХреЗ рд▓рд┐рдП рдирд┐рдореНрди рд╡рд┐рдзрд┐ рдЬреЛрдбрд╝реЗрдВ:

 - (BOOL)beginTrackingWithTouch:(UITouch *)touch withEvent:(UIEvent *)event { _previousTouchPoint = [touch locationInView:self]; // hit test the knob layers if(CGRectContainsPoint(_lowerKnobLayer.frame, _previousTouchPoint)) { _lowerKnobLayer.highlighted = YES; [_lowerKnobLayer setNeedsDisplay]; } else if(CGRectContainsPoint(_upperKnobLayer.frame, _previousTouchPoint)) { _upperKnobLayer.highlighted = YES; [_upperKnobLayer setNeedsDisplay]; } return _upperKnobLayer.highlighted || _lowerKnobLayer.highlighted; } 

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

рд╕реНрд▓рд╛рдЗрдбрд░реНрд╕ рдореЗрдВ рд╕реЗ рдХрд┐рд╕реА рдПрдХ рдХреЛ рд╣рд╛рдЗрд▓рд╛рдЗрдЯ рдХрд┐рдП рдЬрд╛рдиреЗ рдкрд░ рдХреНрд▓рд┐рдХ рдЯреНрд░реИрдХрд┐рдВрдЧ рдЬрд╛рд░реА рд░рд╣рддреА рд╣реИред setNeedsDisplay рд╡рд┐рдзрд┐ рдХреЛ рдХреЙрд▓ рдХрд░рдирд╛ setNeedsDisplay рдпрд╣ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ рдХрд┐ рдкрд░рддреЛрдВ рдХреЛ рдЕрдкрдбреЗрдЯ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ - рдлрд┐рд░ рдЖрдк рд╕рдордЭреЗрдВрдЧреЗ рдХрд┐ рдпрд╣ рдХреНрдпреЛрдВ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИред

рдЕрдм рдЬрдм рдЖрдкрдХреЗ рдкрд╛рд╕ рдкрд╣рд▓рд╛-рдХреНрд▓рд┐рдХ рд╣реИрдВрдбрд▓рд░ рд╣реИ, рддреЛ рдЖрдкрдХреЛ рдШрдЯрдирд╛рдУрдВ рдХреЛ рд╕рдВрднрд╛рд▓рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рдЬрдм рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреА рдЙрдВрдЧрд▓реА рд╕реНрдХреНрд░реАрди рдХреЗ рдЪрд╛рд░реЛрдВ рдУрд░ рдШреВрдорддреА рд╣реИред CERangeSlider.m рдХреЗ рд▓рд┐рдП рдирд┐рдореНрди рд╡рд┐рдзрд┐ рдЬреЛрдбрд╝реЗрдВ:

 #define BOUND(VALUE, UPPER, LOWER) MIN(MAX(VALUE, LOWER), UPPER) - (BOOL)continueTrackingWithTouch:(UITouch *)touch withEvent:(UIEvent *)event { CGPoint touchPoint = [touch locationInView:self]; // 1. determine by how much the user has dragged float delta = touchPoint.x - _previousTouchPoint.x; float valueDelta = (_maximumValue - _minimumValue) * delta / _useableTrackLength; _previousTouchPoint = touchPoint; // 2. update the values if (_lowerKnobLayer.highlighted) { _lowerValue += valueDelta; _lowerValue = BOUND(_lowerValue, _upperValue, _minimumValue); } if (_upperKnobLayer.highlighted) { _upperValue += valueDelta; _upperValue = BOUND(_upperValue, _maximumValue, _lowerValue); } // 3. Update the UI state [CATransaction begin]; [CATransaction setDisableActions:YES] ; [self setLayerFrames]; [CATransaction commit]; return YES; } 

рдЖрдЗрдП рдЗрд╕ рдХреЛрдб рдХрд╛ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдХрд░реЗрдВ, рдЯрд┐рдкреНрдкрдгреА рджреНрд╡рд╛рд░рд╛ рдЯрд┐рдкреНрдкрдгреА рдХрд░реЗрдВ:

  1. рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рдЖрдк delta рдЧрдгрдирд╛ рдХрд░рддреЗ рд╣реИрдВ - рдкрд┐рдХреНрд╕рд▓ рдХреА рд╕рдВрдЦреНрдпрд╛ рдЬрд┐рд╕рдХреЗ рджреНрд╡рд╛рд░рд╛ рдЙрдВрдЧрд▓реА рдХреЛ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред рдлрд┐рд░ рдЖрдк рдШрдЯрдХ рдХреЗ рдиреНрдпреВрдирддрдо рдФрд░ рдЕрдзрд┐рдХрддрдо рдореВрд▓реНрдпреЛрдВ рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдЙрдиреНрд╣реЗрдВ рдкрд░рд┐рд╡рд░реНрддрд┐рдд рдХрд░рддреЗ рд╣реИрдВред
  2. рдпрд╣рд╛рдВ рдЖрдк рдКрдкрд░реА рдФрд░ рдирд┐рдЪрд▓реЗ рд╕реАрдорд╛ рдХреЛ рдмрджрд▓рддреЗ рд╣реИрдВ, рдЬрд╣рд╛рдВ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рд╕реНрд▓рд╛рдЗрдбрд░ рдХреЛ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░рддрд╛ рд╣реИред рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ рдЖрдк BOUND рдореИрдХреНрд░реЛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣реЗ рд╣реИрдВ, рдЬреЛ MIN/MAX рд╕реЗ рдЕрдзрд┐рдХ рдкрдардиреАрдп рд╣реИред
  3. рдХреЛрдб рдХрд╛ рдпрд╣ рдмреНрд▓реЙрдХ CATransaction рдзреНрд╡рдЬ рдХреЛ CATransaction рд╕реЗрдЯ рдХрд░рддрд╛ рд╣реИред рдпрд╣ рдЖрдкрдХреЛ рдпрд╣ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ рдХрд┐ рдкреНрд░рддреНрдпреЗрдХ рдкрд░рдд рдХреА рд╕реАрдорд╛рдУрдВ рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрди рддреБрд░рдВрдд рд▓рд╛рдЧреВ рд╣реЛрддреЗ рд╣реИрдВ рдФрд░ рдПрдирд┐рдореЗрдЯреЗрдб рдирд╣реАрдВ рд╣реЛрддреЗ рд╣реИрдВред рдЕрдВрдд рдореЗрдВ, setLayerFrames рд╡рд┐рдзрд┐ рдХреЛ setLayerFrames , рд╕реНрд▓рд╛рдЗрдбрд░ рдХреЛ рд╡рд╛рдВрдЫрд┐рдд рд╕реНрдерд╛рди рдкрд░ рд▓реЗ рдЬрд╛рдирд╛ред


рдЖрдкрдиреЗ рд╕реНрд▓рд╛рдЗрдбрд░ рдХреЗ рдЖрдВрджреЛрд▓рди рдХреЛ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рд╣реИ - рд▓реЗрдХрд┐рди рдЖрдкрдХреЛ рдЕрднреА рднреА рдШрдЯрдХ рдХреЗ рд╕рд╛рде рдмрд╛рддрдЪреАрдд рдХреЗ рдЕрдВрдд рдХреЛ рд╕рдВрднрд╛рд▓рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред CERangeSlider.m рдХреЗ рд▓рд┐рдП рдирд┐рдореНрди рд╡рд┐рдзрд┐ рдЬреЛрдбрд╝реЗрдВ:

 - (void)endTrackingWithTouch:(UITouch *)touch withEvent:(UIEvent *)event { _lowerKnobLayer.highlighted = _upperKnobLayer.highlighted = NO; [_lowerKnobLayer setNeedsDisplay]; [_upperKnobLayer setNeedsDisplay]; } 

рдпрд╣ рдХреЛрдб рджреЛрдиреЛрдВ рд╕реНрд▓рд╛рдЗрдбрд░реНрд╕ рдХреЛ рдирд┐рд╖реНрдХреНрд░рд┐рдп рдЕрд╡рд╕реНрдерд╛ рдореЗрдВ рд▓реМрдЯрд╛рддрд╛ рд╣реИред рдЕрдкрдирд╛ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рд▓реЙрдиреНрдЪ рдХрд░реЗрдВ рдФрд░ рдЕрдкрдиреЗ рдирдП рд╕реНрд▓рд╛рдЗрдбрд░ рдХреЗ рд╕рд╛рде рдереЛрдбрд╝рд╛ рдЦреЗрд▓реЗрдВ! рдпрд╣ рд╕реНрдХреНрд░реАрдирд╢реЙрдЯ рдХреЗ рд╕рдорд╛рди рджрд┐рдЦрдирд╛ рдЪрд╛рд╣рд┐рдП:

рдЫрд╡рд┐

рдЖрдк рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдШрдЯрдХ рдХреА рд╕реАрдорд╛рдУрдВ рд╕реЗ рдкрд░реЗ рдЕрдкрдиреА рдЙрдВрдЧрд▓реА рдХреЛ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░рдирд╛ рд╕рдВрднрд╡ рд╣реИ, рдФрд░ рдлрд┐рд░ рд╡рд┐рдзрд┐ рдХреЗ рдирд┐рд╖реНрдкрд╛рджрди рдХреЛ рдмрд╛рдзрд┐рдд рдХрд┐рдП рдмрд┐рдирд╛ рдЕрдкрдиреА рд╕реАрдорд╛рдУрдВ рдкрд░ рд╡рд╛рдкрд╕ рд▓реМрдЯреЗрдВред рдпрд╣ рдХрдо рд╕рдЯреАрдХрддрд╛ рдХреЗ рд╕рд╛рде рдЫреЛрдЯреЗ рд╕реНрдХреНрд░реАрди рдФрд░ рд╕реНрдЯрд╛рдЗрд▓рд╕ рд╡рд╛рд▓реЗ рдЙрдкрдХрд░рдгреЛрдВ рдХреА рдЙрдкрдпреЛрдЧрд┐рддрд╛ рдХреА рдПрдХ рдмрд╣реБрдд рд╣реА рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╡рд┐рд╢реЗрд╖рддрд╛ рд╣реИ (рдпрджрд┐ рдЖрдк рдирд╣реАрдВ рд╕рдордЭрддреЗ рд╣реИрдВ, рддреЛ рд╣рдо рдЙрдВрдЧрд▓рд┐рдпреЛрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╛рдд рдХрд░ рд░рд╣реЗ рд╣реИрдВ)ред :]

рд╕реВрдЪрдирд╛рдПрдВ рдмрджрд▓реЗрдВ


рддреЛ, рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдПрдХ рдЗрдВрдЯрд░реИрдХреНрдЯрд┐рд╡ рдирд┐рдпрдВрддреНрд░рдг рд╣реИ рдЬрд┐рд╕рдХреЗ рд╕рд╛рде рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рд╕реАрдорд╛ рдХреА рдКрдкрд░реА рдФрд░ рдирд┐рдЪрд▓реА рд╕реАрдорд╛ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░ рд╕рдХрддрд╛ рд╣реИред рд▓реЗрдХрд┐рди рдЗрди рдкрд░рд┐рд╡рд░реНрддрдиреЛрдВ рдХреЛ рдмрд╛рдХреА рдХреЛрдб рд╕реЗ рдХреИрд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдП рддрд╛рдХрд┐ рдЙрдирдХрд╛ рдЙрдкрдпреЛрдЧ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рджреНрд╡рд╛рд░рд╛ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХреЗ? рдХрдИ рдЕрд▓рдЧ-рдЕрд▓рдЧ рд╡рд┐рдХрд▓реНрдк рд╣реИрдВ рдЬрд┐рдирдХрд╛ рдЙрдкрдпреЛрдЧ рдкрд░рд┐рд╡рд░реНрддрдиреЛрдВ рдХреА рдЕрдзрд┐рд╕реВрдЪрдирд╛ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ: NSNotification , рдХреБрдВрдЬреА-рдореВрд▓реНрдп-рдЕрд╡рд▓реЛрдХрди (KVO) , рдкреНрд░рддрд┐рдирд┐рдзрд┐рдордВрдбрд▓ рдЯреЗрдореНрдкрд▓реЗрдЯ, рд▓рдХреНрд╖реНрдп-рдХрд╛рд░реНрд░рд╡рд╛рдИ рдЯреЗрдореНрдкрд▓реЗрдЯ рдФрд░ рдЕрдиреНрдпред

рдпрджрд┐ рдЖрдк UIKit рдХреЗ рдШрдЯрдХреЛрдВ рдХреЛ рджреЗрдЦрддреЗ рд╣реИрдВ, рддреЛ рдЖрдк рджреЗрдЦреЗрдВрдЧреЗ рдХрд┐ рд╡реЗ NSNotification рдпрд╛ KVO рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП UIKit рдХреЗ рд╕рд╛рде рд╕рдВрдЧрддрддрд╛ рдХреЗ рд▓рд┐рдП рд╣рдореЗрдВ рдЗрди рджреЛ рд╡рд┐рдХрд▓реНрдкреЛрдВ рдХреЛ рдЫреЛрдбрд╝ рджреЗрдирд╛ рдЪрд╛рд╣рд┐рдПред UIKit рдореЗрдВ рджреЛ рдЕрдиреНрдп рдЯреЗрдореНрдкреНрд▓реЗрдЯ - рдбреЗрд▓рд┐рдЧреЗрд╢рди рдФрд░ рдЯрд╛рд░рдЧреЗрдЯ-рдПрдХреНрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдЕрдХреНрд╕рд░ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ UIKit ред

рдореИрдВ рджреЛрдиреЛрдВ рдкреИрдЯрд░реНрди рдХрд╛ рд╡рд┐рд╕реНрддреГрдд рд╡рд┐рд╢реНрд▓реЗрд╖рдг рджреВрдВрдЧрд╛:



рджреЛ рдкреИрдЯрд░реНрди рдХреЗ рдмреАрдЪ рдореБрдЦреНрдп рдЕрдВрддрд░ рдирд┐рдореНрдирд╛рдиреБрд╕рд╛рд░ рд╣реИрдВ:


рдЖрдкрдХреЗ рдШрдЯрдХ рдореЗрдВ рдХрдИ рд╕рдВрднрд╛рд╡рд┐рдд рд╕реНрдерд┐рддрд┐ рдпрд╛ рд╕рдВрднрд╛рд╡рд┐рдд рдШрдЯрдирд╛рдПрдБ рдирд╣реАрдВ рд╣реИрдВ рдЬрд┐рдиреНрд╣реЗрдВ рдЕрдзрд┐рд╕реВрдЪрд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдХреЗрд╡рд▓ рдПрдХ рдЪреАрдЬ рдЬреЛ рдПрдХ рднреВрдорд┐рдХрд╛ рдирд┐рднрд╛рддреА рд╣реИ рд╡рд╣ рд╕реНрд▓рд╛рдЗрдбрд░ рдХрд╛ рдЕрдзрд┐рдХрддрдо рдФрд░ рдиреНрдпреВрдирддрдо рдорд╛рди рд╣реИред

рдЗрд╕ рд╕реНрдерд┐рддрд┐ рдореЗрдВ, рдЯрд╛рд░рдЧреЗрдЯ-рдПрдХреНрд╢рди рдЯреЗрдореНрдкрд▓реЗрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рд╕рдмрд╕реЗ рдЕрдзрд┐рдХ рдЙрдЪрд┐рдд рд╣реИред рдпрд╣ рдЙрди рдХрд╛рд░рдгреЛрдВ рдореЗрдВ рд╕реЗ рдПрдХ рд╣реИ, рдЬреЛ рд╣рдореЗрдВ UIControlрдкрд╛рда рдХреА рд╢реБрд░реБрдЖрдд рдореЗрдВ рд╡рд┐рд░рд╛рд╕рдд рдореЗрдВ рдорд┐рд▓реЗ рд╣реИрдВ ред

рд╕реНрд▓рд╛рдЗрдбрд░ рд░реАрдбрд┐рдВрдЧ рд╡рд┐рдзрд┐ рдХреЗ рдЕрдВрджрд░ рдЕрдкрдбреЗрдЯ рдХрд┐рдП рдЬрд╛рддреЗ рд╣реИрдВ continueTrackingWithTouch:withEvent:, рдЗрд╕рд▓рд┐рдП рдпрд╣ рд╡рд╣ рдЬрдЧрд╣ рд╣реИ рдЬрд╣рд╛рдВ рдЖрдкрдХреЛ рдЕрдзрд┐рд╕реВрдЪрдирд╛ рддрдВрддреНрд░ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИред CERangeSlider.m рдЦреЛрд▓реЗрдВ , рд╡рд┐рдзрд┐ рдЦреЛрдЬреЗрдВ continueTrackingWithTouch:withEventрдФрд░ рдкрд╣рд▓реЗ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдХреЛрдб рдЬреЛрдбрд╝реЗрдВ return YES:

 [self sendActionsForControlEvents:UIControlEventValueChanged]; 

рдкрд░рд┐рд╡рд░реНрддрдиреЛрдВ рдХреЗ рдЖрд╡рд╢реНрдпрдХ рд▓рдХреНрд╖реНрдпреЛрдВ рдХреЛ рд╕реВрдЪрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдпрд╣ рд╕рдм рдЖрд╡рд╢реНрдпрдХ рд╣реИред рдЦреИрд░, рдпрд╣ рдЙрдореНрдореАрдж рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдЖрд╕рд╛рди рдерд╛! CEViewController.m

рдЦреЛрд▓реЗрдВ рдФрд░ рд╡рд┐рдзрд┐ рдХреЗ рдЕрдВрдд рдореЗрдВ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдХреЛрдб рдЬреЛрдбрд╝реЗрдВ :viewDidLoad

 [_rangeSlider addTarget:self action:@selector(slideValueChanged:) forControlEvents:UIControlEventValueChanged]; 

рдпрд╣ рдХреЛрдб slideValueChangedрд╕реНрд▓рд╛рдЗрдбрд░ рдХреЛ рдИрд╡реЗрдВрдЯ рднреЗрдЬрдиреЗ рдХреЗ рд▓рд┐рдП рд╣рд░ рдмрд╛рд░ рд╡рд┐рдзрд┐ рдЪрд▓рд╛рддрд╛ рд╣реИ UIControlEventValueChangedред

рдЕрдм CEViewController.m рдХреЗ рд▓рд┐рдП рдирд┐рдореНрди рд╡рд┐рдзрд┐ рдЬреЛрдбрд╝реЗрдВ :

 - (void)slideValueChanged:(id)control { NSLog(@"Slider value changed: (%.2f,%.2f)", _rangeSlider.lowerValue, _rangeSlider.upperValue); } 

рдпрд╣ рд╡рд┐рдзрд┐ рд╕реНрд▓рд╛рдЗрдбрд░ рдХреЗ рд╕рднреА рдореВрд▓реНрдпреЛрдВ рдХреЛ рдПрдХ рд╕рдмреВрдд рдХреЗ рд░реВрдк рдореЗрдВ рд▓реЙрдЧ рдХреЛ рднреЗрдЬрддреА рд╣реИ рдХрд┐ рд╕рдм рдХреБрдЫ рдЙрд╕реА рддрд░рд╣ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ рдЬреИрд╕рд╛ рдХрд┐ рдЗрд╕реЗ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред рдПрдкреНрд▓рд┐рдХреЗрд╢рди рд▓реЙрдиреНрдЪ рдХрд░реЗрдВ рдФрд░ рд╕реНрд▓рд╛рдЗрдбрд░ рдХреЗ рд╕реНрд▓рд╛рдЗрдбрд░реНрд╕ рдХреЛ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░реЗрдВред рдЖрдк рд▓реЙрдЧ рдореЗрдВ рдкреНрд░рджрд░реНрд╢рд┐рдд рдЙрдирдХреЗ рдирд┐рд░реНрджреЗрд╢рд╛рдВрдХ рдХреЗ рдореВрд▓реНрдпреЛрдВ рдХреЛ рджреЗрдЦреЗрдВрдЧреЗ:

рдЫрд╡рд┐

рдЖрдк рд╢рд╛рдпрдж рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рд░рдВрдЧреАрди рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рд╕реЗ рдердХ рдЧрдП рд╣реИрдВ рдЬреЛ рдПрдХ рднрдпрд╛рдирдХ рдлрд▓ рд╕рд▓рд╛рдж рдХреА рддрд░рд╣ рджрд┐рдЦрддрд╛ рд╣реИред рдпрд╣ рдШрдЯрдХ рдХреЛ рд╕рд╣реА рд░реВрдк рджреЗрдиреЗ рдХрд╛ рд╕рдордп рд╣реИ!

рдХреЛрд░ рдЧреНрд░рд╛рдлрд┐рдХреНрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рдПрдХ рдШрдЯрдХ рдХреА рдЙрдкрд╕реНрдерд┐рддрд┐ рдмрджрд▓реЗрдВ


рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рдЪрд▓реЛ рдкреНрд░рдЧрддрд┐ рдкрдЯреНрдЯреА рдХреА рдЙрдкрд╕реНрдерд┐рддрд┐ рдХреЛ рдЕрджреНрдпрддрди рдХрд░рддреЗ рд╣реИрдВ рдЬрд┐рд╕рдХреЗ рд╕рд╛рде рд╕реНрд▓рд╛рдЗрдбрд░реНрд╕ рдЪрд▓рддреЗ рд╣реИрдВред CERangeSlider рд╕рдореВрд╣ рдореЗрдВ , рдирдпрд╛ CERangeSliderTrackLayer рд╡рд░реНрдЧ рдЬреЛрдбрд╝реЗрдВ , рдЬреЛ CALayer рдХрд╛ рдЙрдкрд╡рд░реНрдЧ рд╣реИ ред CERangeSliderTrackLayer.h

рдЦреЛрд▓реЗрдВ рдФрд░ рдЗрд╕рдХреА рд╕рд╛рдордЧреНрд░реА рдХреЛ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдХреЗ рд╕рд╛рде рдмрджрд▓реЗрдВ:

 #import <QuartzCore/QuartzCore.h> @class CERangeSlider; @interface CERangeSliderTrackLayer : CALayer @property (weak) CERangeSlider* slider; @end 

рдпрд╣ рдХреЛрдб рд╕реНрд▓рд╛рдЗрдбрд░ рдХреЗ рд▓рд┐рдП рдПрдХ рд▓рд┐рдВрдХ рдЬреЛрдбрд╝рддрд╛ рд╣реИ рдЬреЛ рд╣рдордиреЗ рд╕реНрд▓рд╛рдЗрдбрд░ рдкрд░рдд рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдерд╛ред CERangeSlider.m рдЦреЛрд▓реЗрдВ рдФрд░ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдЬреЛрдбрд╝реЗрдВ #import:

 #import "CERangeSliderTrackLayer.h" 

рдиреАрдЪреЗ рджрд┐рдП рдЧрдП рд╡реИрд░рд┐рдПрдмрд▓ рдХреЛ рдвреВрдВрдвреЗрдВ _trackLayerрдФрд░ рдЗрд╕рдХреЗ рдкреНрд░рдХрд╛рд░ рдХреЛ рдЕрдкрдиреЗ рджреНрд╡рд╛рд░рд╛ рдмрдирд╛рдИ рдЧрдИ рдХрдХреНрд╖рд╛ рдореЗрдВ рдмрджрд▓реЗрдВ:

 CERangeSliderTrackLayer* _trackLayer; 

рдЕрдм рд╡рд┐рдзрд┐ рдвреВрдВрдвреЗрдВ initWithFrame:рдФрд░ рдкрд░рдд рдирд┐рд░реНрдорд╛рдг рдХреЛрдб рдХреЛ рдЕрдкрдбреЗрдЯ рдХрд░реЗрдВ:

 _trackLayer = [CERangeSliderTrackLayer layer]; _trackLayer.slider = self; [self.layer addSublayer:_trackLayer]; _upperKnobLayer = [CERangeSliderKnobLayer layer]; _upperKnobLayer.slider = self; [self.layer addSublayer:_upperKnobLayer]; _lowerKnobLayer = [CERangeSliderKnobLayer layer]; _lowerKnobLayer.slider = self; [self.layer addSublayer:_lowerKnobLayer]; 

рдпрд╣ рдХреЛрдб рдЖрдкрдХреЛ рдпрд╣ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ рдХрд┐ рдПрдХ рдирдИ рдкрдЯреНрдЯреА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдФрд░ vyrviglazny рд░рдВрдЧ рдЕрдм рдкреГрд╖реНрдарднреВрдорд┐ рдкрд░ рд▓рд╛рдЧреВ рдирд╣реАрдВ рд╣реЛрддреЗ рд╣реИрдВред :] рдпрд╣

рдереЛрдбрд╝рд╛ рдФрд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд░рд╣рддрд╛ рд╣реИ - рдШрдЯрдХ рд╕реЗ рд▓рд╛рд▓ рдкреГрд╖реНрдарднреВрдорд┐ рдХреЛ рд╣рдЯрд╛ рджреЗрдВред CEViewController.m рдЦреЛрд▓реЗрдВ , рд╡рд┐рдзрд┐ рдХреА рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдкрдВрдХреНрддрд┐ рдХреЛ рд╡рд┐рдзрд┐ рдореЗрдВ рдЦреЛрдЬреЗрдВ viewDidLoadрдФрд░ рдЗрд╕реЗ рдорд┐рдЯрд╛ рджреЗрдВ:

 _rangeSlider.backgroundColor = [UIColor redColor]; 

рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдмрдирд╛рдПрдВ рдФрд░ рдЪрд▓рд╛рдПрдВ ... рдЖрдк рдХреНрдпрд╛ рджреЗрдЦрддреЗ рд╣реИрдВ?

рдЫрд╡рд┐

рдХреБрдЫ рднреА рдирд╣реАрдВ рд╣реИ? рдпрд╣ рдмрд╣реБрдд рдЕрдЪреНрдЫрд╛ рд╣реИ!

рдЖрдк рдкреВрдЫрддреЗ рд╣реИрдВ - рдЗрд╕рдореЗрдВ рдЗрддрдиреА рдмрдбрд╝реА рдмрд╛рдд рдХреНрдпрд╛ рд╣реИ? рдореЗрд╣рдирдд рдХрд╛ рд╕рд╛рд░рд╛ рдлрд▓ рдЧрдпрд╛! рдЪреМрдХрдиреНрдиреЗ рдордд рдмрдиреЛ - рддреБрдордиреЗ рд╕рд┐рд░реНрдл рдЙрди рдЪрдордХреАрд▓реЗ рд░рдВрдЧреЛрдВ рдХреЛ рд╣рдЯрд╛ рджрд┐рдпрд╛ рдЬреЛ рдЗрд╕реНрддреЗрдорд╛рд▓ рдХреА рдЧрдИ рдкрд░рддреЛрдВ рдкрд░ рд▓рд╛рдЧреВ рд╣реЛрддреЗ рдереЗред рдЖрдкрдХрд╛ рдШрдЯрдХ рдЕрднреА рднреА рдмрдирд╛ рд╣реБрдЖ рд╣реИ - рд▓реЗрдХрд┐рди рдЕрдм рдпрд╣ рдкрд╛рд░рджрд░реНрд╢реА рд╣реИред

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

 @property (nonatomic) UIColor* trackColour; @property (nonatomic) UIColor* trackHighlightColour; @property (nonatomic) UIColor* knobColour; @property (nonatomic) float curvaceousness; - (float) positionForValue:(float)value; 

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

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

 _trackHighlightColour = [UIColor colorWithRed:0.0 green:0.45 blue:0.94 alpha:1.0]; _trackColour = [UIColor colorWithWhite:0.9 alpha:1.0]; _knobColour = [UIColor whiteColor]; _curvaceousness = 1.0; _maximumValue = 10.0; _minimumValue = 0.0; 

рдЕрдм CERangeSliderTrackLayer.m рдЦреЛрд▓реЗрдВ рдФрд░ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдЬреЛрдбрд╝реЗрдВ #import:

 #import "CERangeSlider.h" 

рдпрд╣ рдкрд░рдд рдЙрд╕ рдкрдЯреНрдЯреА рдХреЛ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рддреА рд╣реИ рдЬрд┐рд╕ рдкрд░ рджреЛрдиреЛрдВ рд╕реНрд▓рд╛рдЗрдбрд░реНрд╕ рд╕реНрдерд┐рдд рд╣реИрдВред рдлрд┐рд▓рд╣рд╛рд▓, рдпрд╣ рдПрдХ рд╡рд░реНрдЧ рдХреЛ рд╡рд┐рд░рд╛рд╕рдд рдореЗрдВ рдорд┐рд▓рд╛ рд╣реИ CALayerрдЬреЛ рдХреЗрд╡рд▓ рдареЛрд╕ рд░рдВрдЧ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рд╕рдВрднрд╡ рдмрдирд╛рддрд╛ рд╣реИред

рдкрдЯреНрдЯреА рдХреЛ рд╕рд╣реА рдврдВрдЧ рд╕реЗ рдЦреАрдВрдЪрдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ рд╡рд┐рдзрд┐ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ drawInContext:рдФрд░ рдкреНрд░рддрд┐рдкрд╛рджрди рдХреЗ рд▓рд┐рдП рдХреЛрд░рдЧреНрд░рд╛рдлрд┐рдХреНрд╕ рдПрдкреАрдЖрдИ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ ред

рдиреЛрдЯ: рдпрджрд┐ рдЖрдк рдХреЛрд░ рдЧреНрд░рд╛рдлрд┐рдХреНрд╕ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЕрдзрд┐рдХ рдЬрд╛рдирдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рддреЛ рдХреЛрд░ рдЧреНрд░рд╛рдлрд┐рдХреНрд╕ 101 рдЯреНрдпреВрдЯреЛрд░рд┐рдпрд▓ рд╢реНрд░реГрдВрдЦрд▓рд╛ рдкрд╛рдареНрдпрдХреНрд░рдо рдХреА рд╕рд┐рдлрд╛рд░рд┐рд╢ рдХреА рдЬрд╛рддреА рд╣реИ , рдХреНрдпреЛрдВрдХрд┐ рдХреЛрд░ рдЧреНрд░рд╛рдлрд┐рдХреНрд╕ рдХреА рд╡рд┐рд╕реНрддреГрдд рдЪрд░реНрдЪрд╛ рдЗрд╕ рдкрд╛рда рдХреЗ рджрд╛рдпрд░реЗ рд╕реЗ рдмрд╛рд╣рд░ рд╣реИред


рдХреЗ рд▓рд┐рдП рдирд┐рдореНрди рд╡рд┐рдзрд┐ рдЬреЛрдбрд╝реЗрдВ CERangeSliderTrackLayer.m рдХреЗ рддрд╣рдд @implementation:

 - (void)drawInContext:(CGContextRef)ctx { // clip float cornerRadius = self.bounds.size.height * self.slider.curvaceousness / 2.0; UIBezierPath *switchOutline = [UIBezierPath bezierPathWithRoundedRect:self.bounds cornerRadius:cornerRadius]; CGContextAddPath(ctx, switchOutline.CGPath); CGContextClip(ctx); // 1) fill the track CGContextSetFillColorWithColor(ctx, self.slider.trackColour.CGColor); CGContextAddPath(ctx, switchOutline.CGPath); CGContextFillPath(ctx); // 2) fill the highlighed range CGContextSetFillColorWithColor(ctx, self.slider.trackHighlightColour.CGColor); float lower = [self.slider positionForValue:self.slider.lowerValue]; float upper = [self.slider positionForValue:self.slider.upperValue]; CGContextFillRect(ctx, CGRectMake(lower, 0, upper - lower, self.bounds.size.height)); // 3) add a highlight over the track CGRect highlight = CGRectMake(cornerRadius/2, self.bounds.size.height/2, self.bounds.size.width - cornerRadius, self.bounds.size.height/2); UIBezierPath *highlightPath = [UIBezierPath bezierPathWithRoundedRect:highlight cornerRadius:highlight.size.height * self.slider.curvaceousness / 2.0]; CGContextAddPath(ctx, highlightPath.CGPath); CGContextSetFillColorWithColor(ctx, [UIColor colorWithWhite:1.0 alpha:0.4].CGColor); CGContextFillPath(ctx); // 4) inner shadow CGContextSetShadowWithColor(ctx, CGSizeMake(0, 2.0), 3.0, [UIColor grayColor].CGColor); CGContextAddPath(ctx, switchOutline.CGPath); CGContextSetStrokeColorWithColor(ctx, [UIColor grayColor].CGColor); CGContextStrokePath(ctx); // 5) outline the track CGContextAddPath(ctx, switchOutline.CGPath); CGContextSetStrokeColorWithColor(ctx, [UIColor blackColor].CGColor); CGContextSetLineWidth(ctx, 0.5); CGContextStrokePath(ctx); } 

рдЗрд╕ рдЫрд╡рд┐ рдореЗрдВ рдЖрдк рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдХреЛрдб рдХреЗ рд╕рднреА рдмреНрд▓реЙрдХ рд╕рдВрдпреБрдХреНрдд рдХреИрд╕реЗ рд╣реИрдВ, рдЯрд┐рдкреНрдкрдгрд┐рдпреЛрдВ рджреНрд╡рд╛рд░рд╛ рдЕрд▓рдЧ рдХрд┐рдП

рдЫрд╡рд┐

рдЧрдП рд╣реИрдВ: рдЧрд┐рдиреЗ рд╣реБрдП рдЕрдиреБрднрд╛рдЧ рдЧрд┐рдиреЗ рд╣реБрдП рдЯрд┐рдкреНрдкрдгрд┐рдпреЛрдВ рдХреЗ рдЕрдиреБрд░реВрдк рд╣реИрдВ:

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


рдЕрдм рдЬрдм рд╕рдм рдХреБрдЫ рдЕрд▓рдЧ-рдЕрд▓рдЧ рдЪрд░рдгреЛрдВ рдореЗрдВ рд▓рд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рддреЛ рдЖрдк рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ CERangeSlider рдХреЗ рд╡рд┐рднрд┐рдиреНрди рдЧреБрдг рдЗрд╕рдХреЗ рд╕реНрд╡рд░реВрдк рдХреЛ рдХреИрд╕реЗ рдкреНрд░рднрд╛рд╡рд┐рдд рдХрд░рддреЗ рд╣реИрдВред

рдРрдк рд▓реЙрдиреНрдЪ рдХрд░реЗрдВред рдпрд╣ рдЗрд╕ рддрд░рд╣ рджрд┐рдЦрдирд╛ рдЪрд╛рд╣рд┐рдП:

рдЫрд╡рд┐

рд╣рдорд╛рд░реЗ рджреНрд╡рд╛рд░рд╛ рджрд░реНрдЬ рдХрд┐рдП рдЧрдП рдЧреБрдгреЛрдВ рдХреЗ рдореВрд▓реНрдпреЛрдВ рдХреЗ рд╕рд╛рде рдЦреЗрд▓рддреЗ рд╣реИрдВ , рдпрд╣ рджреЗрдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐ рд╡реЗ рд╕реНрд▓рд╛рдЗрдбрд░ рдХреА рдЙрдкрд╕реНрдерд┐рддрд┐ рдХреЛ рдХреИрд╕реЗ рдкреНрд░рднрд╛рд╡рд┐рдд рдХрд░реЗрдВрдЧреЗред рдпрджрд┐ рдЖрдк рдЕрднреА рднреА рдЙрддреНрд╕реБрдХ рд╣реИрдВ рдХрд┐ рд╕рдВрдкрддреНрддрд┐ рдХреНрдпрд╛ рдХрд░ рд░рд╣реА рд╣реИ curvaceousness, рддреЛ рдЕрдм рдЗрд╕реЗ рдЖрдЬрд╝рдорд╛рдиреЗ рдХрд╛ рд╕рдордп рд╣реИ!

рд╕реНрд▓рд╛рдЗрдбрд░реНрд╕ рдЦреАрдВрдЪрдиреЗ рдХреЗ рд▓рд┐рдП рд╣рдо рдПрдХ рд╕рдорд╛рди рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВрдЧреЗред CERangeSliderKnobLayer.m рдЦреЛрд▓реЗрдВ рдФрд░ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдЬреЛрдбрд╝реЗрдВ #import:

 #import "CERangeSlider.h" 


рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рд╡рд┐рдзрд┐ рдЬреЛрдбрд╝реЗрдВ:

 - (void)drawInContext:(CGContextRef)ctx { CGRect knobFrame = CGRectInset(self.bounds, 2.0, 2.0); UIBezierPath *knobPath = [UIBezierPath bezierPathWithRoundedRect:knobFrame cornerRadius:knobFrame.size.height * self.slider.curvaceousness / 2.0]; // 1) fill - with a subtle shadow CGContextSetShadowWithColor(ctx, CGSizeMake(0, 1), 1.0, [UIColor grayColor].CGColor); CGContextSetFillColorWithColor(ctx, self.slider.knobColour.CGColor); CGContextAddPath(ctx, knobPath.CGPath); CGContextFillPath(ctx); // 2) outline CGContextSetStrokeColorWithColor(ctx, [UIColor grayColor].CGColor); CGContextSetLineWidth(ctx, 0.5); CGContextAddPath(ctx, knobPath.CGPath); CGContextStrokePath(ctx); // 3) inner gradient CGRect rect = CGRectInset(knobFrame, 2.0, 2.0); UIBezierPath *clipPath = [UIBezierPath bezierPathWithRoundedRect:rect cornerRadius:rect.size.height * self.slider.curvaceousness / 2.0]; CGGradientRef myGradient; CGColorSpaceRef myColorspace; size_t num_locations = 2; CGFloat locations[2] = { 0.0, 1.0 }; CGFloat components[8] = { 0.0, 0.0, 0.0 , 0.15, // Start color 0.0, 0.0, 0.0, 0.05 }; // End color myColorspace = CGColorSpaceCreateDeviceRGB(); myGradient = CGGradientCreateWithColorComponents (myColorspace, components, locations, num_locations); CGPoint startPoint = CGPointMake(CGRectGetMidX(rect), CGRectGetMinY(rect)); CGPoint endPoint = CGPointMake(CGRectGetMidX(rect), CGRectGetMaxY(rect)); CGContextSaveGState(ctx); CGContextAddPath(ctx, clipPath .CGPath); CGContextClip(ctx); CGContextDrawLinearGradient(ctx, myGradient, startPoint, endPoint, 0); CGGradientRelease(myGradient); CGColorSpaceRelease(myColorspace); CGContextRestoreGState(ctx); // 4) highlight if (self.highlighted) { // fill CGContextSetFillColorWithColor(ctx, [UIColor colorWithWhite:0.0 alpha:0.1].CGColor); CGContextAddPath(ctx, knobPath.CGPath); CGContextFillPath(ctx); } } 

рдлрд┐рд░, рд╣рдо рдЗрд╕ рдкрджреНрдзрддрд┐ рдХреЗ рдкрд░рд┐рдгрд╛рдореЛрдВ рдХрд╛ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдХрд░реЗрдВрдЧреЗ:

  1. рдЬреИрд╕реЗ рд╣реА рд╕реНрд▓рд╛рдЗрдбрд░реНрд╕ рдХрд╛ рдЖрдХрд╛рд░ рддреИрдпрд╛рд░ рд╣реЛрддрд╛ рд╣реИ, рдЙрдирдХреА рдкреГрд╖реНрдарднреВрдорд┐ рднрд░ рдЬрд╛рддреА рд╣реИред
  2. рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛ рд╕реНрд▓рд╛рдЗрдбрд░ рдХреА рд╕реАрдорд╛рдПрдБ рдЦреАрдВрдЪреА рдЧрдИ рд╣реИрдВред
  3. рдПрдХ рдкреНрд░рдХрд╛рд╢ рдврд╛рд▓ рдЬреЛрдбрд╝рд╛ рдЬрд╛рддрд╛ рд╣реИред
  4. рдФрд░ рдЖрдЦрд┐рд░реА - рдпрджрд┐ рд╕реНрд▓рд╛рдЗрдбрд░ рдХреЛ рд╣рд╛рдЗрд▓рд╛рдЗрдЯ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ - рдпрд╣ рдЙрд╕ рддрд░рд╣ рд╕реЗ рд░рд╣рддрд╛ рд╣реИ, рдЕрдЧрд░ рдЗрд╕реЗ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ - рдпрд╣ рдЧреНрд░реЗ рд╣реЛ рдЬрд╛рддрд╛ рд╣реИред


рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЛ рдлрд┐рд░ рд╕реЗ рдЪрд▓рд╛рдПрдБ:

рдЫрд╡рд┐

рдЖрдк рджреЗрдЦрддреЗ рд╣реИрдВ рдХрд┐ рдХреЛрд░ рдЧреНрд░рд╛рдлрд┐рдХреНрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдПрдХ рдШрдЯрдХ рдкреНрд░рджрд╛рди рдХрд░рдирд╛ рдкреНрд░рдпрд╛рд╕ рдХреЗ рд▓рд╛рдпрдХ рд╣реИред рдЗрд╕ рдврд╛рдВрдЪреЗ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рд╕реЗ рдЖрдк рдЧреНрд░рд╛рдлрд┐рдХ рд╕рдВрд╕рд╛рдзрдиреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдмрд╣реБрдд рдЕрдзрд┐рдХ рдЕрдиреБрдХреВрд▓рди рдпреЛрдЧреНрдп рдФрд░ рд▓рдЪреАрд▓рд╛ рдирд┐рдпрдВрддреНрд░рдг рдмрдирд╛ рд╕рдХрддреЗ рд╣реИрдВред

рдкреНрд░рд╕рдВрд╕реНрдХрд░рдг рдШрдЯрдХ рд╕рдВрдкрддреНрддрд┐ рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрди


рддреЛ рд╣рдореЗрдВ рдХреНрдпрд╛ рдХрд░рдирд╛ рд╣реИ? рдШрдЯрдХ рдХрд╛рдлреА рдЖрдХрд░реНрд╖рдХ рджрд┐рдЦрддрд╛ рд╣реИ, рдЙрдкрд╕реНрдерд┐рддрд┐ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдЕрдиреБрдХреВрд▓рди рдпреЛрдЧреНрдп рд╣реИ рдФрд░ рдпрд╣ рд▓рдХреНрд╖реНрдп-рдПрдХреНрд╢рди рдЯреЗрдореНрдкрд▓реЗрдЯ рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рддрд╛ рд╣реИ ред

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

рдпрд╣ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐ рдХреМрди рд╕реЗ рдШрдЯрдХ рдЧреБрдг рдмрд╛рд╣рд░реА рд░реВрдк рд╕реЗ рд╕реЗрдЯ рдХрд┐рдП рдЧрдП рд╣реИрдВ, рдЖрдкрдХреЛ рдЕрдкрдиреА рд╕реЗрдЯрд░ рд╡рд┐рдзрд┐ рд▓рд┐рдЦрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреА ред рдЖрдкрдХрд╛ рдкрд╣рд▓рд╛ рдЕрдиреБрдорд╛рди рдпрд╣ рдХреЛрдб рд╣реЛрдиреЗ рдХреА рд╕рдВрднрд╛рд╡рдирд╛ рд╣реИ:

 - (void)setTrackColour:(UIColor *)trackColour { if (_trackColour != trackColour) { _trackColour = trackColour; [_trackLayer setNeedsDisplay]; } } 

рдЬрдм рдХреЛрдИ рдЧреБрдг рдмрджрд▓рддрд╛ рд╣реИ trackColor, рддреЛ рдпрд╣ рдХреЛрдб рд╕реНрд▓рд╛рдЗрдбрд░ рдмрд╛рд░ рдкрд░рдд рдХреЛ рд╕реВрдЪрд┐рдд рдХрд░рддрд╛ рд╣реИ рдЬрд┐рд╕реЗ рдЗрд╕реЗ рдЕрджреНрдпрддрди рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рд▓реЗрдХрд┐рди, рдЗрд╕ рддрдереНрдп рдХреЛ рджреЗрдЦрддреЗ рд╣реБрдП рдХрд┐ рд╕реНрд▓рд╛рдЗрдбрд░ рдПрдкреАрдЖрдИ рдЖрда рдЪрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ, рдПрдХ рд╣реА рдХреЛрдб рдХреЛ рдХрдИ рдмрд╛рд░ рдлрд┐рд░ рд╕реЗ рд▓рд┐рдЦрдирд╛ рд╕рдмрд╕реЗ рдЕрдЪреНрдЫрд╛ рд╕рдорд╛рдзрд╛рди рдирд╣реАрдВ рд╣реИред

рдПрдХ рдореИрдХреНрд░реЛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдЕрд╡рд╕рд░ рдХреА рддрд░рд╣ рд▓рдЧ рд░рд╣рд╛ рд╣реИ! CERangeSlider.m рдЦреЛрд▓реЗрдВ рдФрд░ initWithFrame рд╡рд┐рдзрд┐ рдХреЗ рдКрдкрд░ рдирд┐рдореНрди рдХреЛрдб рдЬреЛрдбрд╝реЗрдВ :

 #define GENERATE_SETTER(PROPERTY, TYPE, SETTER, UPDATER) \ - (void)SETTER:(TYPE)PROPERTY { \ if (_##PROPERTY != PROPERTY) { \ _##PROPERTY = PROPERTY; \ [self UPDATER]; \ } \ } 

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

 GENERATE_SETTER(trackHighlightColour, UIColor*, setTrackHighlightColour, redrawLayers) GENERATE_SETTER(trackColour, UIColor*, setTrackColour, redrawLayers) GENERATE_SETTER(curvaceousness, float, setCurvaceousness, redrawLayers) GENERATE_SETTER(knobColour, UIColor*, setKnobColour, redrawLayers) GENERATE_SETTER(maximumValue, float, setMaximumValue, setLayerFrames) GENERATE_SETTER(minimumValue, float, setMinimumValue, setLayerFrames) GENERATE_SETTER(lowerValue, float, setLowerValue, setLayerFrames) GENERATE_SETTER(upperValue, float, setUpperValue, setLayerFrames) - (void) redrawLayers { [_upperKnobLayer setNeedsDisplay]; [_lowerKnobLayer setNeedsDisplay]; [_trackLayer setNeedsDisplay]; } 

рд╣рдо рдПрдХ рдЭрдкрдЯреНрдЯрд╛ рдореЗрдВ рд╕рднреА рдЪрд░ рдХреЗ рд▓рд┐рдП рд╕реЗрдЯрд░ рд╡рд┐рдзрд┐рдпрд╛рдБ рдЙрддреНрдкрдиреНрди рдХрд░рддреЗ рд╣реИрдВ ред рд╡рд┐рдзрд┐ redrawLayersрдХреЛ рдШрдЯрдХ рдХреА рдЙрдкрд╕реНрдерд┐рддрд┐ рд╕реЗ рдЬреБрдбрд╝реЗ рдЪрд░ рдХреЗ рд▓рд┐рдП рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ, рдФрд░ setLayerFramesрдорд╛рд░реНрдХрдЕрдк рдХреЗ рд▓рд┐рдП рдЬрд┐рдореНрдореЗрджрд╛рд░ рд▓реЛрдЧреЛрдВ рдХреЗ рд▓рд┐рдПред

рдпрд╣ рд╡рд╣ рд╕рдм рд╣реИ рдЬреЛ рд╕реНрд▓рд╛рдЗрдбрд░ рдХреЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХ рд╣реИ рдХрд┐ рд╡рд╣ рдЗрд╕рдХреЗ рдЧреБрдгреЛрдВ рдореЗрдВ рдмрджрд▓рд╛рд╡ рдХреЗ рд▓рд┐рдП рдкрд░реНрдпрд╛рдкреНрдд рд░реВрдк рд╕реЗ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рджреЗ рд╕рдХреЗред

рд╡реИрд╕реЗ рднреА, рдЖрдкрдХреЛ рдирдП рдореИрдХреНрд░реЛрдЬрд╝ рдХрд╛ рдкрд░реАрдХреНрд╖рдг рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХреБрдЫ рдФрд░ рдХреЛрдб рдЬреЛрдбрд╝рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рдФрд░ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░реЗрдВ рдХрд┐ рд╕рдм рдХреБрдЫ рд╡реИрд╕рд╛ рд╣реА рд╣реЛ рдЬреИрд╕рд╛ рдХрд┐ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред CEViewController.m рдЦреЛрд▓реЗрдВ рдФрд░ рд╡рд┐рдзрд┐ рдХреЗ рдЕрдВрдд рдореЗрдВ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдХреЛрдб рдЬреЛрдбрд╝реЗрдВ viewDidLoad:

 [self performSelector:@selector(updateState) withObject:nil afterDelay:1.0f]; 

рдпрд╣ рд▓рд╛рдЗрди updateStateрджреВрд╕рд░реА рджреЗрд░реА рдХреЗ рдмрд╛рдж рд╡рд┐рдзрд┐ рдХреЛ рдХреЙрд▓ рдХрд░реЗрдЧреА ред рдЗрд╕ рд╡рд┐рдзрд┐ рдХреЛ CEViewController.m рдореЗрдВ рдЬреЛрдбрд╝реЗрдВ :

 - (void)updateState { _rangeSlider.trackHighlightColour = [UIColor redColor]; _rangeSlider.curvaceousness = 0.0; } 

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

рдЫрд╡рд┐

:

рдЫрд╡рд┐

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

рдЬрдм рдЖрдк рдЕрдкрдирд╛ рдирд┐рдпрдВрддреНрд░рдг рд╡рд┐рдХрд╕рд┐рдд рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдШрдЯрдХ рдХреА рдЙрдкрд╕реНрдерд┐рддрд┐ рдкрд░ рдЗрд╕рдХреЗ рдЧреБрдгреЛрдВ рдФрд░ рдЙрдирдХреЗ рдкреНрд░рднрд╛рд╡ рдХреЗ рд╕рднреА рд╕рдВрднрд╛рд╡рд┐рдд рдореВрд▓реНрдпреЛрдВ рдХреА рдЬрд╛рдВрдЪ рдХрд░реЗрдВ - рдЖрдкрдХреА рдЬрд┐рдореНрдореЗрджрд╛рд░реАред рдПрдХ рдЕрдЪреНрдЫрд╛ рддрд░реАрдХрд╛ рдХрдИ рдмрдЯрди рдФрд░ рд╕реНрд▓рд╛рдЗрдбрд░реНрд╕ рдЬреЛрдбрд╝рдирд╛ рд╣реЛрдЧрд╛, рдЬрд┐рдирдореЗрдВ рд╕реЗ рдкреНрд░рддреНрдпреЗрдХ рдШрдЯрдХ рдХреА рдХреБрдЫ рд╕рдВрдкрддреНрддрд┐ рдХреЗ рд▓рд┐рдП рдЬрд┐рдореНрдореЗрджрд╛рд░ рд╣реИред рдЗрд╕ рддрд░рд╣ рдЖрдк рдХреЛрдб рдХреЛ рдмрджрд▓рдХрд░ рд╡рд┐рдЪрд▓рд┐рдд рд╣реБрдП рдмрд┐рдирд╛ рдирд┐рдпрдВрддреНрд░рдг рдХрд╛ рдкрд░реАрдХреНрд╖рдг рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред


рдЖрдЧреЗ рдХреНрдпрд╛ рд╣реИ?


рдЕрдм рдЖрдкрдХрд╛ рд╕реНрд▓рд╛рдЗрдбрд░ рдкреВрд░реА рддрд░рд╣ рдХрд╛рд░реНрдпрд╛рддреНрдордХ рд╣реИ рдФрд░ рдХрд┐рд╕реА рднреА рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рддреИрдпрд╛рд░ рд╣реИ! рдХрд╕реНрдЯрдо рдШрдЯрдХреЛрдВ рдХреЗ рдкреНрд░рдореБрдЦ рд▓рд╛рднреЛрдВ рдореЗрдВ рд╕реЗ рдПрдХ рд╡рд┐рднрд┐рдиреНрди рдбреЗрд╡рд▓рдкрд░реНрд╕ рджреНрд╡рд╛рд░рд╛ рд╡рд┐рднрд┐рдиреНрди рдЕрдиреБрдкреНрд░рдпреЛрдЧреЛрдВ рдореЗрдВ рдЙрдирдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдХреНрд╖рдорддрд╛ рд╣реИред

рдареАрдХ рд╣реИ, рдХреНрдпрд╛ рдЖрдк рдЕрдкрдиреЗ рд╕реНрд▓рд╛рдЗрдбрд░ рдХреЗ рдкреНрд░реАрдорд┐рдпрд░ рдХреЗ рд▓рд┐рдП рддреИрдпрд╛рд░ рд╣реИрдВ?

рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдирд╣реАрдВредрдпрд╣ рдХрдИ рдФрд░ рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рдкреВрд░рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдмрдиреА рд╣реБрдИ рд╣реИ:

рдкреНрд░рд▓реЗрдЦрдиред рд╣рд░ рдкреНрд░реЛрдЧреНрд░рд╛рдорд░ рдХреЗ рд▓рд┐рдП рдПрдХ рдкрд╕рдВрджреАрджрд╛ рд╢рдЧрд▓ред :] рд╣рд╛рд▓рд╛рдВрдХрд┐ рдЖрдкрдХреЛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЖрдкрдХрд╛ рдХреЛрдб рд╕рд╣реА рд╣реИ рдФрд░ рдЕрддрд┐рд░рд┐рдХреНрдд рдкреНрд░рд▓реЗрдЦрди рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ, рдЕрдиреНрдп рдбреЗрд╡рд▓рдкрд░реНрд╕ рдХреА рд░рд╛рдп рдирд╛рдЯрдХреАрдп рд░реВрдк рд╕реЗ рднрд┐рдиреНрди рд╣реЛ рд╕рдХрддреА рд╣реИред рдЕрдиреНрдп рдХреЛрдб рдбреЗрд╡рд▓рдкрд░реНрд╕ рдХреЗ рд▓рд┐рдП рд╕рдм рдХреБрдЫ рдЦреБрд▓рд╛ рд░рдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдкреНрд░рд▓реЗрдЦрди рдХрд╛ рдЕрдЪреНрдЫрд╛ рдЕрднреНрдпрд╛рд╕ рд╣реИред рдХрдо рд╕реЗ рдХрдо, рдпрд╣ рд╕рднреА рд╕рд╛рд░реНрд╡рдЬрдирд┐рдХ рд░реВрдк рд╕реЗ рдЙрдкрд▓рдмреНрдз рд╡рд░реНрдЧреЛрдВ рдФрд░ рдЙрдирдХреА рд╕рдВрдкрддреНрддрд┐рдпреЛрдВ рдХрд╛ рд╡рд┐рд╡рд░рдг рд╣реИред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЕрдкрдиреЗ CERangeSlider рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рджрд╕реНрддрд╛рд╡реЗрдЬреЛрдВ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ - рдЙрджреНрджреЗрд╢реНрдп рдЪрд░ рдХрд╛ рдПрдХ рд╡рд┐рд╡рд░рдг max, min, upper, lowerред

рд╡рд┐рд╢реНрд╡рд╕рдиреАрдпрддрд╛ред рдпрджрд┐ рдЖрдк рдПрдХ рдореВрд▓реНрдп рд╕реЗ upperValueрдЕрдзрд┐рдХ рд╕реЗрдЯ рдХрд░рддреЗ рд╣реИрдВ рддреЛ рдХреНрдпрд╛ рд╣реЛрддрд╛ рд╣реИmaximumValue? рдмреЗрд╢рдХ, рдЖрдк рдЦреБрдж рдХрднреА рдРрд╕рд╛ рдирд╣реАрдВ рдХрд░реЗрдВрдЧреЗ - рдпрд╣ рдХрдо рд╕реЗ рдХрдо рдмреЗрд╡рдХреВрдл рд╣реИред рд▓реЗрдХрд┐рди рдЖрдк рдЗрд╕ рдмрд╛рдд рдХреА рдЧрд╛рд░рдВрдЯреА рдирд╣реАрдВ рджреЗ рд╕рдХрддреЗ рдХрд┐ рдХреЛрдИ рдФрд░ рдХреЛрд╢рд┐рд╢ рдХрд░реЗрдЧрд╛! рдЖрдкрдХреЛ рдпрд╣ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рдХрд┐ рдШрдЯрдХ рд╣рдореЗрд╢рд╛ рдареАрдХ рд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ - рдбреЗрд╡рд▓рдкрд░ рдХреА рдореВрд░реНрдЦрддрд╛ рдХреЗ рд╕реНрддрд░ рдХреА рдкрд░рд╡рд╛рд╣ рдХрд┐рдП рдмрд┐рдирд╛ред

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

рдХрдИ рдЬрдЧрд╣ рд╣реИрдВ рдЬрд╣рд╛рдВ рдЖрдк рдЕрдкрдиреЗ рдШрдЯрдХ рдХрд╛ рд╡рд┐рддрд░рдг рд╢реБрд░реВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдпрд╣рд╛рдБ рдХреБрдЫ рд╡рд┐рдХрд▓реНрдк рджрд┐рдП рдЧрдП рд╣реИрдВ:



рдореБрдЭреЗ рдЖрд╢рд╛ рд╣реИ рдХрд┐ рдЖрдк рдПрдХ рдХрд╕реНрдЯрдо рдирд┐рдпрдВрддреНрд░рдг рд╡рд┐рдХрд╕рд┐рдд рдХрд░рдиреЗ рдореЗрдВ рд░реБрдЪрд┐ рд░рдЦрддреЗ рдереЗ, рдФрд░ рд╢рд╛рдпрдж рдЖрдк рдЕрдкрдиреЗ рд╕реНрд╡рдпрдВ рдХреЗ рдШрдЯрдХ рдмрдирд╛рдиреЗ рдХреЗ рд╡рд┐рдЪрд╛рд░ рд╕реЗ рдкреНрд░реЗрд░рд┐рдд рдереЗред

рдкрд░рд┐рдпреЛрдЬрдирд╛ рдХрд╛ рд╕реНрд░реЛрдд рдХреЛрдб рд╡рд┐рдХрд╛рд╕ рдХреЗ рдЪрд░рдгреЛрдВ рдХреЗ рдЕрдиреБрд░реВрдк рдХрдорд┐рдЯ рдХреЗ рдЗрддрд┐рд╣рд╛рд╕ рдХреЗ рд╕рд╛рде GitHub рдкрд░ рдкреНрд░рдХрд╛рд╢рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ ред рдпрджрд┐ рдЖрдк рдЦреЛ рдЬрд╛рддреЗ рд╣реИрдВ, рддреЛ рдЖрдк рдЖрд╕рд╛рдиреА рд╕реЗ рдЕрдВрддрд┐рдо рдкреВрд░реНрдг рдЪрд░рдг рд╕реЗ рдХрд╛рдо рдХрд░рдирд╛ рдЬрд╛рд░реА рд░рдЦ рд╕рдХрддреЗ рд╣реИрдВ! :]

рдЖрдк рдЗрд╕ рд▓рд┐рдВрдХ рд╕реЗ рдкреВрд░реА рдкрд░рд┐рдпреЛрдЬрдирд╛ рдХреЛ рдбрд╛рдЙрдирд▓реЛрдб рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ ред

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


All Articles