IOS рдореЗрдВ рдЬрдЯрд┐рд▓ рдкреНрд░рджрд░реНрд╢рди рд╕рдВрдЧреНрд░рд╣: VKontakte рдлрд╝реАрдб рдХреЗ рдЙрджрд╛рд╣рд░рдг рдкрд░ рд╕рдорд╕реНрдпрд╛рдПрдВ рдФрд░ рд╕рдорд╛рдзрд╛рди

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


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


рдпрджрд┐ рдЖрдк рдкрдврд╝рдиреЗ рд╕реЗ рдЕрдзрд┐рдХ рд╕реБрдирдирд╛ рдкрд╕рдВрдж рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рд░рд┐рдкреЛрд░реНрдЯ рдХреА рд╡реАрдбрд┐рдпреЛ рд░рд┐рдХреЙрд░реНрдбрд┐рдВрдЧ рдпрд╣рд╛рдВ рд╣реИ ред



рд╕рд╛рдордЧреНрд░реА


  1. рд╡рд┐рд╡рд░рдг рдФрд░ рд▓реЗрдЖрдЙрдЯ рдХреА рдЧрдгрдирд╛
    1.1ред рдСрдЯреЛ рд▓реЗрдЖрдЙрдЯ
    1.2ред рдореИрдиреБрдЕрд▓ frame рдЧрдгрдирд╛
  2. рдкрд╛рда рдХрд╛ рдЖрдХрд╛рд░ рдЧрдгрдирд╛
    2.1ред UILabel / UITextView / UITextField рдХреЗ рдЖрдХрд╛рд░ рдХреА рдЧрдгрдирд╛ рдХреЗ рд▓рд┐рдП рдорд╛рдирдХ рддрд░реАрдХреЗ
    2.2ред NSAttributedString / NSString рддрд░реАрдХреЗ
    2.3ред TextKit
    2.4ред CoreText
  3. VKontakte рдлреАрдб рдХреИрд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ?
  4. рдмреЗрд╣рддрд░ рдкреНрд░рджрд░реНрд╢рди рдХреИрд╕реЗ рдкреНрд░рд╛рдкреНрдд рдХрд░реЗрдВ
    4.1 рдкреНрд░рджрд░реНрд╢рди рдХреА рд╕рдорд╕реНрдпрд╛рдПрдВ рдХреНрдпреЛрдВ
    4.2ред CATransaction.commit
    4.3ред рд░реЗрдВрдбрд░рд┐рдВрдЧ рдкрд╛рдЗрдкрд▓рд╛рдЗрди
    4.4ред рдкреНрд░рджрд░реНрд╢рди рдХреЗ рд▓рд┐рдП рд╕рдмрд╕реЗ рдХрдордЬреЛрд░ рд╕реНрдерд╛рди
  5. рдорд╛рдк рдЙрдкрдХрд░рдг
    5.1ред рдзрд╛рддреБ рдкреНрд░рдгрд╛рд▓реА рдЯреНрд░реЗрд╕
    5.2ред рд╣рдо рдХреЛрдб рдореЗрдВ рдкреНрд░рджрд░реНрд╢рди рдХреА рдХрдореА рдХреЛ рдареАрдХ рдХрд░рддреЗ рд╣реИрдВ, рдЬрдмрдХрд┐ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдЪрд▓ рд░рд╣рд╛ рд╣реИ

  • рд╕рдорд╕реНрдпрд╛рдУрдВ рдХрд╛ рдЕрдиреБрд╕рдВрдзрд╛рди рдХреИрд╕реЗ рдХрд░реЗрдВред рд╕рд┐рдлрд╛рд░рд┐рд╢реЗрдВ
  • рдирд┐рд╖реНрдХрд░реНрд╖
  • рдЬрд╛рдирдХрд╛рд░реА рдХреЗ рд╕реНрд░реЛрдд

1. рд▓реЗрдЖрдЙрдЯ рдХрд╛ рд╡рд┐рд╡рд░рдг рдФрд░ рдЧрдгрдирд╛


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


1.1ред рдСрдЯреЛ рд▓реЗрдЖрдЙрдЯ


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


рдЕрднреА рдХреЗ рд▓рд┐рдП, рдпрд╛рдж рд░рдЦреЗрдВ рдХрд┐ рдСрдЯреЛ рд▓реЗрдЖрдЙрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдкреНрд░рддрд┐рдмрдВрдзреЛрдВ рдкрд░ рдмрдирд╛рдпрд╛ рдЧрдпрд╛ рд╣реИред


рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХреА рд╡рд┐рд╢реЗрд╖рддрд╛рдПрдВ:



рдСрдЯреЛ рд▓реЗрдЖрдЙрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд╛рдн:


  • рд╕рд░рд▓ рдореИрдкрд┐рдВрдЧ рдкрд░, рд░реИрдЦрд┐рдХ рдХрдореНрдкреНрдпреВрдЯреЗрд╢рдирд▓ рдЬрдЯрд┐рд▓рддрд╛ рд╕рдВрднрд╡ рд╣реИ ред
  • рдпрд╣ рд╕рднреА рдорд╛рдирдХ рддрддреНрд╡реЛрдВ рдХреЗ рд╕рд╛рде-рд╕рд╛рде рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ Apple рдХреА "рджреЗрд╢реА" рддрдХрдиреАрдХ рд╣реИред
  • рдмреЙрдХреНрд╕ рдХреЗ рдмрд╛рд╣рд░ UIView рд╕рд╛рде рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред
  • рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдмрд┐рд▓реНрдбрд░ рдореЗрдВ рдЙрдкрд▓рдмреНрдз рд╣реИ, рдЬреЛ рдЖрдкрдХреЛ рд╕реНрдЯреЛрд░реАрдмреЛрд░реНрдб рдпрд╛ XIB рдореЗрдВ рд▓реЗрдЖрдЙрдЯ рдХрд╛ рд╡рд░реНрдгрди рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред
  • рдпрд╣ рд╕рдВрдХреНрд░рдордг рдХреЗ рджреМрд░рд╛рди рднреА рдЕрджреНрдпрддрд┐рдд рд╕рдорд╛рдзрд╛рди рдХреА рдЧрд╛рд░рдВрдЯреА рджреЗрддрд╛ рд╣реИред рдЗрд╕рдХрд╛ рдорддрд▓рдм рдпрд╣ рд╣реИ рдХрд┐ рдкреНрд░рддреНрдпреЗрдХ UIView frame рдореВрд▓реНрдп рд╣рдореЗрд╢рд╛ (!) рд╡рд╛рд╕реНрддрд╡рд┐рдХ рд▓реЗрдЖрдЙрдЯ рдХрд╛рд░реНрдп рдХрд╛ рдПрдХ рд╕рдорд╛рдзрд╛рди рд╣реИред

рдЕрдзрд┐рдХрд╛рдВрд╢ рдкреНрд░рджрд░реНрд╢рдиреЛрдВ рдХреЗ рд▓рд┐рдП рд╕рд┐рд╕реНрдЯрдо рдХреНрд╖рдорддрд╛рдПрдВ рдкрд░реНрдпрд╛рдкреНрдд рд╣реИрдВред рд▓реЗрдХрд┐рди рднрд╛рд░реА рдорд╛рддреНрд░рд╛ рдореЗрдВ рд╕рд╛рдордЧреНрд░реА рдХреЗ рд╕рд╛рде рдЯреЗрдк рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдпрд╣ рдЙрдкрдпреБрдХреНрдд рдирд╣реАрдВ рд╣реИред рдХреНрдпреЛрдВ?


