
рдирд┐рдпрдВрддреНрд░рдг рдХрд┐рд╕реА рднреА рдЖрд╡реЗрджрди рдХреЗ рд╕рдмрд╕реЗ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдШрдЯрдХреЛрдВ рдореЗрдВ рд╕реЗ рдПрдХ рд╣реИрдВред рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рд╡реЗ рдЧреНрд░рд╛рдлрд┐рдХ рдШрдЯрдХ рд╣реИрдВ рдЬреЛ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ рдХреЛ рдПрдХ рддрд░рд╣ рд╕реЗ рдпрд╛ рдХрд┐рд╕реА рдЕрдиреНрдп рдХреЛ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдФрд░ рдЙрд╕рдХреЗ рдбреЗрдЯрд╛ рдХреЗ рд╕рд╛рде рдмрд╛рддрдЪреАрдд рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддреЗ рд╣реИрдВред рдпрд╣ рдкрд╛рда рдПрдХ рдХрд╕реНрдЯрдо рдирд┐рдпрдВрддреНрд░рдг рдмрдирд╛рдиреЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╣реИ рдЬрд┐рд╕реЗ рдЖрдк рдмрд╛рдж рдореЗрдВ рдХрд┐рд╕реА рднреА рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред
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];
рдпрд╣ рдХреЛрдб рдЖрд╡рд╢реНрдпрдХ рдЖрдпрд╛рдореЛрдВ рдХреЗ рд╕рд╛рде рдЖрдкрдХреА рдХрдХреНрд╖рд╛ рдХрд╛ рдПрдХ рдСрдмреНрдЬреЗрдХреНрдЯ рдмрдирд╛рддрд╛ рд╣реИ рдФрд░ рдЗрд╕реЗ рд╕реНрдХреНрд░реАрди рдкрд░ рдЬреЛрдбрд╝рддрд╛ рд╣реИред рдШрдЯрдХ рдХреА рдкреГрд╖реНрдарднреВрдорд┐ рдХрд╛ рд░рдВрдЧ рд▓рд╛рд▓ рд░рдВрдЧ рдореЗрдВ рд╕реЗрдЯ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ рддрд╛рдХрд┐ рдпрд╣ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреА рдореБрдЦреНрдп рдкреГрд╖реНрдарднреВрдорд┐ рдкрд░ рдзреНрдпрд╛рди рджреЗрдиреЗ рдпреЛрдЧреНрдп рд╣реЛред рдпрджрд┐ рдЖрдк рдПрдХ рд░рдВрдЧ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдШрдЯрдХ рдкрд╛рд░рджрд░реНрд╢реА рд░рд╣реЗрдЧрд╛, рдФрд░ рдЬрд╣рд╛рдВ рдЖрдк рдЧрд╛рдпрдм рд╣реЛ рдЧрдП рд╣реИрдВ, рд╡рд╣рд╛рдВ рдЖрдк рд▓рдВрдмреЗ рд╕рдордп рддрдХ рдкрд╣реЗрд▓реА рдХрд░реЗрдВрдЧреЗред :]
рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдмрдирд╛рдПрдВ рдФрд░ рдЪрд▓рд╛рдПрдВ; рдЖрдкрдХреЛ рдирд┐рдореНрди рд╕реНрдХреНрд░реАрди рджреЗрдЦрдиреА рдЪрд╛рд╣рд┐рдП:

рдЗрд╕рд╕реЗ рдкрд╣рд▓реЗ рдХрд┐ рдЖрдк рдкрд░рд┐рдпреЛрдЬрдирд╛ рдореЗрдВ рджреГрд╢реНрдп рддрддреНрд╡ рдЬреЛрдбрд╝рддреЗ рд╣реИрдВ, рдЖрдкрдХреЛ рдШрдЯрдХ рдореЗрдВ рд╕рдВрдЧреНрд░рд╣реАрдд рд╡рд┐рднрд┐рдиреНрди рдЬрд╛рдирдХрд╛рд░реА рдХрд╛ рдЯреНрд░реИрдХ рд░рдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдХрдИ рдЧреБрдг рдмрдирд╛рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреАред рдпрд╣ рднрд╡рд┐рд╖реНрдп рдХреЗ рдПрдкреАрдЖрдИ рдмрдирд╛рдиреЗ рдХреЗ рдЖрдзрд╛рд░ рдХреЗ рд░реВрдк рдореЗрдВ рдХрд╛рдо рдХрд░реЗрдЧрд╛ред
рдиреЛрдЯ: рдЖрдкрдХрд╛ рдШрдЯрдХ рдПрдкреАрдЖрдИ рдЙрди рддрд░реАрдХреЛрдВ рдФрд░ рдЧреБрдгреЛрдВ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рддрд╛ рд╣реИ рдЬрд┐рдиреНрд╣реЗрдВ рдЖрдк рдЕрдиреНрдп рдбреЗрд╡рд▓рдкрд░реНрд╕ рдХреЛ рдкреНрд░рджрд╛рди рдХрд░рдиреЗ рдХрд╛ рдЗрд░рд╛рджрд╛ рд░рдЦрддреЗ рд╣реИрдВред рдмрд╛рдж рдореЗрдВ рд▓реЗрдЦ рдореЗрдВ рдЖрдк рдПрдкреАрдЖрдИ рдХреА рд╕рдВрд░рдЪрдирд╛ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдкрдврд╝реЗрдВрдЧреЗ - рдЕрднреА рдХреЗ рд▓рд┐рдП, рд╕рдВрдкрд░реНрдХ рдореЗрдВ рд░рд╣реЗрдВ!
рдорд╛рдирдХ рдШрдЯрдХ рдЧреБрдг рдЬреЛрдбрд╝реЗрдВ
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) {
рдЕрдм рдШрдЯрдХ рдХреЗ рдЗрдВрдЯрд░реИрдХреНрдЯрд┐рд╡ рддрддреНрд╡реЛрдВ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХрд╛ рд╕рдордп рд╣реИ: рд╕реНрд▓рд╛рдЗрдбрд░реНрд╕ рдФрд░ рдПрдХ рдкреНрд░рдЧрддрд┐ рдкрдЯреНрдЯреА рдЬрд┐рд╕ рдкрд░ рд╡реЗ рд╕реНрдерд┐рдд рд╣реИрдВред
рдЪрд┐рддреНрд░ рдмрдирд╛рдо CoreGraphics
рд╕реНрдХреНрд░реАрди рдкрд░ рдЖрдЗрдЯрдо рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рдиреЗ рдХреЗ рджреЛ рддрд░реАрдХреЗ рд╣реИрдВ:
- рдЫрд╡рд┐ рдШрдЯрдХ рдХреЗ рднрд╛рдЧ рдХреЗ рд░реВрдк рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ,
- рдкрд░рддреЛрдВ рдФрд░ рдХреЛрд░ рдЧреНрд░рд╛рдлрд┐рдХреНрд╕ рдХреЗ рд╕рдВрдпреЛрдЬрди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВред
рдкреНрд░рддреНрдпреЗрдХ рд╡рд┐рдзрд┐ рдХреЗ рдЕрдкрдиреЗ рдкреЗрд╢реЗрд╡рд░реЛрдВ рдФрд░ рд╡рд┐рдкрдХреНрд╖ рд╣реИрдВред
- рдЫрд╡рд┐рдпреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рд╕рдмрд╕реЗ рдЖрд╕рд╛рди рд╡рд┐рдХрд▓реНрдк рд╣реИ, рдХрдо рд╕реЗ рдХрдо рдпрджрд┐ рдЖрдк рдЖрдХрд░реНрд╖рд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдпрджрд┐ рдЖрдк рдЕрдиреНрдп рдбреЗрд╡рд▓рдкрд░реНрд╕ рдХреЛ рдЗрди рдЫрд╡рд┐рдпреЛрдВ рдХреЛ рдЕрдкрдиреЗ рд╕реНрд╡рдпрдВ рдХреЗ рд╕рд╛рде рдмрджрд▓рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрдиреЗ рдХрд╛ рдЗрд░рд╛рджрд╛ рд░рдЦрддреЗ рд╣реИрдВ, рддреЛ рдЙрдиреНрд╣реЗрдВ
UIImage
рдЧреБрдгреЛрдВ рдХреЗ рд░реВрдк рдореЗрдВ рд╕реЗрдЯ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред - рдЫрд╡рд┐рдпреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдШрдЯрдХ рдХреЛ рдкрд░реНрдпрд╛рдкреНрдд рд▓рдЪреАрд▓рд╛рдкрди рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИред рдерд░реНрдб-рдкрд╛рд░реНрдЯреА рдбреЗрд╡реЗрд▓рдкрд░реНрд╕ рд╕рдм рдХреБрдЫ рдмрджрд▓ рд╕рдХрддреЗ рд╣реИрдВ, рд╣рд░ рдкрд┐рдХреНрд╕реЗрд▓ рдХреЗ рдиреАрдЪреЗ - рд▓реЗрдХрд┐рди рджреВрд╕рд░реА рдУрд░ рдЗрд╕рдореЗрдВ рдХреБрдЫ рдбреНрд░рд╛рдЗрдВрдЧ рд╕реНрдХрд┐рд▓реНрд╕ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ - рдФрд░ рдХреЛрдб рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдХреБрдЫ рдмрджрд▓рдирд╛ рдмрд╣реБрдд рдореБрд╢реНрдХрд┐рд▓ рд╣реИред
рдХреЛрд░ рдЧреНрд░рд╛рдлрд┐рдХреНрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдШрдЯрдХ рдХреЛ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЛрдб рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдЬрд┐рдореНрдореЗрджрд╛рд░ рд╣реИ, рдФрд░ рдкрд░рд┐рдгрд╛рдорд╕реНрд╡рд░реВрдк, рдкреНрд░реЛрдЧреНрд░рд╛рдорд░ рдХреЛ рдмрд╣реБрдд рдЕрдзрд┐рдХ рдкреНрд░рдпрд╛рд╕ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИред рд▓реЗрдХрд┐рди рдпрд╣ рддрд░реАрдХрд╛ рдЖрдкрдХреЛ рдЕрдзрд┐рдХ рд▓рдЪреАрд▓реА рдПрдкреАрдЖрдИ рдмрдирд╛рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред
рдХреЛрд░ рдЧреНрд░рд╛рдлрд┐рдХреНрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛, рдЖрдк рдПрдХ рдШрдЯрдХ рдХреА рд▓рдЧрднрдЧ рдХрд┐рд╕реА рднреА рд╕рдВрдкрддреНрддрд┐ рдХреЛ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ - рдЗрд╕рдХрд╛ рд░рдВрдЧ, рдореЛрдЯрд╛рдИ, рд╡рдХреНрд░рддрд╛ - рдФрд░ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рдХреЛрдИ рднреА рдкреИрд░рд╛рдореАрдЯрд░ рдЬреЛ рдкреНрд░рддрд┐рдкрд╛рджрди рдХреЗ рд▓рд┐рдП рдЬрд┐рдореНрдореЗрджрд╛рд░ рд╣реИред рдпрд╣ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдбреЗрд╡рд▓рдкрд░реНрд╕ рдХреЛ рдЖрдкрдХреЗ рдирд┐рдпрдВрддреНрд░рдг рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ рддрд╛рдХрд┐ рд╡реЗ рдЖрд╕рд╛рдиреА рд╕реЗ рдЗрд╕реЗ рдЕрдкрдиреА рдЖрд╡рд╢реНрдпрдХрддрд╛рдУрдВ рдХреЗ рдЕрдиреБрдХреВрд▓ рдмрдирд╛ рд╕рдХреЗрдВред
рдЗрд╕ рдкрд╛рда рдореЗрдВ рд╣рдо рджреВрд╕рд░реЗ рджреГрд╖реНрдЯрд┐рдХреЛрдг -
рдХреЛрд░ рдЧреНрд░рд╛рдлрд┐рдХреНрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВрдЧреЗред
рдиреЛрдЯ: рдЙрддреНрд╕реБрдХрддрд╛ рд╕реЗ, 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];
рдЬрдм рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдкрд╣рд▓реА рдмрд╛рд░ рдШрдЯрдХ рдХреЛ рдЫреВрддрд╛ рд╣реИ рддреЛ рдпрд╣ рд╡рд┐рдзрд┐ рдХрд╣рд▓рд╛рддреА рд╣реИред рдпрд╣ рдШрдЯрдХ рд╕рдордиреНрд╡рдп рдкреНрд░рдгрд╛рд▓реА рдореЗрдВ рдХреНрд▓рд┐рдХ рдШрдЯрдирд╛ рдХрд╛ рдЕрдиреБрд╡рд╛рдж рдХрд░рддрд╛ рд╣реИред рдЙрд╕рдХреЗ рдмрд╛рдж рд╡рд╣ рдпрд╣ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкреНрд░рддреНрдпреЗрдХ рд╕реНрд▓рд╛рдЗрдбрд░ рдХреА рдЬрд╛рдБрдЪ рдХрд░рддрд╛ рд╣реИ рдХрд┐ рдХреНрд▓рд┐рдХ рдЙрдирдореЗрдВ рд╕реЗ рдХрд┐рд╕реА рдПрдХ рдХреЗ рджрд╛рдпрд░реЗ рдореЗрдВ рдЖрддрд╛ рд╣реИ рдпрд╛ рдирд╣реАрдВред рдирддреАрдЬрддрди, рд╡рд┐рдзрд┐ рдЕрдкрдиреЗ рдореВрд▓ рд╡рд░реНрдЧ рдХреЛ рд╡рд░реНрддрдорд╛рди рдХреНрд▓рд┐рдХ рдХреЛ рдЯреНрд░реИрдХ рдХрд░рдиреЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрддрд╛рддреА рд╣реИред
рд╕реНрд▓рд╛рдЗрдбрд░реНрд╕ рдореЗрдВ рд╕реЗ рдХрд┐рд╕реА рдПрдХ рдХреЛ рд╣рд╛рдЗрд▓рд╛рдЗрдЯ рдХрд┐рдП рдЬрд╛рдиреЗ рдкрд░ рдХреНрд▓рд┐рдХ рдЯреНрд░реИрдХрд┐рдВрдЧ рдЬрд╛рд░реА рд░рд╣рддреА рд╣реИред
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; }
рдЖрдЗрдП рдЗрд╕ рдХреЛрдб рдХрд╛ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдХрд░реЗрдВ, рдЯрд┐рдкреНрдкрдгреА рджреНрд╡рд╛рд░рд╛ рдЯрд┐рдкреНрдкрдгреА рдХрд░реЗрдВ:
- рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рдЖрдк
delta
рдЧрдгрдирд╛ рдХрд░рддреЗ рд╣реИрдВ - рдкрд┐рдХреНрд╕рд▓ рдХреА рд╕рдВрдЦреНрдпрд╛ рдЬрд┐рд╕рдХреЗ рджреНрд╡рд╛рд░рд╛ рдЙрдВрдЧрд▓реА рдХреЛ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред рдлрд┐рд░ рдЖрдк рдШрдЯрдХ рдХреЗ рдиреНрдпреВрдирддрдо рдФрд░ рдЕрдзрд┐рдХрддрдо рдореВрд▓реНрдпреЛрдВ рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдЙрдиреНрд╣реЗрдВ рдкрд░рд┐рд╡рд░реНрддрд┐рдд рдХрд░рддреЗ рд╣реИрдВред - рдпрд╣рд╛рдВ рдЖрдк рдКрдкрд░реА рдФрд░ рдирд┐рдЪрд▓реЗ рд╕реАрдорд╛ рдХреЛ рдмрджрд▓рддреЗ рд╣реИрдВ, рдЬрд╣рд╛рдВ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рд╕реНрд▓рд╛рдЗрдбрд░ рдХреЛ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░рддрд╛ рд╣реИред рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ рдЖрдк
BOUND
рдореИрдХреНрд░реЛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣реЗ рд╣реИрдВ, рдЬреЛ MIN/MAX
рд╕реЗ рдЕрдзрд┐рдХ рдкрдардиреАрдп рд╣реИред - рдХреЛрдб рдХрд╛ рдпрд╣ рдмреНрд▓реЙрдХ
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
ред
рдореИрдВ рджреЛрдиреЛрдВ рдкреИрдЯрд░реНрди рдХрд╛ рд╡рд┐рд╕реНрддреГрдд рд╡рд┐рд╢реНрд▓реЗрд╖рдг рджреВрдВрдЧрд╛:
- рдкреНрд░рддрд┐рдирд┐рдзрд┐рдордВрдбрд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реБрдП, рдЖрдк рдПрдХ рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рдмрдирд╛рддреЗ рд╣реИрдВ рдЬрд┐рд╕рдореЗрдВ рд╡рд┐рднрд┐рдиреНрди рд╕реВрдЪрдирд╛рдУрдВ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧ рдХрд┐рдП рдЬрд╛рдиреЗ рд╡рд╛рд▓реЗ рдХрдИ рддрд░реАрдХреЗ рд╣реЛрддреЗ рд╣реИрдВред рдПрдХ рдШрдЯрдХ рдХреЗ рдкрд╛рд╕ рдПрдХ рд╕рдВрдкрддреНрддрд┐ рд╣реЛрддреА рд╣реИ, рдЬрд┐рд╕реЗ рдЖрдорддреМрд░ рдкрд░ рдПрдХ рдкреНрд░рддрд┐рдирд┐рдзрд┐ рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЬреЛ рдЗрд╕ рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рдХрд┐рд╕реА рднреА рд╡рд░реНрдЧ рдХреЛ рд╕реНрд╡реАрдХрд╛рд░ рдХрд░рддрд╛ рд╣реИред рдПрдХ рдЙрддреНрдХреГрд╖реНрдЯ рдЙрджрд╛рд╣рд░рдг UITableView рд╣реИ, рдЬреЛ UITableViewDelegate рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИред рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ рдирд┐рдпрдВрддреНрд░рдг рдореЗрдВ рдХреЗрд╡рд▓ рдПрдХ рдкреНрд░рддрд┐рдирд┐рдзрд┐ рдСрдмреНрдЬреЗрдХреНрдЯ рд╣реЛ рд╕рдХрддрд╛ рд╣реИред рдПрдХ рдкреНрд░рддреНрдпрд╛рдпреЛрдЬрд┐рдд рд╡рд┐рдзрд┐ рдХрд┐рд╕реА рднреА рд╕рдВрдЦреНрдпрд╛ рдореЗрдВ рдорд╛рдкрджрдВрдбреЛрдВ рдХреЛ рд╕реНрд╡реАрдХрд╛рд░ рдХрд░ рд╕рдХрддреА рд╣реИ, рдЗрд╕рд▓рд┐рдП рдЖрдк рдЬрд┐рддрдиреА рдЖрд╡рд╢реНрдпрдХ рд╣реЛ рдЙрддрдиреА рдЬрд╛рдирдХрд╛рд░реА рдкрд╛рд╕ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред
- рдЯрд╛рд░рдЧреЗрдЯ-рдПрдХреНрд╢рди рдЯреЗрдореНрдкрд▓реЗрдЯ
UIControl
рдмреЗрд╕ рдХреНрд▓рд╛рд╕ рджреНрд╡рд╛рд░рд╛ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред рдЬрдм рдШрдЯрдХ рд╕реНрдерд┐рддрд┐ рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрди рд╣реЛрддрд╛ рд╣реИ, рддреЛ рд▓рдХреНрд╖реНрдп рдХреЛ рдХрд╛рд░реНрд░рд╡рд╛рдИ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╕реВрдЪрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЬрд┐рд╕реЗ UIControlEvents
рдХреЗ UIControlEvents
рдореВрд▓реНрдпреЛрдВ рдореЗрдВ рд╕реЗ рдПрдХ рджреНрд╡рд╛рд░рд╛ рд╡рд░реНрдгрд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред рдЖрдк рд╕рднреА рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рдирд┐рдпрдВрддреНрд░рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрдИ рд▓рдХреНрд╖реНрдп рдкреНрд░рджрд╛рди рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдФрд░ рдпрджреНрдпрдкрд┐ рдЕрдкрдиреА рдЦреБрдж рдХреА рдШрдЯрдирд╛рдУрдВ ( UIControlEventApplicationReserver
) рдХреЛ рдЬреЛрдбрд╝рдирд╛ рд╕рдВрднрд╡ рд╣реИ, рдЙрдирдХреА рд╕рдВрдЦреНрдпрд╛ рдЪрд╛рд░ рддрдХ рд╕реАрдорд┐рдд рд╣реИред рдпреЗ рдХреНрд░рд┐рдпрд╛рдПрдБ рдИрд╡реЗрдВрдЯ рдХреЗ рд╕рд╛рде рдХреЛрдИ рднреА рдЬрд╛рдирдХрд╛рд░реА рдкреНрд░рд╕рд╛рд░рд┐рдд рдирд╣реАрдВ рдХрд░ рд╕рдХрддреА рд╣реИрдВред рдЗрд╕рд▓рд┐рдП, рдЙрдирдХрд╛ рдЙрдкрдпреЛрдЧ рдЕрддрд┐рд░рд┐рдХреНрдд рдбреЗрдЯрд╛ рдкреНрд░рд╕рд╛рд░рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред
рджреЛ рдкреИрдЯрд░реНрди рдХреЗ рдмреАрдЪ рдореБрдЦреНрдп рдЕрдВрддрд░ рдирд┐рдореНрдирд╛рдиреБрд╕рд╛рд░ рд╣реИрдВ:- рдЯрд╛рд░рдЧреЗрдЯ-рдПрдХреНрд╢рди рдЯреЗрдореНрдкреНрд▓реЗрдЯ рдЕрдкрдиреЗ рдкрд░рд┐рд╡рд░реНрддрдиреЛрдВ рдХреЛ рдкреНрд░рд╕рд╛рд░рд┐рдд рдХрд░рддрд╛ рд╣реИ, рдЬрдмрдХрд┐ рдкреНрд░рддрд┐рдирд┐рдзрд┐рдордВрдбрд▓ рдПрдХ рд╣реА рд╡рд╕реНрддреБ рддрдХ рд╕реАрдорд┐рдд рд╣реИред
- рдЖрдк рдбреЗрд▓рд┐рдЧреЗрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╕рдордп рд╕реНрд╡рддрдВрддреНрд░ рд░реВрдк рд╕реЗ рдкреНрд░реЛрдЯреЛрдХреЙрд▓ рд▓рд╛рдЧреВ рдХрд░рддреЗ рд╣реИрдВ, рдЕрд░реНрдерд╛рдд, рдЖрдк рдпрд╣ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдЖрдк рдХреМрди рд╕реА рд╡рд┐рд╢рд┐рд╖реНрдЯ рдЬрд╛рдирдХрд╛рд░реА рд╕рдВрдЪрд╛рд░рд┐рдд рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВред рд▓рдХреНрд╖реНрдп-рдХрд╛рд░реНрд░рд╡рд╛рдИ рдЕрддрд┐рд░рд┐рдХреНрдд рдбреЗрдЯрд╛ рдХреЗ рд╣рд╕реНрддрд╛рдВрддрд░рдг рдХреА рдЕрдиреБрдорддрд┐ рдирд╣реАрдВ рджреЗрддреА рд╣реИред
рдЖрдкрдХреЗ рдШрдЯрдХ рдореЗрдВ рдХрдИ рд╕рдВрднрд╛рд╡рд┐рдд рд╕реНрдерд┐рддрд┐ рдпрд╛ рд╕рдВрднрд╛рд╡рд┐рдд рдШрдЯрдирд╛рдПрдБ рдирд╣реАрдВ рд╣реИрдВ рдЬрд┐рдиреНрд╣реЗрдВ рдЕрдзрд┐рд╕реВрдЪрд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдХреЗрд╡рд▓ рдПрдХ рдЪреАрдЬ рдЬреЛ рдПрдХ рднреВрдорд┐рдХрд╛ рдирд┐рднрд╛рддреА рд╣реИ рд╡рд╣ рд╕реНрд▓рд╛рдЗрдбрд░ рдХрд╛ рдЕрдзрд┐рдХрддрдо рдФрд░ рдиреНрдпреВрдирддрдо рдорд╛рди рд╣реИредрдЗрд╕ рд╕реНрдерд┐рддрд┐ рдореЗрдВ, рдЯрд╛рд░рдЧреЗрдЯ-рдПрдХреНрд╢рди рдЯреЗрдореНрдкрд▓реЗрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рд╕рдмрд╕реЗ рдЕрдзрд┐рдХ рдЙрдЪрд┐рдд рд╣реИред рдпрд╣ рдЙрди рдХрд╛рд░рдгреЛрдВ рдореЗрдВ рд╕реЗ рдПрдХ рд╣реИ, рдЬреЛ рд╣рдореЗрдВ 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 {
рдЗрд╕ рдЫрд╡рд┐ рдореЗрдВ рдЖрдк рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдХреЛрдб рдХреЗ рд╕рднреА рдмреНрд▓реЙрдХ рд╕рдВрдпреБрдХреНрдд рдХреИрд╕реЗ рд╣реИрдВ, рдЯрд┐рдкреНрдкрдгрд┐рдпреЛрдВ рджреНрд╡рд╛рд░рд╛ рдЕрд▓рдЧ рдХрд┐рдП
рдЧрдП рд╣реИрдВ: рдЧрд┐рдиреЗ рд╣реБрдП рдЕрдиреБрднрд╛рдЧ рдЧрд┐рдиреЗ рд╣реБрдП рдЯрд┐рдкреНрдкрдгрд┐рдпреЛрдВ рдХреЗ рдЕрдиреБрд░реВрдк рд╣реИрдВ:- рдкрдЯреНрдЯреА рдХрд╛ рдЖрдХрд╛рд░ рддреИрдпрд╛рд░ рд╣реЛрдиреЗ рдХреЗ рдмрд╛рдж, рдЗрд╕рдХреА рдкреГрд╖реНрдарднреВрдорд┐ рднрд░ рдЬрд╛рддреА рд╣реИред
- рдЪрдпрдирд┐рдд рд╢реНрд░реЗрдгреА рдкрд░ рдкреНрд░рдХрд╛рд╢ рдбрд╛рд▓рд╛ рдЧрдпрд╛ рд╣реИред
- рд╕реНрдЯреНрд░рд┐рдк рдореЗрдВ рд╡реЙрд▓реНрдпреВрдо рдЬреЛрдбрд╝рдиреЗ рдХреЗ рд▓рд┐рдП рдЕрддрд┐рд░рд┐рдХреНрдд рд░реЛрд╢рдиреА рдбрд╛рд▓реА рдЬрд╛рддреА рд╣реИред
- рдПрдХ рдЫрд╛рдпрд╛ рдЦреАрдВрдЪреА рдЬрд╛рддреА рд╣реИред
- рдкрдЯреНрдЯреА рдХреЗ рд╡реЙрд▓реНрдпреВрдореЗрдЯреНрд░рд┐рдХ рдХрд┐рдирд╛рд░реЛрдВ рдХреЛ рдЦреАрдВрдЪрд╛ рдЬрд╛рддрд╛ рд╣реИред
рдЕрдм рдЬрдм рд╕рдм рдХреБрдЫ рдЕрд▓рдЧ-рдЕрд▓рдЧ рдЪрд░рдгреЛрдВ рдореЗрдВ рд▓рд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рддреЛ рдЖрдк рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ 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];
рдлрд┐рд░, рд╣рдо рдЗрд╕ рдкрджреНрдзрддрд┐ рдХреЗ рдкрд░рд┐рдгрд╛рдореЛрдВ рдХрд╛ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдХрд░реЗрдВрдЧреЗ:- рдЬреИрд╕реЗ рд╣реА рд╕реНрд▓рд╛рдЗрдбрд░реНрд╕ рдХрд╛ рдЖрдХрд╛рд░ рддреИрдпрд╛рд░ рд╣реЛрддрд╛ рд╣реИ, рдЙрдирдХреА рдкреГрд╖реНрдарднреВрдорд┐ рднрд░ рдЬрд╛рддреА рд╣реИред
- рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛ рд╕реНрд▓рд╛рдЗрдбрд░ рдХреА рд╕реАрдорд╛рдПрдБ рдЦреАрдВрдЪреА рдЧрдИ рд╣реИрдВред
- рдПрдХ рдкреНрд░рдХрд╛рд╢ рдврд╛рд▓ рдЬреЛрдбрд╝рд╛ рдЬрд╛рддрд╛ рд╣реИред
- рдФрд░ рдЖрдЦрд┐рд░реА - рдпрджрд┐ рд╕реНрд▓рд╛рдЗрдбрд░ рдХреЛ рд╣рд╛рдЗрд▓рд╛рдЗрдЯ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ - рдпрд╣ рдЙрд╕ рддрд░рд╣ рд╕реЗ рд░рд╣рддрд╛ рд╣реИ, рдЕрдЧрд░ рдЗрд╕реЗ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ - рдпрд╣ рдЧреНрд░реЗ рд╣реЛ рдЬрд╛рддрд╛ рд╣реИред
рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЛ рдлрд┐рд░ рд╕реЗ рдЪрд▓рд╛рдПрдБ:
рдЖрдк рджреЗрдЦрддреЗ рд╣реИрдВ рдХрд┐ рдХреЛрд░ рдЧреНрд░рд╛рдлрд┐рдХреНрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдПрдХ рдШрдЯрдХ рдкреНрд░рджрд╛рди рдХрд░рдирд╛ рдкреНрд░рдпрд╛рд╕ рдХреЗ рд▓рд╛рдпрдХ рд╣реИред рдЗрд╕ рдврд╛рдВрдЪреЗ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рд╕реЗ рдЖрдк рдЧреНрд░рд╛рдлрд┐рдХ рд╕рдВрд╕рд╛рдзрдиреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдмрд╣реБрдд рдЕрдзрд┐рдХ рдЕрдиреБрдХреВрд▓рди рдпреЛрдЧреНрдп рдФрд░ рд▓рдЪреАрд▓рд╛ рдирд┐рдпрдВрддреНрд░рдг рдмрдирд╛ рд╕рдХрддреЗ рд╣реИрдВредрдкреНрд░рд╕рдВрд╕реНрдХрд░рдг рдШрдЯрдХ рд╕рдВрдкрддреНрддрд┐ рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрди
рддреЛ рд╣рдореЗрдВ рдХреНрдпрд╛ рдХрд░рдирд╛ рд╣реИ? рдШрдЯрдХ рдХрд╛рдлреА рдЖрдХрд░реНрд╖рдХ рджрд┐рдЦрддрд╛ рд╣реИ, рдЙрдкрд╕реНрдерд┐рддрд┐ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдЕрдиреБрдХреВрд▓рди рдпреЛрдЧреНрдп рд╣реИ рдФрд░ рдпрд╣ рд▓рдХреНрд╖реНрдп-рдПрдХреНрд╢рди рдЯреЗрдореНрдкрд▓реЗрдЯ рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рддрд╛ рд╣реИ редрдЗрд╕ рдмрд╛рд░реЗ рдореЗрдВ рд╕реЛрдЪреЗрдВ рдХрд┐ рдЕрдЧрд░ рд╕реНрдХреНрд░реАрди рдкрд░ рдбреНрд░реЙ рд╣реЛрдиреЗ рдХреЗ рдмрд╛рдж рд╕реНрд▓рд╛рдЗрдбрд░ рдХрд╛ рдХреЛрдИ рдЧреБрдг рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЛрдб рдореЗрдВ рдмрджрд▓ рдЬрд╛рдП рддреЛ рдХреНрдпрд╛ рд╣реЛрдЧрд╛ред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЖрдк рд╕реНрд▓рд╛рдЗрдбрд░ рдХреЗ рдорд╛рдиреЛрдВ рдХреА рд╢реНрд░реЗрдгреА рдмрджрд▓рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ рдпрд╛ рд╕реНрд▓рд╛рдЗрдбрд░ рдХреЗ рд╣рд╛рдЗрд▓рд╛рдЗрдЯ рдХреЛ рдмрджрд▓рдирд╛ рдЪрд╛рд╣ рд╕рдХрддреЗ рд╣реИрдВред рдлрд┐рд▓рд╣рд╛рд▓, рдЗрди рд╕реБрд╡рд┐рдзрд╛рдУрдВ рдХреЗ рд▓рд┐рдП рд╕рдорд░реНрдерди рд▓рд╛рдЧреВ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред рдЖрдкрдХреЛ рдЗрд╕реЗ рдЕрдкрдиреЗ рдХреЛрдб рдореЗрдВ рдЬреЛрдбрд╝рдирд╛ рд╣реЛрдЧрд╛редрдпрд╣ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐ рдХреМрди рд╕реЗ рдШрдЯрдХ рдЧреБрдг рдмрд╛рд╣рд░реА рд░реВрдк рд╕реЗ рд╕реЗрдЯ рдХрд┐рдП рдЧрдП рд╣реИрдВ, рдЖрдкрдХреЛ рдЕрдкрдиреА рд╕реЗрдЯрд░ рд╡рд┐рдзрд┐ рд▓рд┐рдЦрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреА ред рдЖрдкрдХрд╛ рдкрд╣рд▓рд╛ рдЕрдиреБрдорд╛рди рдпрд╣ рдХреЛрдб рд╣реЛрдиреЗ рдХреА рд╕рдВрднрд╛рд╡рдирд╛ рд╣реИ: - (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 ред GitHub рд╕рдмрд╕реЗ рд▓реЛрдХрдкреНрд░рд┐рдп рдУрдкрди рд╕реЛрд░реНрд╕ рдШрдЯрдХ рд╣реЛрд╕реНрдЯрд┐рдВрдЧ рд╕рд╛рдЗрдЯреЛрдВ рдореЗрдВ рд╕реЗ рдПрдХ рдмрди рдЧрдпрд╛ рд╣реИред GitHub рдореЗрдВ рдЕрдм рдЕрдирдЧрд┐рдирдд рдЕрд▓рдЧ-рдЕрд▓рдЧ iOS рдХрдВрдЯреНрд░реЛрд▓ рд╣реИрдВред GitHub рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рдЕрдЪреНрдЫрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдЖрдкрдХреЛ рдШрдЯрдХ рдХреЛрдб рдХреЛ рдЬрд▓реНрджреА рдФрд░ рдЖрд╕рд╛рдиреА рд╕реЗ рджреЗрдЦрдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ, рдЗрд╕реЗ рдЕрдиреНрдп рдкрд░рд┐рдпреЛрдЬрдирд╛рдУрдВ рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ рдФрд░ рд╡рд┐рднрд┐рдиреНрди рдЯрд┐рдкреНрдкрдгрд┐рдпреЛрдВ рдХреЛ рдЫреЛрдбрд╝ рджреЗрдВред
- рдХреЛрдХреЛрдкреЛрдбреНрд╕ ред рд▓реЛрдЧреЛрдВ рдХреЛ рдЖрд╕рд╛рдиреА рд╕реЗ рдЕрдкрдиреЗ рдШрдЯрдХ рдХреЛ рдЕрдкрдиреА рдкрд░рд┐рдпреЛрдЬрдирд╛ рдореЗрдВ рдЬреЛрдбрд╝рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдк рдЗрд╕реЗ CocoaPods, iOS рдФрд░ OSX рдХреЗ рд▓рд┐рдП рд╡рд┐рд╕реНрддрд╛рд░ рдкреНрд░рдмрдВрдзрдХ рдореЗрдВ рдЬреЛрдбрд╝ рд╕рдХрддреЗ рд╣реИрдВред
- Cocoa Controls . , . GitHub, .
- Binpress . , . , тАФ ? , , - API.
рдореБрдЭреЗ рдЖрд╢рд╛ рд╣реИ рдХрд┐ рдЖрдк рдПрдХ рдХрд╕реНрдЯрдо рдирд┐рдпрдВрддреНрд░рдг рд╡рд┐рдХрд╕рд┐рдд рдХрд░рдиреЗ рдореЗрдВ рд░реБрдЪрд┐ рд░рдЦрддреЗ рдереЗ, рдФрд░ рд╢рд╛рдпрдж рдЖрдк рдЕрдкрдиреЗ рд╕реНрд╡рдпрдВ рдХреЗ рдШрдЯрдХ рдмрдирд╛рдиреЗ рдХреЗ рд╡рд┐рдЪрд╛рд░ рд╕реЗ рдкреНрд░реЗрд░рд┐рдд рдереЗредрдкрд░рд┐рдпреЛрдЬрдирд╛ рдХрд╛ рд╕реНрд░реЛрдд рдХреЛрдб рд╡рд┐рдХрд╛рд╕ рдХреЗ рдЪрд░рдгреЛрдВ рдХреЗ рдЕрдиреБрд░реВрдк рдХрдорд┐рдЯ рдХреЗ рдЗрддрд┐рд╣рд╛рд╕ рдХреЗ рд╕рд╛рде GitHub рдкрд░ рдкреНрд░рдХрд╛рд╢рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ ред рдпрджрд┐ рдЖрдк рдЦреЛ рдЬрд╛рддреЗ рд╣реИрдВ, рддреЛ рдЖрдк рдЖрд╕рд╛рдиреА рд╕реЗ рдЕрдВрддрд┐рдо рдкреВрд░реНрдг рдЪрд░рдг рд╕реЗ рдХрд╛рдо рдХрд░рдирд╛ рдЬрд╛рд░реА рд░рдЦ рд╕рдХрддреЗ рд╣реИрдВ! :]рдЖрдк рдЗрд╕ рд▓рд┐рдВрдХ рд╕реЗ рдкреВрд░реА рдкрд░рд┐рдпреЛрдЬрдирд╛ рдХреЛ рдбрд╛рдЙрдирд▓реЛрдб рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ ред