рдпрд╣ рдпрд╛рдж рд░рдЦрдирд╛ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИ рдХрд┐ рдСрдЯреЛ рд▓реЗрдЖрдЙрдЯ:


  • рдХреЗрд╡рд▓ рдореБрдЦреНрдп рд╕реВрддреНрд░ рдореЗрдВ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ ред рдорд╛рди рд▓реАрдЬрд┐рдП рдХрд┐ Apple рдЗрдВрдЬреАрдирд┐рдпрд░реЛрдВ рдиреЗ рдореЗрдирд╕реНрдЯреНрд░реАрдо рдХреЛ рдСрдЯреЛ рд▓реЗрдЖрдЙрдЯ рд╕рдорд╛рдзрд╛рди рдХреЗ рд╕рд┐рдВрдХреНрд░рдирд╛рдЗрдЬрд╝реЗрд╢рди рдмрд┐рдВрджреБ рдФрд░ рд╕рднреА UIView рдХреЗ рдлреНрд░реЗрдо рд╡реИрд▓реНрдпреВ рдХреЗ рд░реВрдк рдореЗрдВ рдЪреБрдирд╛ UIView ред рдЗрд╕рдХреЗ рдмрд┐рдирд╛, рдЖрдкрдХреЛ рдСрдЯреЛ рд▓реЗрдЖрдЙрдЯ рдХреЛ рдПрдХ рдЕрд▓рдЧ рдзрд╛рдЧреЗ рдореЗрдВ рдЧрдгрдирд╛ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ рдФрд░ рдореБрдЦреНрдп рдзрд╛рдЧреЗ рдХреЗ рд╕рд╛рде рдореВрд▓реНрдпреЛрдВ рдХреЛ рд▓рдЧрд╛рддрд╛рд░ рд╕рд┐рдВрдХреНрд░рдирд╛рдЗрдЬрд╝ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред
  • рдпрд╣ рдзреАрд░реЗ-рдзреАрд░реЗ рдЬрдЯрд┐рд▓ рдЕрднреНрдпрд╛рд╡реЗрджрди рдкрд░ рдХрд╛рдо рдХрд░ рд╕рдХрддрд╛ рд╣реИ , рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдПрдХ рдХреНрд░реВрд░ рдмрд▓ рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рдкрд░ рдЖрдзрд╛рд░рд┐рдд рд╣реИ рдЬрд┐рд╕рдХреА рд╕рдмрд╕реЗ рдЦрд░рд╛рдм рд╕реНрдерд┐рддрд┐ рдореЗрдВ рдЬрдЯрд┐рд▓рддрд╛ рдШрд╛рддреАрдп рд╣реИред
  • IOS 6.0 рдХреЗ рд╕рд╛рде рдЙрдкрд▓рдмреНрдз рд╣реИ ред рдЕрдм рдпрд╣ рд╢рд╛рдпрдж рд╣реА рдХреЛрдИ рд╕рдорд╕реНрдпрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ рд╡рд┐рдЪрд╛рд░ рдХрд░рдиреЗ рд▓рд╛рдпрдХ рд╣реИред

рдирд┐рд╖реНрдХрд░реНрд╖: рдСрдЯреЛ рд▓реЗрдЖрдЙрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рд╕рдВрдЧреНрд░рд╣ рдХреЗ рдмрд┐рдирд╛ рдпрд╛ рдЙрд╕рдХреЗ рд╕рд╛рде рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рдирд╛ рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рд╣реИ, рд▓реЗрдХрд┐рди рддрддреНрд╡реЛрдВ рдХреЗ рдмреАрдЪ рдЬрдЯрд┐рд▓ рд╕рдВрдмрдВрдзреЛрдВ рдХреЗ рдмрд┐рдирд╛ред


1.2ред рдореИрдиреБрдЕрд▓ frame рдЧрдгрдирд╛


рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХрд╛ рд╕рд╛рд░: рд╣рдо рд╕рднреА frame рдореВрд▓реНрдпреЛрдВ рдХреА рдЧрдгрдирд╛ рдЦреБрдж рдХрд░рддреЗ рд╣реИрдВред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рд╣рдо рддрд░реАрдХреЗ sizeThatFits рд▓рд╛рдЧреВ рдХрд░рддреЗ рд╣реИрдВ, sizeThatFits , sizeThatFits ред рдпрд╣реА рд╣реИ, sizeThatFits рдореЗрдВ layoutSubviews рд╕реНрд╡рдпрдВ рд╕рднреА рдмрд╛рд▓ рддрддреНрд╡реЛрдВ рдХреА рд╡реНрдпрд╡рд╕реНрдерд╛ рдХрд░рддреЗ рд╣реИрдВ, рдЖрдХрд╛рд░ рдореЗрдВ рд╣рдо рдмрдЪреНрдЪреЗ рддрддреНрд╡реЛрдВ рдФрд░ рд╕рд╛рдордЧреНрд░реА рдХреЗ рд╡рд╛рдВрдЫрд┐рдд рд╕реНрдерд╛рди рдХреЗ рдЕрдиреБрд░реВрдк рдЖрдХрд╛рд░ рдХреА рдЧрдгрдирд╛ рдХрд░рддреЗ рд╣реИрдВред


рдпрд╣ рдХреНрдпрд╛ рджреЗрддрд╛ рд╣реИ? рд╣рдо рдЬрдЯрд┐рд▓ рдЧрдгрдирд╛ рдХреЛ рдкреГрд╖реНрдарднреВрдорд┐ рдзрд╛рд░рд╛ рдореЗрдВ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдФрд░ рдЕрдкреЗрдХреНрд╖рд╛рдХреГрдд рд╕рд░рд▓ рдЧрдгрдирд╛ рдореБрдЦреНрдп рдзрд╛рд░рд╛ рдореЗрдВ рдХреА рдЬрд╛ рд╕рдХрддреА рд╣реИред


рдХреНрдпрд╛ рд╕рдорд╕реНрдпрд╛ рд╣реИ? рдЖрдкрдХреЛ рд╕реНрд╡рдпрдВ рдЧрдгрдирд╛рдУрдВ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдирд╛ рд╣реЛрдЧрд╛, рдЧрд▓рддреА рдХрд░рдирд╛ рдЖрд╕рд╛рди рд╣реИред рдЖрдкрдХреЛ рдпрд╣ рднреА рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рдХрд┐ рдмрдЪреНрдЪреЛрдВ рдХреА рд╕реНрдерд┐рддрд┐ рдФрд░ рдЖрдХрд╛рд░ рдЖрдХрд╛рд░ рдореЗрдВ рд╡рд╛рдкрд╕ рдЖрдП рдкрд░рд┐рдгрд╛рдо sizeThatFits ред


рд╕реНрд╡-рдореВрд▓реНрдпрд╛рдВрдХрди рдЙрдЪрд┐рдд рд╣реИ рдпрджрд┐:


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

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




2. рдкрд╛рда рдЖрдХрд╛рд░ рдХреА рдЧрдгрдирд╛


рдЗрд╕ рд╕рдорд╕реНрдпрд╛ рдХреЛ рдХрдо рд╕реЗ рдХрдо рдЪрд╛рд░ рддрд░реАрдХреЛрдВ рд╕реЗ рд╣рд▓ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдЬрд┐рдирдореЗрдВ рд╕реЗ рдкреНрд░рддреНрдпреЗрдХ рдЕрдкрдиреЗ рд╕реНрд╡рдпрдВ рдХреЗ рддрд░реАрдХреЛрдВ рдкрд░ рдирд┐рд░реНрднрд░ рдХрд░рддрд╛ рд╣реИред рдФрд░ рдкреНрд░рддреНрдпреЗрдХ рдХреА рдЕрдкрдиреА рд╡рд┐рд╢реЗрд╖рддрд╛рдУрдВ рдФрд░ рд╕реАрдорд╛рдПрдВ рд╣реИрдВред


2.1ред UILabel / UITextView / UITextField рдХреЗ рдЖрдХрд╛рд░ рдХреА рдЧрдгрдирд╛ рдХреЗ рд▓рд┐рдП рдорд╛рдирдХ рддрд░реАрдХреЗ


sizeThatFits ( sizeThatFits рдореЗрдВ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ) рдФрд░ intrinsicContentSize (рдСрдЯреЛ рд▓реЗрдЖрдЙрдЯ рдореЗрдВ рдкреНрд░рдпреБрдХреНрдд) intrinsicContentSize рд╕рд╛рдордЧреНрд░реА рджреГрд╢реНрдп рд╕рд╛рдордЧреНрд░реА рдХрд╛ рдкрд╕рдВрджреАрджрд╛ рдЖрдХрд╛рд░ рд▓реМрдЯрд╛рддреЗ рд╣реИрдВред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЙрдирдХреА рдорджрдж рд╕реЗ рд╣рдо рдпрд╣ рдкрддрд╛ рд▓рдЧрд╛ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ UILabel рдореЗрдВ рд▓рд┐рдЦреЗ рдЧрдП рдкрд╛рда рдореЗрдВ рдХрд┐рддрдирд╛ рд╕реНрдерд╛рди UILabel ред


рдирдХрд╛рд░рд╛рддреНрдордХ рдкрдХреНрд╖ рдпрд╣ рд╣реИ рдХрд┐ рджреЛрдиреЛрдВ рд╡рд┐рдзрд┐рдпрд╛рдВ рдХреЗрд╡рд▓ рдореБрдЦреНрдп рдзрд╛рдЧреЗ рдореЗрдВ рдХрд╛рдо рдХрд░рддреА рд╣реИрдВ - рдЙрдиреНрд╣реЗрдВ рдкреГрд╖реНрдарднреВрдорд┐ рд╕реЗ рдирд╣реАрдВ рдмреБрд▓рд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред


рдорд╛рдирдХ рддрд░реАрдХреЗ рдХрдм рдЙрдкрдпреЛрдЧреА рд╣реИрдВ?


  • рдпрджрд┐ рд╣рдо рдкрд╣рд▓реЗ рд╕реЗ рд╣реА sizeToFit рдпрд╛ Auto Layout рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВред
  • рдЬрдм рдкреНрд░рджрд░реНрд╢рди рдореЗрдВ рдорд╛рдирдХ рддрддреНрд╡ рд╣реЛрддреЗ рд╣реИрдВ, рдФрд░ рд╣рдо рдХреЛрдб рдореЗрдВ рдЙрдирдХрд╛ рдЖрдХрд╛рд░ рдкреНрд░рд╛рдкреНрдд рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВред
  • рдЬрдЯрд┐рд▓ рд╕рдВрдЧреНрд░рд╣ рдХреЗ рдмрд┐рдирд╛ рдХрд┐рд╕реА рднреА рдкреНрд░рджрд░реНрд╢рди рдХреЗ рд▓рд┐рдПред

2.2ред NSAttributedString / NSString рддрд░реАрдХреЗ


boundingRect рдФрд░ sizeWithAttributes рдзреНрдпрд╛рди рджреЗрдВред рдореИрдВ UILabel / UITextView / UITextField рдХреА рд╕рд╛рдордЧреНрд░реА рдХрд╛ рдЖрдХрд╛рд░ рдкрдврд╝рдиреЗ рдХреЗ рд▓рд┐рдП рдЙрдирдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рд╕рд▓рд╛рд╣ рдирд╣реАрдВ рджреЗрддрд╛ред рдореБрдЭреЗ рджрд╕реНрддрд╛рд╡реЗрдЬрд╝реАрдХрд░рдг рдХреА рдЬрд╛рдирдХрд╛рд░реА рдореЗрдВ рдХрд╣реАрдВ рднреА рдпрд╣ рдирд╣реАрдВ рдорд┐рд▓рд╛ рдХрд┐ NSString рддрд░реАрдХреЗ рдФрд░ UIView рддрддреНрд╡реЛрдВ рдХреЗ рд▓реЗрдЖрдЙрдЯ рддрд░реАрдХреЗ рдПрдХ рд╣реА рдХреЛрдб (рд╕рдорд╛рди рдХрдХреНрд╖рд╛рдПрдВ) рдкрд░ рдЖрдзрд╛рд░рд┐рдд рд╣реИрдВред рд╡рд░реНрдЧреЛрдВ рдХреЗ рдпреЗ рджреЛ рд╕рдореВрд╣ рдХреНрд░рдорд╢рдГ рдЕрд▓рдЧ-рдЕрд▓рдЧ рд░реВрдкрд░реЗрдЦрд╛рдУрдВ рдХреЗ рд╣реИрдВ: рдлрд╛рдЙрдВрдбреЗрд╢рди рдФрд░ рдпреВрдЖрдИрдХрд┐рдЯред рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рдЖрдкрдХреЛ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА UILabel рдЖрдХрд╛рд░ рдХреЗ рд▓рд┐рдП рдмрд╛рдЙрдВрдбрд┐рдВрдЧрдЖрд░рдХреНрдЯ рдкрд░рд┐рдгрд╛рдо рдлрд┐рдЯ рдХрд░рдирд╛ рдерд╛? рдпрд╛ рдХреНрдпрд╛ рдЖрдк рдЗрд╕ рддрдереНрдп рд╕реЗ NSString рдХрд┐ NSString рдЗрдореЛрдЬреА рдХреЗ рдЖрдХрд╛рд░ рдХреЛ рдзреНрдпрд╛рди рдореЗрдВ рдирд╣реАрдВ рд░рдЦрддреЗ рд╣реИрдВ ? рдпреЗ рд╕рдорд╕реНрдпрд╛рдПрдВ рд╣реИрдВ рдЬреЛ рдЖрдкрдХреЛ рдорд┐рд▓ рд╕рдХрддреА рд╣реИрдВред


рдореИрдВ рдЖрдкрдХреЛ рдпрд╣ рднреА рдмрддрд╛рдКрдВрдЧрд╛ рдХрд┐ UILabel / UITextView / UITextField рдореЗрдВ рдкрд╛рда рдЦреАрдВрдЪрдиреЗ рдХреЗ рд▓рд┐рдП рдХреМрди рд╕реА рдХрдХреНрд╖рд╛рдПрдВ рдЬрд╝рд┐рдореНрдореЗрджрд╛рд░ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдЕрднреА рдХреЗ рддрд░реАрдХреЛрдВ рдкрд░ рд▓реМрдЯрдиреЗ UITextField ред


рдпрджрд┐ рд╣рдо рд╣реИрдВ рддреЛ рдЗрд╕рдХрд╛ рдЗрд╕реНрддреЗрдорд╛рд▓ рдХрд░рдирд╛ред


  • рд╣рдо drawInRect , drawAtPoint рдпрд╛ NSString / NSAttributedString рдЕрдиреНрдп рддрд░реАрдХреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЧреИрд░-рдорд╛рдирдХ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рддрддреНрд╡реЛрдВ рдХреЛ рдЖрдХрд░реНрд╖рд┐рдд рдХрд░рддреЗ рд╣реИрдВред
  • рд╣рдо рдкреГрд╖реНрдарднреВрдорд┐ рд╕реНрдЯреНрд░реАрдо рдореЗрдВ рддрддреНрд╡реЛрдВ рдХреЗ рдЖрдХрд╛рд░ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВред рдлрд┐рд░, рдпрд╣ рдХреЗрд╡рд▓ рдЙрдЪрд┐рдд рд░реЗрдВрдбрд░рд┐рдВрдЧ рд╡рд┐рдзрд┐рдпреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╕рдордп рд╣реИред
  • рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдПрдХ рдордирдорд╛рдирд╛ рд╕рдВрджрд░реНрдн рдмрдирд╛рдПрдВ, рдЫрд╡рд┐ рдХреЗ рд╢реАрд░реНрд╖ рдкрд░ рдПрдХ рд░реЗрдЦрд╛ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░реЗрдВред

2.3ред TextKit


рдЗрд╕ рдЙрдкрдХрд░рдг рдореЗрдВ рдорд╛рдирдХ рдХреНрд▓рд╛рд╕реЗрд╕ NLayoutManager , NSTextStorage рдФрд░ NSTextContainer ред рд▓реЗрдЖрдЙрдЯ UILabel / UITextView / UITextField рднреА UITextField рдкрд░ рдЖрдзрд╛рд░рд┐рдд рд╣реИред


TextKit рдмрд╣реБрдд рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рд╣реИ рдЬрдм рдЖрдкрдХреЛ рдкрд╛рда рдХреЗ рд╕реНрдерд╛рди рдХрд╛ рд╡рд┐рд╕реНрддрд╛рд░ рд╕реЗ рд╡рд░реНрдгрди рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ рдФрд░ рд╕рдВрдХреЗрдд рдорд┐рд▓рддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдХрд┐рд╕ рдЖрдХрд╛рд░ рдореЗрдВ рдШреВрдореЗрдЧрд╛:



TextKit рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ, рдЖрдк рдкреГрд╖реНрдарднреВрдорд┐ рдХрддрд╛рд░ рдореЗрдВ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рддрддреНрд╡реЛрдВ рдХреЗ рдЖрдХрд╛рд░, рд╕рд╛рде рд╣реА рд▓рд╛рдЗрдиреЛрдВ / рд╡рд░реНрдгреЛрдВ рдХреА frame рдЧрдгрдирд╛ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рд░реВрдкрд░реЗрдЦрд╛ рдЖрдкрдХреЛ рдЧреНрд▓рд┐рдлрд╝ рдЦреАрдВрдЪрдиреЗ рдФрд░ рдореМрдЬреВрджрд╛ рд▓реЗрдЖрдЙрдЯ рдХреЗ рднреАрддрд░ рдкрд╛рда рдХреА рдЙрдкрд╕реНрдерд┐рддрд┐ рдХреЛ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдмрджрд▓рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддреА рд╣реИред рдпрд╣ рд╕рдм iOS 7.0 рдФрд░ рдЙрдЪреНрдЪрддрд░ рдореЗрдВ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред


TextKit рдЙрдкрдпреЛрдЧреА рд╣реИ рдЬрдм рдЖрдк рдХреА рдЬрд░реВрд░рдд рд╣реИ:


  • рдЬрдЯрд┐рд▓ рд▓реЗрдЖрдЙрдЯ рдХреЗ рд╕рд╛рде рдкреНрд░рджрд░реНрд╢рди рдкрд╛рда;
  • рдЫрд╡рд┐рдпреЛрдВ рдкрд░ рдкрд╛рда рдЖрдХрд░реНрд╖рд┐рдд рдХрд░реЗрдВ;
  • рд╡реНрдпрдХреНрддрд┐рдЧрдд рд╕рдмрд╕реНрдЯреНрд░рд┐рдВрдЧ рдХреЗ рдЖрдХрд╛рд░ рдХреА рдЧрдгрдирд╛ рдХрд░реЗрдВ;
  • рд▓рд╛рдЗрдиреЛрдВ рдХреА рд╕рдВрдЦреНрдпрд╛ рдЧрд┐рдиреЗрдВ;
  • рдПрдХ UITextView рдореЗрдВ рдЧрдгрдирд╛ рдХреЗ рдкрд░рд┐рдгрд╛рдореЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВред

рдореИрдВ рдлрд┐рд░ рдЬреЛрд░ рджреЗрддрд╛ рд╣реВрдВред рдпрджрд┐ рдЖрдкрдХреЛ UITextView рдХреЗ рдЖрдХрд╛рд░ рдХреА рдЧрдгрдирд╛ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рддреЛ рд╣рдо рдкрд╣рд▓реЗ NSLayoutManager , NSTextStorage рдФрд░ NSTextContainer рдХреЗ рдЙрджрд╛рд╣рд░рдгреЛрдВ рдХреЛ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд░рддреЗ NSTextContainer , рдФрд░ рдлрд┐рд░ рдЗрди рдЙрджрд╛рд╣рд░рдгреЛрдВ рдХреЛ рд╕рдВрдмрдВрдзрд┐рдд NSTextContainer рдкрд╛рд╕ рджреЗрддреЗ рд╣реИрдВ , рдЬрд╣рд╛рдБ рд╡реЗ рд▓реЗрдЖрдЙрдЯ рдХреЗ рд▓рд┐рдП рдЬрд╝рд┐рдореНрдореЗрджрд╛рд░ рд╣реЛрдВрдЧреЗред рдХреЗрд╡рд▓ рдЗрд╕ рддрд░рд╣ рд╕реЗ рд╣рдо рд╕рднреА рдореВрд▓реНрдпреЛрдВ рдХреЗ рдкреВрд░реНрдг рд╕рдВрдпреЛрдЧ рдХреА рдЧрд╛рд░рдВрдЯреА рджреЗрддреЗ рд╣реИрдВред


UILabel рдФрд░ UITextField рд╕рд╛рде TextKit рдХрд╛ рдЙрдкрдпреЛрдЧ рди рдХрд░реЗрдВ! рдЙрдирдХреЗ рд▓рд┐рдП ( UITextView рд╡рд┐рдкрд░реАрдд) рдЖрдк NSLayoutManager , NSTextStorage рдФрд░ NSTextContainer рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗред


2.4ред CoreText


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


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


CoreText рдЕрдзрд┐рдХрд╛рдВрд╢ рд╡рд╕реНрддреБрдУрдВ рдкрд░ рд╕рдВрдЪрд╛рд▓рди рдХреЗ рд▓рд┐рдП рдереНрд░реЗрдб рд╕реБрд░рдХреНрд╖рд╛ рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИред рдЗрд╕рдХрд╛ рдорддрд▓рдм рд╣реИ рдХрд┐ рд╣рдо рд╡рд┐рднрд┐рдиреНрди рдереНрд░реЗрдбреНрд╕ рд╕реЗ рдЗрд╕рдХреЗ рддрд░реАрдХреЛрдВ рдХреЛ рдХреЙрд▓ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рддреБрд▓рдирд╛ рдХреЗ рд▓рд┐рдП, TextKit рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╕рдордп, рдЖрдкрдХреЛ рд╕реНрд╡рдпрдВ рд╡рд┐рдзрд┐ рдХреЙрд▓ рдХреЗ рдЕрдиреБрдХреНрд░рдо рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╕реЛрдЪрдирд╛ рд╣реЛрдЧрд╛ред


CoreText рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП рдпрджрд┐:


  • рдкрд╛рда рдорд╛рдкрджрдВрдбреЛрдВ рддрдХ рд╕реАрдзреА рдкрд╣реБрдВрдЪ рдХреЗ рд▓рд┐рдП рдПрдХ рдЕрддреНрдпрдВрдд рд╕рд░рд▓ рдирд┐рдореНрди-рд╕реНрддрд░реАрдп рдПрдкреАрдЖрдИ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИред рдореБрдЭреЗ рддреБрд░рдВрдд рдХрд╣рдирд╛ рд╣реЛрдЧрд╛ рдХрд┐ рдЕрдзрд┐рдХрд╛рдВрд╢ рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рд▓рд┐рдП, TextKit рдХреА рдХреНрд╖рдорддрд╛рдПрдВ рдкрд░реНрдпрд╛рдкреНрдд рд╣реИрдВред
  • рд╡реНрдпрдХреНрддрд┐рдЧрдд рд▓рд╛рдЗрдиреЛрдВ ( CTLine ) рдФрд░ рдкрд╛рддреНрд░реЛрдВ / рддрддреНрд╡реЛрдВ рдХреЗ рд╕рд╛рде рдмрд╣реБрдд рдХрд╛рдо рдХрд░рдирд╛ рд╣реИред
  • IOS 6.0 рдореЗрдВ рд╕рдорд░реНрдерди рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИред

VKontakte рдлрд╝реАрдб рдХреЗ рд▓рд┐рдП, рд╣рдордиреЗ CoreText рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ред рдХреНрдпреЛрдВ? рдмрд╕ рдЙрд╕ рд╕рдордп рдЬрдм рд╣рдордиреЗ рдкрд╛рда рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рдмреБрдирд┐рдпрд╛рджреА рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛, TextKit рдЕрднреА рддрдХ рдирд╣реАрдВ рдерд╛ред




3. VKontakte рдлреАрдб рдХреИрд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ?


рд╕рдВрдХреНрд╖реЗрдк рдореЗрдВ рд╣рдо рд╕рд░реНрд╡рд░ рд╕реЗ рдбреЗрдЯрд╛ рдХреИрд╕реЗ рдкреНрд░рд╛рдкреНрдд рдХрд░рддреЗ рд╣реИрдВ, рд▓реЗрдЖрдЙрдЯ рдФрд░ рдбрд┐рд╕реНрдкреНрд▓реЗ рдмрдирд╛рддреЗ рд╣реИрдВред



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


рдЕрдм рдореЗрди рдХрддрд╛рд░ рдореЗрдВ рдЬрд╛рдПрдВред dataSourceUpdate рдкреНрд░рд╛рдкреНрдд dataSourceUpdate рдХреЛ dataSourceUpdate , UITableView рдореЗрдВ рдкреБрдирдГ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ, рдкреБрди: рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ рдФрд░ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдШрдЯрдирд╛рдУрдВ рдХреЛ рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд░реЗрдВ, рдХреЛрд╢рд┐рдХрд╛рдУрдВ рдХреЛ рднрд░реЗрдВред


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


  • рдПрдХ рдШреЛрд╖рдгрд╛рддреНрдордХ рдПрдкреАрдЖрдИ рдирд┐рдпрдореЛрдВ рдХрд╛ рдПрдХ рд╕рдореВрд╣ рд╣реИ рдЬрд┐рд╕ рдкрд░ рдПрдХ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдмрдирд╛рдпрд╛ рдЧрдпрд╛ рд╣реИред
  • рдмреБрдирд┐рдпрд╛рджреА рдШрдЯрдХ рдПрдХ рдкреЗрдбрд╝ ( nodes ) рдмрдирд╛рддреЗ рд╣реИрдВред
  • рдмреБрдирд┐рдпрд╛рджреА рдШрдЯрдХреЛрдВ рдореЗрдВ рд╕рд░рд▓ рдЧрдгрдирд╛ред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рд╕реВрдЪрд┐рдпреЛрдВ рдореЗрдВ, рд╣рдо рдХреЗрд╡рд▓ origin рдСрдлрд╕реЗрдЯ рдХреА рдЧрдгрдирд╛ рдХрд░рддреЗ origin , рд╕рднреА рдмрдЪреНрдЪреЛрдВ рдХреА рдЪреМрдбрд╝рд╛рдИ / рдКрдВрдЪрд╛рдИ рдХреЛ рдзреНрдпрд╛рди рдореЗрдВ рд░рдЦрддреЗ рд╣реБрдПред
  • рдореВрд▓ рддрддреНрд╡ рдкрджрд╛рдиреБрдХреНрд░рдо рдореЗрдВ UIView рдЕрдирд╛рд╡рд╢реНрдпрдХ "рдХрдВрдЯреЗрдирд░реЛрдВ" рдХрд╛ рдирд┐рд░реНрдорд╛рдг рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рд╕реВрдЪреА рдШрдЯрдХ рдЕрддрд┐рд░рд┐рдХреНрдд UIView рдирд╣реАрдВ рдмрдирд╛рддрд╛ рд╣реИ рдФрд░ рдЗрд╕рдореЗрдВ рдмрдЪреНрдЪреЛрдВ рдХреЛ рдирд╣реАрдВ рдЬреЛрдбрд╝рддрд╛ рд╣реИред рдЗрд╕рдХреЗ рдмрдЬрд╛рдп, рд╣рдо рдореВрд▓ (рд╕реВрдЪреА рдХреЗ рд▓рд┐рдП) рддрддреНрд╡ рдХреЗ рд╕рд╛рдкреЗрдХреНрд╖ рдмрдЪреНрдЪреЛрдВ рдХреА origin рдСрдлрд╕реЗрдЯ рдХреА рдЧрдгрдирд╛ рдХрд░рддреЗ origin ред
  • CoreText рдХреЗ рд╕рд╛рде рдирд┐рдореНрди рд╕реНрддрд░ рдХрд╛ рдкрд╛рда рдкреНрд░рдмрдВрдзрдиред

рд▓реЗрдХрд┐рди рдЗрд╕ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХреЗ рд╕рд╛рде рднреА, рдкреНрд░рджрд░реНрд╢рди рдХреЗ рдореБрджреНрджреЛрдВ рдХреЗ рдХрд╛рд░рдг рдЯреЗрдк рджреЗрдЦрдиреЗ рдореЗрдВ рдЖрд╕рд╛рдиреА рдирд╣реАрдВ рд╣реЛ рд╕рдХрддреА рд╣реИред рдХреНрдпреЛрдВ?


рдкреНрд░рддреНрдпреЗрдХ рдХреЛрд╢рд┐рдХрд╛ рдореЗрдВ nodes рдХрд╛ рдПрдХ рдЬрдЯрд┐рд▓ рдкрджрд╛рдиреБрдХреНрд░рдо рд╣реЛрддрд╛ рд╣реИред рдФрд░ рдпрджреНрдпрдкрд┐ рдореВрд▓ рддрддреНрд╡ рдЕрдирд╛рд╡рд╢реНрдпрдХ рдХрдВрдЯреЗрдирд░реЛрдВ рдХрд╛ рдирд┐рд░реНрдорд╛рдг рдирд╣реАрдВ рдХрд░рддреЗ UIView рднреА рдмрд╣реБрдд рд╕рд╛рд░реЗ UIView рд░рд┐рдмрди рдореЗрдВ рдкреНрд░рджрд░реНрд╢рд┐рдд UIView ред рдФрд░ рдореЗрди-рдХрддрд╛рд░ рдореЗрдВ "рдиреЛрдбреНрд╕" (рдмрд╛рдЗрдВрдбрд┐рдВрдЧ рджреЗрдЦреЗрдВ) рдХреЗ рд╕рд╛рде рдкрджрд╛рдиреБрдХреНрд░рдо рдХреЛ рднрд░рдиреЗ рдкрд░ рдЕрддрд┐рд░рд┐рдХреНрдд рдХрд╛рдо рд╣реЛрддрд╛ рд╣реИ рдЬрд┐рд╕рд╕реЗ рджреВрд░ рд╣реЛрдирд╛ рдореБрд╢реНрдХрд┐рд▓ рд╣реИред


рд╣рдордиреЗ рдкреГрд╖реНрдарднреВрдорд┐ рдХрддрд╛рд░ рдореЗрдВ рдЕрдзрд┐рдХ рд╕реЗ рдЕрдзрд┐рдХ рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХреА рдФрд░ рдЕрдм рднреА рдРрд╕рд╛ рдХрд░рдирд╛ рдЬрд╛рд░реА рд╣реИред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рд╕реАрдкреАрдпреВ-рд╕рдШрди рдФрд░ рдЬреАрдкреАрдпреВ-рдЧрд╣рди рд╕рдВрдЪрд╛рд▓рди рд╣реИрдВ рдЬрд┐рдиреНрд╣реЗрдВ рдзреНрдпрд╛рди рдореЗрдВ рд░рдЦрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП рдФрд░ рдЗрд╕реЗ рджрд░рдХрд┐рдирд╛рд░ рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред




4. рдмреЗрд╣рддрд░ рдкреНрд░рджрд░реНрд╢рди рдХреИрд╕реЗ рдкреНрд░рд╛рдкреНрдд рдХрд░реЗрдВ


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


4.1 рдкреНрд░рджрд░реНрд╢рди рдХреА рд╕рдорд╕реНрдпрд╛рдПрдВ рдХреНрдпреЛрдВ


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


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


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


рдХрдИ рд▓реЗрдирджреЗрди рдПрдХ рд╕реНрдЯреИрдХ рдмрдирд╛рддреЗ рд╣реИрдВред рддрд╛рдЬрд╛ рдЕрдкрдбреЗрдЯ рд╕реНрдЯреИрдХ рдХреЗ рд╢реАрд░реНрд╖ рд▓реЗрдирджреЗрди рдореЗрдВ рдЖрддреЗ рд╣реИрдВред


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



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


рдореБрдЦреНрдп рд╕реВрддреНрд░ рдореЗрдВ, RunLoop рд╡рд┐рднрд┐рдиреНрди рд╕реНрд░реЛрддреЛрдВ рд╕реЗ рдШрдЯрдирд╛рдУрдВ рдХреЛ рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд░рдиреЗ RunLoop рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ, рдЬреИрд╕реЗ рдХрд┐ рдПрдХ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ (рдЗрд╢рд╛рд░реЗ), рдЯрд╛рдЗрдорд░, рдпрд╛, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, NSStream рдФрд░ NSPort рд╕реЗ рдбреЗрдЯрд╛ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╣реИрдВрдбрд▓рд░ред



рдХреЛрд░ рдПрдирд┐рдореЗрд╢рди рдФрд░ RunLoop рдХреИрд╕реЗ RunLoop ? рд╣рдордиреЗ рдКрдкрд░ рдкрд╛рдпрд╛ рдХрд┐ рд░реЗрдВрдбрд░ рдЯреНрд░реА рдореЗрдВ рдПрдХ рдкрд░рдд рдХреЗ рдЧреБрдгреЛрдВ рдХреЛ рдмрджрд▓рддреЗ рд╕рдордп, рд╕рд┐рд╕реНрдЯрдо рдпрджрд┐ рдЖрд╡рд╢реНрдпрдХ рд╣реЛ рддреЛ рдирд┐рд╣рд┐рдд рд▓реЗрдирджреЗрди рдмрдирд╛рддрд╛ рд╣реИ (рдЗрд╕рд▓рд┐рдП, рд╣рдореЗрдВ рдХреБрдЫ рдХреЛ рдлрд┐рд░ рд╕реЗ CATransaction.begin рд▓рд┐рдП CATransaction.begin рдХреЛ рдХреЙрд▓ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ)ред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдкреНрд░рддреНрдпреЗрдХ RunLoop рдЪрд▓рдирд╛ рдкрд░ RunLoop рд╕рд┐рд╕реНрдЯрдо рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ рдЦреБрд▓реЗ рд▓реЗрдирджреЗрди рдХреЛ рдмрдВрдж рдХрд░ рджреЗрддрд╛ рд╣реИ рдФрд░ рдХрд┐рдП рдЧрдП рдкрд░рд┐рд╡рд░реНрддрдиреЛрдВ ( CATransaction.commit ) рдХреЛ рд▓рд╛рдЧреВ рдХрд░рддрд╛ рд╣реИред


рдзреНрдпрд╛рди рджреЛ! рдкреБрдирд░рд╛рд╡реГрддреНрддрд┐рдпреЛрдВ рдХреА рд╕рдВрдЦреНрдпрд╛ RunLoop рд╕реНрдХреНрд░реАрди рдХреА рддрд╛рдЬрд╝рд╛ рджрд░ рдкрд░ рдирд┐рд░реНрднрд░ рдирд╣реАрдВ рдХрд░рддреА рд╣реИред рдЪрдХреНрд░ рд╕реНрдХреНрд░реАрди рдХреЗ рд╕рд╛рде рд╕рдордХрд╛рд▓рд┐рдХ рдирд╣реАрдВ рд╣реИ рдФрд░ "рдЕрдВрддрд╣реАрди while() " рдХреА рддрд░рд╣ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред


рдЕрдм рджреЗрдЦрддреЗ рд╣реИрдВ рдХрд┐ рд╕реНрдХреНрд░реЙрд▓ рдХреЗ рджреМрд░рд╛рди рдореБрдЦреНрдп рдереНрд░реЗрдб рдкрд░ RunLoop рдкреБрдирд░рд╛рд╡реГрддреНрддрд┐рдпреЛрдВ рдореЗрдВ рдХреНрдпрд╛ рд╣реЛрддрд╛ рд╣реИ:


  ... if (dispatchBlocks.count > 0) { //   MainQueue doBlocks() } ... if (hasPanEvent) { handlePan() // UIScrollView change content offset -> change bounds } ... if (hasCATransaction) { CATransaction.commit() } ... 

рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рдкреНрд░реЗрд╖рдг_ dispatch_async / dispatch_sync рдорд╛рдзреНрдпрдо рд╕реЗ рдореБрдЦреНрдп рдХрддрд╛рд░ рдореЗрдВ рдЬреЛрдбрд╝реЗ рдЧрдП рдмреНрд▓реЙрдХ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд┐рдП рдЬрд╛рддреЗ рд╣реИрдВред рдФрд░ рдЬрдм рддрдХ рд╡реЗ рдкреВрд░рд╛ рдирд╣реАрдВ рд╣реЛ рдЬрд╛рддреЗ, рддрдм рддрдХ рдХрд╛рд░реНрдпрдХреНрд░рдо рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рд▓рд┐рдП рдЖрдЧреЗ рдирд╣реАрдВ рдмрдврд╝рддрд╛ рд╣реИред


рдЗрд╕рдХреЗ рдмрд╛рдж, UIKit рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЗ рдкреИрди-рдЬреЗрд╕реНрдЪрд░ рдХреА рдкреНрд░рдХреНрд░рд┐рдпрд╛ рд╢реБрд░реВ рдХрд░рддрд╛ рд╣реИ ред рдЗрд╕ рдЗрд╢рд╛рд░реЗ рдХреЛ рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд░рдиреЗ рдХреЗ рднрд╛рдЧ рдХреЗ рд░реВрдк рдореЗрдВ, UIScrollView.contentOffset рдмрджрд▓рддрд╛ рд╣реИ, рдФрд░ рдкрд░рд┐рдгрд╛рдорд╕реНрд╡рд░реВрдк, UIScrollView.bounds ред UIScrollView рдХреА bounds рдмрджрд▓рдирд╛ (рдХреНрд░рдорд╢рдГ, рдФрд░ рдЗрд╕рдХреЗ рд╡рдВрд╢рдЬ UITableView , UICollectionView ) рд╕рд╛рдордЧреНрд░реА рдХреЗ рджреГрд╢реНрдп рднрд╛рдЧ ( viewport ) рдХреЛ рдЕрджреНрдпрддрди рдХрд░рддрд╛ рд╣реИред


RunLoop рдкреБрдирд░рд╛рд╡реГрддреНрддрд┐ рдХреЗ рдЕрдВрдд рдореЗрдВ, рдпрджрд┐ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдЦреБрд▓рд╛ рд▓реЗрдирджреЗрди рд╣реИ, рддреЛ commit рдпрд╛ flush рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ рд╣реЛрддрд╛ рд╣реИред


рдпрд╣ рдХреИрд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ, рдпрд╣ рдЬрд╛рдВрдЪрдиреЗ рдХреЗ рд▓рд┐рдП, рдЙрдЪрд┐рдд рд╕реНрдерд╛рдиреЛрдВ рдкрд░ рдмреНрд░реЗрдХрдкреЙрдЗрдВрдЯ рд▓рдЧрд╛рдПрдВред
рдпрд╣рд╛рдВ рдмрддрд╛рдпрд╛ рдЧрдпрд╛ рд╣реИ рдХрд┐ рдЬреЗрд╕реНрдЪрд░ рдкреНрд░реЛрд╕реЗрд╕рд┐рдВрдЧ рдХреИрд╕рд╛ рджрд┐рдЦреЗрдЧрд╛:



рдФрд░ рдпрд╣рд╛рдБ handlePan рдмрд╛рдж handlePan :



рд╕реНрдХреНрд░реЙрд▓ CADisplayLink рджреМрд░рд╛рди, UIScrollView рд╕реНрдХреНрд░реАрди рд░рд┐рдлреНрд░реЗрд╢ рджрд░ рдХреЗ рд╕рд╛рде рдкреНрд░рддрд┐ рд╕реЗрдХрдВрдб CADisplayLink рдмрджрд▓рд╛рд╡ рдХреА рд╕рдВрдЦреНрдпрд╛ рдХреЛ рд╕рд┐рдВрдХреНрд░рдирд╛рдЗрдЬрд╝ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ CADisplayLink рдЯрд╛рдЗрдорд░ рдмрдирд╛рддрд╛ рд╣реИред



рд╣рдо CATransaction.commit рдХрд┐ RunLoop рдкреБрдирд░рд╛рд╡реГрддреНрддрд┐ рдХреЗ рдЕрдВрдд рдореЗрдВ рдирд╣реАрдВ рд╣реЛрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рд╕реАрдзреЗ CADisplayLink рдЯрд╛рдЗрдорд░ рдХреЗ рдкреНрд░рд╕рдВрд╕реНрдХрд░рдг рдореЗрдВ рд╣реЛрддрд╛ рд╣реИред рд▓реЗрдХрд┐рди рдЗрд╕рд╕реЗ рдХреЛрдИ рдлрд░реНрдХ рдирд╣реАрдВ рдкрдбрд╝рддрд╛:



4.2ред CATransaction.commit


рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, CATransaction.commit рдЕрдВрджрд░ рдХреЗ рд╕рднреА рдСрдкрд░реЗрд╢рди рдХреЛ CALayer рд▓реЗрдпрд░реНрд╕ рдкрд░ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рд▓реЗрдЖрдЙрдЯ ( drawLayer ) рдФрд░ рдЫрд╡рд┐ ( drawLayer ) рдХреЛ рдЕрдкрдбреЗрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП layoutSublayers рдХреА рдЕрдкрдиреА рд╡рд┐рдзрд┐рдпрд╛рдБ рд╣реИрдВред рдЗрди рд╡рд┐рдзрд┐рдпреЛрдВ рдХреЗ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЗ рдкрд░рд┐рдгрд╛рдорд╕реНрд╡рд░реВрдк рдкреНрд░рддрд┐рдирд┐рдзрд┐ рдкрджреНрдзрддрд┐ рдХреЙрд▓ рд╣реЛрддреА рд╣реИред UIView рдХреА рдирдИ рдЖрд╡реГрддреНрддрд┐ рдХреЛ UIView рдкрджрд╛рдиреБрдХреНрд░рдо рдореЗрдВ рдЬреЛрдбрд╝рдХрд░, рд╣рдо рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдХреЛрд░ рдПрдирд┐рдореЗрд╢рди рдкрд░рдд рдкрджрд╛рдиреБрдХреНрд░рдо рдореЗрдВ рд╕рдВрдмрдВрдзрд┐рдд рдкрд░рдд рдЬреЛрдбрд╝рддреЗ рд╣реИрдВред рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ, UIView рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ рдЕрдкрдиреА рдкрд░рдд рдХрд╛ рдПрдХ рдкреНрд░рддрд┐рдирд┐рдзрд┐ рд╣реИред рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рдХреЙрд▓ рд╕реНрдЯреИрдХ рд╕реЗ рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ, UIView CALayer рдкреНрд░рддрд┐рдирд┐рдзрд┐ рд╡рд┐рдзрд┐рдпреЛрдВ рдХреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЗ рднрд╛рдЧ рдХреЗ рд░реВрдк рдореЗрдВ, рдЕрдкрдиреЗ рддрд░реАрдХреЛрдВ рдХреЛ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░рддрд╛ рд╣реИ, рдЬрд┐рд╕ рдкрд░ рдЪрд░реНрдЪрд╛ рдХреА рдЬрд╛рдПрдЧреА:



рдЪреВрдБрдХрд┐ рд╣рдо рдЖрдорддреМрд░ рдкрд░ UIView рдкрджрд╛рдиреБрдХреНрд░рдо рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рддреЗ рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП рд╡рд┐рд╡рд░рдг UIView рдЙрджрд╛рд╣рд░рдгреЛрдВ рдХреЗ рд╕рд╛рде рдЖрдЧреЗ рдмрдврд╝реЗрдЧрд╛ред


setNeedsLayout рджреМрд░рд╛рди, setNeedsLayout рдХреЗ рд╕рд╛рде рдЪрд┐рд╣реНрдирд┐рдд рд╕рднреА UIView рдХреЗ рд▓реЗрдЖрдЙрдЯ setNeedsLayout ред рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ рдПрдХ рдмрд╛рд░ рдлрд┐рд░ рд╣рдо рдЦреБрдж layoutIfNeeded рдЕрдВрджрд░ рд╕рд┐рд╕реНрдЯрдо рдореЗрдВ рдЙрдирдХреЗ рдЧрд╛рд░рдВрдЯреАрдХреГрдд рдЖрд╕реНрдердЧрд┐рдд рдирд┐рд╖реНрдкрд╛рджрди рдХреЗ рдХрд╛рд░рдг layoutIfNeeded рдпрд╛ layoutIfNeeded рдирд╣реАрдВ рдХрд╣рддреЗ рд╣реИрдВред рдпрд╣рд╛рдВ рддрдХ тАЛтАЛрдХрд┐ рдЕрдЧрд░ рдПрдХ рд▓реЗрди-рджреЗрди рдореЗрдВ ( setNeedsLayout рдФрд░ setNeedsLayout рд▓рд┐рдП рдХреЙрд▓ рдХреЗ рдмреАрдЪ) рдЖрдк рдХрдИ рдмрд╛рд░ frame рдмрджрд▓рддреЗ рд╣реИрдВ рдФрд░ setNeedsLayout рдХреЙрд▓ setNeedsLayout , рддреЛ рдкреНрд░рддреНрдпреЗрдХ рдкрд░рд┐рд╡рд░реНрддрди рддреБрд░рдВрдд рд▓рд╛рдЧреВ рдирд╣реАрдВ рд╣реЛрдЧрд╛ред рдЕрдВрддрд┐рдо рдкрд░рд┐рд╡рд░реНрддрди рдХреЗрд╡рд▓ CATransaction.commit рдХреЛ рдХреЙрд▓ рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж рдкреНрд░рднрд╛рд╡реА рд╣реЛрдВрдЧреЗред рдкреНрд░рд╛рд╕рдВрдЧрд┐рдХ CALayer рд╡рд┐рдзрд┐рдпрд╛рдБ: setNeedsLayout , layoutIfNeeded рдФрд░ layoutIfNeeded ред


рдбреНрд░реЙрдЗрдВрдЧ рдХреЗ рд▓рд┐рдП рдПрдХ рд╕рдорд╛рди рдЧреБрдЪреНрдЫрд╛ setNeedsDisplay рдФрд░ setNeedsDisplay рд╡рд┐рдзрд┐рдпреЛрдВ рджреНрд╡рд╛рд░рд╛ рдмрдирд╛рдпрд╛ рдЧрдпрд╛ рд╣реИред CALayer рдпрд╣ setNeedsDisplay , displayIfNeeded рдФрд░ drawLayer ред CATransaction.commit рдХрд┐рдП рдЧрдП рд╕рднреА рддрд░реАрдХреЛрдВ рдХреЛ рдХреЙрд▓ рдХрд░рддрд╛ рд╣реИ рдЬреЛ setNeedsDisplay рдХреЗ рд╕рд╛рде рдЪрд┐рд╣реНрдирд┐рдд рд╣реИрдВред рдЗрд╕ рдХрджрдо рдХреЛ рдХрднреА-рдХрднреА рдСрдлрд╕реНрдХреНрд░реАрди-рдбреНрд░рд╛рдЗрдВрдЧ рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИред


рдПрдХ рдЙрджрд╛рд╣рд░рдг рд╣реИ ред рд╡рд┐рд╢рд┐рд╖реНрдЯрддрд╛ рдФрд░ рд╕реБрд╡рд┐рдзрд╛ рдХреЗ рд▓рд┐рдП, UITableView :


  ... // Layout UITableView.layoutSubviews() //  ,   .. ... // Offscreen drawing UITableView.drawRect() //    ... 

UIKit UICollectionView UITableView / UICollectionView рдХрд╛ UICollectionView : рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИред willDisplayCell : willDisplayCell рдкреНрд░рддрд┐рдирд┐рдзрд┐ willDisplayCell рдФрд░ рдЗрддрдиреЗ рдкрд░ред drawInContext рджреМрд░рд╛рди, drawInContext -рдбреНрд░реЙрдЗрдВрдЧ рд╣реЛрддреА рд╣реИ: рд╕рднреА рд▓реЗрдпрд░реНрд╕ рдХреЗ drawInContext рдореЗрдердбреНрд╕ рдпрд╛ setNeedsDisplay рдХреЗ рд░реВрдк рдореЗрдВ рдЪрд┐рд╣реНрдирд┐рдд рд╕рднреА UIView setNeedsDisplay рдХреЛ setNeedsDisplay ред рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЬрдм рд╣рдо рдХреБрдЫ рдЖрдХрд░реНрд╖рд┐рдд рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдпрд╣ рдореБрдЦреНрдп рдзрд╛рдЧреЗ рдкрд░ рд╣реЛрддрд╛ рд╣реИ, рдФрд░ рд╣рдореЗрдВ рддрддреНрдХрд╛рд▓ рдПрдХ рдирдП рдлреНрд░реЗрдо рдХреЗ рд▓рд┐рдП рдкрд░рддреЛрдВ рдХреЗ рдкреНрд░рджрд░реНрд╢рди рдХреЛ рдмрджрд▓рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдпрд╣ рд╕реНрдкрд╖реНрдЯ рд╣реИ рдХрд┐ рдЗрд╕ рддрд░рд╣ рдХрд╛ рд╕рдорд╛рдзрд╛рди рдмрд╣реБрдд рдЕрдХреНрд╖рдо рд╣реЛ рд╕рдХрддрд╛ рд╣реИред


CATransaction.commit рдореЗрдВ рдЖрдЧреЗ рдХреНрдпрд╛ рд╣реЛрддрд╛ рд╣реИ? рд░реЗрдВрдбрд░ рдЯреНрд░реА рд░реЗрдВрдбрд░ рд╕рд░реНрд╡рд░ рдХреЛ рднреЗрдЬрд╛ рдЬрд╛рддрд╛ рд╣реИред


4.3ред рд░реЗрдВрдбрд░рд┐рдВрдЧ рдкрд╛рдЗрдкрд▓рд╛рдЗрди


IOS рдореЗрдВ рдПрдХ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдлреНрд░реЗрдо рдмрдирд╛рдиреЗ рдХреА рдкреВрд░реА рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЛ рдпрд╛рдж рдХрд░реЗрдВ (рдкрд╛рдЗрдкрд▓рд╛рдЗрди рдХреА рд╡реНрдпрд╛рдЦреНрдпрд╛ рдХрд░реЗрдВ [WWDC 2014 рд╕рддреНрд░ 419ред iOS рдРрдк рдХреЗ рд▓рд┐рдП рдЙрдиреНрдирдд рдЧреНрд░рд╛рдлрд┐рдХреНрд╕ рдФрд░ рдПрдирд┐рдореЗрд╢рди):



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


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


рджрд┐рд▓рдЪрд╕реНрдк рд╣реИ, рдлреНрд░реЗрдо рдмрдирд╛рддреЗ рд╕рдордп, рдПрдХ рдирд┐рд╢реНрдЪрд┐рдд "рдорд▓реНрдЯреАрдереНрд░реЗрдбрд┐рдВрдЧ" рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдпрджрд┐ рд╕реНрдХреНрд░реАрди рд░рд┐рдлреНрд░реЗрд╢ рджрд░ 60 рдлреНрд░реЗрдо рдкреНрд░рддрд┐ рд╕реЗрдХрдВрдб рд╣реИ, рддреЛ рдПрдХ рдирдпрд╛ рдлреНрд░реЗрдо рдХреБрд▓ рдорд┐рд▓рд╛рдХрд░ 1/60 рдореЗрдВ рдирд╣реАрдВ, рдмрд▓реНрдХрд┐ рдПрдХ рд╕реЗрдХрдВрдб рдХреЗ 1/30 рдореЗрдВ рдмрдирддрд╛ рд╣реИред рдРрд╕рд╛ рдЗрд╕рд▓рд┐рдП рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдирдпрд╛ рдлрд╝реНрд░реЗрдо рддреИрдпрд╛рд░ рдХрд░ рд░рд╣рд╛ рд╣реИ, рд░реЗрдВрдбрд░ рд╕рд░реНрд╡рд░ рдЕрднреА рднреА рдкрд┐рдЫрд▓реЗ рдПрдХ рдХреЛ рдкреНрд░реЛрд╕реЗрд╕ рдХрд░ рд░рд╣рд╛ рд╣реИ:



рдореЛрдЯреЗ рддреМрд░ рдкрд░, рд╕реНрдХреНрд░реАрди рдкрд░ рдкреНрд░рджрд░реНрд╢рд┐рдд рд╣реЛрдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рдлреНрд░реЗрдо рдХреЗ рдирд┐рд░реНрдорд╛рдг рдХрд╛ рдХреБрд▓ рд╕рдордп рд▓реЗрдирджреЗрди рдХреЗ рдЧрдарди рдХреЗ рд▓рд┐рдП рд╣рдорд╛рд░реА рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдореЗрдВ 1/60 рд╕реЗрдХрдВрдб рдФрд░ рд▓реЗрдирджреЗрди рдкреНрд░рд╕рдВрд╕реНрдХрд░рдг рдХреЗ рджреМрд░рд╛рди рд░реЗрдВрдбрд░ рд╕рд░реНрд╡рд░ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдореЗрдВ 1/60 рд╕реЗрдХрдВрдб рдХрд╛ рд╣реЛрддрд╛ рд╣реИред


рдореИрдВ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдЯрд┐рдкреНрдкрдгреА рдХрд░рдирд╛ рдЪрд╛рд╣реВрдВрдЧрд╛ред рд╣рдо рдЦреБрдж рдкрд░рддреЛрдВ рдХреА рдбреНрд░рд╛рдЗрдВрдЧ рдХреЛ рд╕рдорд╛рдирд╛рдВрддрд░ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдкреГрд╖реНрдарднреВрдорд┐ рд╕реНрдЯреНрд░реАрдо рдореЗрдВ UIImage / CGImage рдХреА рд╕рд╛рдордЧреНрд░реА рдХреЛ рдкреНрд░рд╕реНрддреБрдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдЙрд╕рдХреЗ рдмрд╛рдж, рдореБрдЦреНрдп рдзрд╛рдЧреЗ рдореЗрдВ, рдЖрдкрдХреЛ рдмрдирд╛рдИ рдЧрдИ рдЫрд╡рд┐ рдХреЛ CALayer.contents рд╕рдВрдкрддреНрддрд┐ рдореЗрдВ рдЕрд╕рд╛рдЗрди рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред рдкреНрд░рджрд░реНрд╢рди рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рдпрд╣ рдПрдХ рдмрд╣реБрдд рдЕрдЪреНрдЫрд╛ рджреГрд╖реНрдЯрд┐рдХреЛрдг рд╣реИред рдпрд╣ рдбреЗрд╡рд▓рдкрд░реНрд╕ рд╣реИ рдЬреЛ рдЗрд╕реЗ рдмрдирд╛рд╡рдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВред рд▓реЗрдХрд┐рди рдЪреВрдБрдХрд┐ рд╣рдо рдЕрдкрдиреЗ рдЖрд╡реЗрджрди рдХреА рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдореЗрдВ рд▓реЗрди-рджреЗрди рдЙрддреНрдкрдиреНрди рдХрд░рдиреЗ рдХреА рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдореЗрдВ рдХреЗрд╡рд▓ CALayer.contents рдХреЛ рдмрджрд▓ рд╕рдХрддреЗ рд╣реИрдВ, рд╣рдорд╛рд░реЗ рдкрд╛рд╕ 1/30 рд╕реЗрдХрдВрдб (рд░реЗрдВрдбрд░ рд╕рд░реНрд╡рд░ рдХреЗ рд╕рд╛рде рд░реЗрдВрдбрд░рд┐рдВрдЧ рдкрд╛рдЗрдкрд▓рд╛рдЗрди рдХреЗ рд╕рдорд╛рдирд╛рдВрддрд░ рдФрд░ рдЦрд╛рддреЗ рдХреЗ рдЕрдиреБрдХреВрд▓рди рдХреЛ рдзреНрдпрд╛рди рдореЗрдВ рд░рдЦрддреЗ рд╣реБрдП) рдПрдХ рдирдИ рдЫрд╡рд┐ рдмрдирд╛рдиреЗ рдФрд░ рд╕реНрдерд╛рдирд╛рдкрдиреНрди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХреЗрд╡рд▓ 60 рдлреНрд░реЗрдо рдкрд░ 1/60 рд╕реЗрдХрдВрдб рд╣реИрдВред )ред


рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рд░реЗрдВрдбрд░ рд╕рд░реНрд╡рд░ рдЕрднреА рднреА рд╕рдореНрдорд┐рд╢реНрд░рдг (рдиреАрдЪреЗ рджреЗрдЦреЗрдВ) рдФрд░ рд╢реЙрд░реНрдЯ-рдЯрд░реНрдо рд▓реЗрдпрд░ рдХреИрд╢рд┐рдВрдЧ [iOS рдХреЛрд░ рдПрдирд┐рдореЗрд╢рди: рдПрдбрд╡рд╛рдВрд╕реНрдб рдЯреЗрдХреНрдиреАрдХреНрд╕ рдХреЛ рд╕рдВрднрд╛рд▓ рд╕рдХрддрд╛ рд╣реИред Nick Lockwood]. 1/60 CALayer.contents , . .


: , .


4.4.


Main-thread



1. ( CATransaction.commit ) - UIView.layoutSubviews UIView (, CALayer ). , layoutSubviews / cellForRow / willDisplayCell .


2. drawInContext / drawRect . - Main- ( CATransaction.commit ) тАФ . , .


3. . . CATransaction.commit , , .


4. . UIImage / CGImage .


5. . Main-thread , scroll. - , UI.


6. Main-. , RunLoop Main- , , Main-. .


GPU



Blending . GPU ( Render Server GPU, ). , , Background-.


. , UIBlurEffect , UIVibrancyEffect , , (Render Pass). , , .


Offscreen rendering (Render Server)



Render Server . , , :



CALayer , , Offscreen rendering. , UIVisualEffect ( , Render Server CPU, GPU).


, .




5.


, , Time Profiler. Metal System Trace тАФ Time Profiler .


5.1. Metal System Trace


, ( ). , : , .


, Metal System Trace , . , Render Server. , Main-, тАФ , .



- , :



Metal System Trace . 64- , iPhone 5s. , . , - , , UI.


5.2.


. , - - . , CADisplayLink .


CADisplayLink timestamp тАФ ( Render Server). CADisplayLink.timestamp timestamp . , (, 1/60 ) :


  //  CADisplayLink. link = [CADisplayLink displayLinkWithTarget:target selector:selector] [link addToRunLoop:[NSRunLoop mainRunLoop] forMode:UITrackingRunLoopMode] //    CADisplayLink : diff = prevTimestamp - link.timestamp if (diff > 1/fps) { //  freeze } prevTimestamp = link.timestamp 

CADisplayLink UITrackingRunLoopMode , .


Rendering Pipeline:


UI-, . ┬л┬╗ freezeFrameTimeRate :


 scrollTime //    Scroll freezeFrameTime //    ,  "",       freezeFrameTimeRate = freezeFrameTime / scrollTime 

, - UIView . , ┬л┬╗:



, , ┬л UIView ┬╗ . рдХреНрдпреЛрдВ? , . , , , : CADisplayLink , Render Server link.timetamp , Render Server , . 60 UI-, Render Server. Render Server , .


, , , Render Server . Metal , Render Server. , , iOS, Render Server .


.


, , . , .


: тАФ ! тАФ .




рдирд┐рд╖реНрдХрд░реНрд╖


тАФ . , , .





, тАФ . , .


, :


  1. Apple .
  2. Auto Layout .
  3. The Cassowary Linear Arithmetic Constraint Solving Algorithm .
  4. iOS Core Animation: Advanced Techniques. Nick Lockwood.
  5. WWDC 2014 Session 419. Advanced Graphics and Animations for iOS Apps.

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


All Articles