UICollectionViewLayout рдХрд╛ рдЕрдиреБрдХреВрд▓рдиред рдХрд▓рд╛ рдХреЗ рдирд╛рдо рдкрд░

рд╣реЗ рд╕рдм рд▓реЛрдЧ!

рдкрд░рд┐рдЪрдп


рдореИрдВ рдирд┐рдХрдЯрддрдо рд╡рд┐рджреЗрд╢реА рджреЗрд╢ (рд░реВрд╕ рдореЗрдВ) рдХреЗ рдПрдХ рдкреНрд░рд╛рдВрддреАрдп рджреЗрд╢ рдХреЗ рдПрдХ рдкреНрд░рд╛рдВрддреАрдп рд╢рд╣рд░ рдореЗрдВ рдПрдХ рдЖрдИрдУрдПрд╕ рдбреЗрд╡рд▓рдкрд░ рдХреЗ рд░реВрдк рдореЗрдВ рдХрд╛рдо рдХрд░рддрд╛ рд╣реВрдВред рд▓рдЧрднрдЧ рдбреЗрдврд╝ рд╕рд╛рд▓ рдкрд╣рд▓реЗ, рджреЗрд╢ рдиреЗ рдлреИрд╕рд▓рд╛ рдХрд┐рдпрд╛ рдХрд┐ рдореИрдВрдиреЗ рдЙрд╕реЗ рдХреБрдЫ рджрд┐рдпрд╛ рд╣реИ, рдФрд░ рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ: рдореИрдВрдиреЗ рдЕрдкрдиреЗ рдЬреАрд╡рди рдХреЗ рд▓рд┐рдП рдПрдХ рд╕рд╛рд▓, рдХрдо рдХреБрд╢рд▓ рдХрд╛рдо рдХрд╛ рдПрдХ рд╕рд╛рд▓, рдЕрдкрдиреЗ рдкрд░рд┐рд╡рд╛рд░ рдФрд░ рдХрд╛рдо рдкрд░ рдШрд░ рд▓реМрдЯрдиреЗ рдХреЗ рдПрдХ рд╕рд╛рд▓ рдХреЗ рд▓рд┐рдП рдмрдХрд╛рдпрд╛ ... - рд╕рдВрдХреНрд╖реЗрдк рдореЗрдВ, рдореБрдЭреЗ рд╕реЗрдирд╛ рдореЗрдВ рдбреНрд░рд╛рдлреНрдЯ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред рдФрд░ рдЗрд╕ рдорд╛рдорд▓реЗ рдХреЗ рд▓рд┐рдП, рдореИрдВ рдХрд┐рд╕реА рднреА рддрд░рд╣ рдЕрдкрдиреЗ рд╕рднреА рдлреАрдЪрд░реНрд╕ рдХреЗ рд╕рд╛рде iOS 6 рдХреЛ рдЬрд╛рд░реА рдХрд░рдиреЗ рд╕реЗ рдЪреВрдХ рдЧрдпрд╛, рдЬрд┐рд╕рдореЗрдВ рд▓рдВрдмреЗ рд╕рдордп рд╕реЗ рдЕрдзрд┐рдХ рдпреВрдЖрдИрд╕реАрдУрд▓реЗрдХреНрдЯрд┐рдпрди рд╡реНрдпреВ рднреА рд╢рд╛рдорд┐рд▓ рд╣реИред
рдЖрдЙрдЯрдлрд┐рдЯреНрд╕, рдЯреНрд░реЗрдирд┐рдВрдЧ рдЧреНрд░рд╛рдЙрдВрдбреНрд╕, рдПрдХ рдЪрд╛рд░реНрдЯрд░ рдФрд░ рдЕрдиреНрдп рдЖрдХрд░реНрд╖рдХ рдЪреАрдЬреЛрдВ рдХреЗ рд╕рд╛рде рд╕рдорд╛рдкреНрдд рд╣реЛрдиреЗ рдХреЗ рдмрд╛рдж, рдореИрдВ рдШрд░ рд▓реМрдЯ рдЖрдпрд╛, рдлрд┐рд░ рд╕реЗ рдХрд╛рдо рдХрд░рдирд╛ рд╢реБрд░реВ рдХрд░ рджрд┐рдпрд╛, рдФрд░ рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рдПрдХ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдЬрд┐рд╕рдореЗрдВ рдЧреНрд░рд╛рд╣рдХ рдХреЛ рдбреЗрдЯрд╛ рдХреЛ "рдкрд┐рдиреНрдЯрд░реЗрд╕реНрдЯ рдмреЛрд░реНрдб" рдХреЗ рд░реВрдк рдореЗрдВ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдереА, рдЕрд░реНрдерд╛рддреН, UICollectionView рд╣реА, рдЗрдВрддрдЬрд╛рд░ рдирд╣реАрдВ рдХрд┐рдпрд╛ред

рдкрд░рд┐рдпреЛрдЬрдирд╛


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

UICollectionViewFlowLayout


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

рдУрд╣ рддрд╕реНрд╡реАрд░!
рдЪрд┐рддреНрд░рд╛ # 0 - рдбреЗрд╡рд▓рдкрд░ рдорд╛рдирддрд╛ рд╣реИ, рдФрд░ UICollectionViewFlowLayout рд╣реИ

UICollectionViewFlowLayout

рдЖрдк рд╕реНрдХреНрд░реАрдирд╢реЙрдЯ рдореЗрдВ рджреЛ рдЪреАрдЬреЗрдВ рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВред


RFQuiltLayout


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

- (CGSize) blockSizeForItemAtIndexPath:(NSIndexPath *)indexPath; 

рдкреНрд░рддреНрдпреЗрдХ рдХреЛрд╢рд┐рдХрд╛ рдХреЗ рдмреНрд▓реЙрдХрдкрд┐рдХреНрд╕рд▓реНрд╕ рдХреЗ рд▓рд┐рдП рдЧреБрдгрдХ рд▓реМрдЯрд╛рддрд╛ рд╣реИред рдпрд╣реА рд╣реИ, рдЕрдЧрд░ blockPixels = {100, 100}, рдФрд░ blockSizeForItemAtIndexPath = {2.2, 0.8}, рддреЛ рд╕реЗрд▓ рдХрд╛ рдЖрдХрд╛рд░ {220, 80} рд╣реЛрдЧрд╛ред
рдореЗрд░реА рд░рд╛рдп рдореЗрдВ, рдпрд╣ рдереЛрдбрд╝рд╛ рдЕрдЬреАрдм рд╕рд┐рд╕реНрдЯрдо рд╣реИ, рдореИрдВ {1, 1} рдХреЛ рдмреНрд▓реЙрдХрдкрд┐рдХреНрд╕рд▓ рд╕реЗрдЯ рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ рдФрд░ рдкреНрд░рддрд┐рдирд┐рдзрд┐ рд╡рд┐рдзрд┐ рдореЗрдВ рддрддреНрд╡ рдХреЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХ рдЖрдХрд╛рд░ рд╡рд╛рдкрд╕ рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ, рд▓реЗрдХрд┐рди рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ рдкреНрд▓реЗрд╕рдореЗрдВрдЯ рдПрд▓реНрдЧреЛрд░рд┐рджрдо 15 рддрддреНрд╡реЛрдВ рдХреЗ рд▓рд┐рдП рднреА рдмрд╣реБрдд рд▓рдВрдмрд╛ рд╕рдордп рд▓реЗрддрд╛ рд╣реИ, рдФрд░ рдЗрд╕реЗ рдЬрдЧрд╣ рджреЗрдиреЗ рдореЗрдВ 100 рддрддреНрд╡ рд▓рдЧрддреЗ рд╣реИрдВред рдЖрдИрдкреИрдб рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдХрдВрдкреНрдпреВрдЯрд┐рдВрдЧ рдкрд╛рд╡рд░ рдЕрдЪрд╛рдирдХред рдореЗрд░реЗ рдкрд╛рд╕ рдзреИрд░реНрдп рдХреЗ рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рдХреЛ рдЕрд▓рдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкрд░реНрдпрд╛рдкреНрдд рд╕рдордп рдирд╣реАрдВ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдореИрдВрдиреЗ рдЪрдпрди рд╡рд┐рдзрд┐ рджреНрд╡рд╛рд░рд╛ рдмреНрд▓реЙрдХрдкрд┐рдХреНрд╕рд▓ рдХреЗ рд▓рд┐рдП {20, 20} рдХрд╛ рдореВрд▓реНрдп рдЪреБрдирд╛, рдЬрд┐рд╕рдиреЗ рдореЗрд░реА 15 рдХреЛрд╢рд┐рдХрд╛рдУрдВ рдХреЗ рд╕рд╛рде, рд╕рд╛рдорд╛рдиреНрдп рдкреНрд░рджрд░реНрд╢рди рдФрд░ рдЕрдЪреНрдЫреА рдкреНрд▓реЗрд╕рдореЗрдВрдЯ рд╕рдЯреАрдХрддрд╛ рджреАред
рдлрдЯреА рдПрдбрд╝рд┐рдпреЛрдВ рдХреЛ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП, рдореБрдЭреЗ рдереЛрдбрд╝реА рд╕реА рдЪрд╛рд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдкрдбрд╝рд╛ - рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рдореИрдВрдиреЗ рд╕реЗрд▓ рдХреЗ рдЖрдХрд╛рд░реЛрдВ рдХреЛ рд╕реНрд╡рдпрдВ рдирд╣реАрдВ рдЫреБрдЖ, рдХреНрдпреЛрдВрдХрд┐ рдкреНрд▓реЗрд╕рдореЗрдВрдЯ рдХреЗ рдЪрд░рдг рдореЗрдВ рдореБрдЭреЗ рдпрд╣ рдкрддрд╛ рдирд╣реАрдВ рдЪрд▓ рдкрд╛рдпрд╛ рдХрд┐ рд╕реЗрд▓ рдХрд┐рд╕ рдкрдВрдХреНрддрд┐ рдореЗрдВ рд╣реИ, рд▓реЗрдХрд┐рди рддрд╕реНрд╡реАрд░ рдХреЛ рд╕реНрдерд╛рдкрд┐рдд рдХрд░рддреЗ рд╕рдордп рдореИрдВрдиреЗ рдкрдВрдХреНрддрд┐ рдХреА рдЬрд╛рдБрдЪ рдХреА рдФрд░ рдкрд╣рд▓реА рдФрд░ рдЖрдЦрд┐рд░реА рдкрдВрдХреНрддрд┐рдпреЛрдВ рдХреЗ рд▓рд┐рдП рдкрдВрдХреНрддрд┐рдпреЛрдВ рдХреА рдКрдВрдЪрд╛рдИ рдХрдо рдХреА рддрд╕реНрд╡реАрд░реЗрдВред рдЫрд╡рд┐рдпреЛрдВ рдХреЛ рдКрдкрд░ рдФрд░ рдиреАрдЪреЗ рд╕реЗ рдереЛрдбрд╝рд╛ рдХрд╛рдЯ рджрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред рдпрджрд┐ рдмрд╣реБрдд рдХреБрдЫ, рдЬрд┐рд╕рдХреА рддрд╕реНрд╡реАрд░ рдХреНрд░реЙрдкрд┐рдВрдЧ рдХреЗ рддрд╣рдд рдЖрдИ рдереА, рдПрдХ рдЪрд┐рддреНрд░ рдерд╛, рддреЛ рд▓реЛрдЧреЛрдВ рдиреЗ рдореБрдХреБрдЯ рдФрд░ рдЙрдирдХреА рдЫрд╛рддреА рдХреЗ рдиреАрдЪреЗ рдЦреЛ рджрд┐рдпрд╛, рдЕрдЧрд░ рдмрд╣реБрдд рдЪреАрдиреА рдореВрд░реНрддрд┐рдХрд▓рд╛ рдерд╛, рддреЛ рдбреНрд░реИрдЧрди рдмрд┐рдирд╛ рд╢рд┐рдЦрд╛ рдХреЗ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛, рдФрд░ рдлрд╝рд╛рд░рд╕реА рдХрд╛рд▓реАрдиреЛрдВ рдкрд░ рдЧрдВрджреЗ рд╣реИрдХ рдиреЗ рдвреЗрд░ рдХрд╛рдЯ рджрд┐рдпрд╛ред рд▓реЗрдХрд┐рди рдЧреНрд░рд╛рд╣рдХ рд╕рдВрддреБрд╖реНрдЯ рдерд╛, рдЬрд┐рд╕рдХрд╛ рдЕрд░реНрде рд╣реИ рдХрд┐ рдореИрдВ рдкреНрд░рд╕рдиреНрди рдерд╛, рддрдм рддрдХ, рдЬрдм рддрдХ рдХрд┐ рддрдХрдиреАрдХреА рд╡рд┐рд╢рд┐рд╖реНрдЯрддрд╛рдУрдВ рдХреЛ рдереЛрдбрд╝рд╛ рдареАрдХ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред рдореБрдЦреНрдп рд╕реНрдХреНрд░реАрди рдкрд░ рджрдпрдиреАрдп 15 рддрддреНрд╡реЛрдВ рдХреЗ рдмрдЬрд╛рдп, рд╕рднреА рдмрд╣реБрдд рд╕рд╛рд░реЗ рдкреНрд░рджрд░реНрд╢рд┐рдд рд╣реЛрдиреЗ рдЪрд╛рд╣рд┐рдП рдереЗред рд╕рднреА рдкрдВрджреНрд░рд╣ рд╕реМред

рдЕрдзрд┐рдХ рдХрд▓рд╛!


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

рддреЛ SKRaggyCollectionViewLayout


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

 @protocol SKRaggyCollectionViewLayoutDelegate <UICollectionViewDelegate> - (float)collectionLayout:(SKRaggyCollectionViewLayout*)layout preferredWidthForItemAtIndexPath:(NSIndexPath *)indexPath; @optional - (UIEdgeInsets)collectionLayout:(SKRaggyCollectionViewLayout*)layout edgeInsetsForItemAtIndexPath:(NSIndexPath *)indexPath; @end 

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

 @property (nonatomic, assign) NSUInteger numberOfRows; 

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

 - (CGSize)collectionViewContentSize; - (NSArray*)layoutAttributesForElementsInRect:(CGRect)bounds; - (UICollectionViewLayoutAttributes*)layoutAttributesForItemAtIndexPath:(NSIndexPath *)indexPath; - (BOOL)shouldInvalidateLayoutForBoundsChange:(CGRect)newBounds; 

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

 - (UICollectionViewLayoutAttributes *)layoutAttributesForItemAtIndexPath:(NSIndexPath *)indexPath { UIEdgeInsets insets = UIEdgeInsetsZero; if ([self.delegate respondsToSelector:@selector(collectionLayout:edgeInsetsForItemAtIndexPath:)]) { insets = [self.delegate collectionLayout:self edgeInsetsForItemAtIndexPath:indexPath]; } // Get saved frame and edge insets for given path and create attributes object with them CGRect frame = [self frameForIndexPath:indexPath]; UICollectionViewLayoutAttributes* attributes = [UICollectionViewLayoutAttributes layoutAttributesForCellWithIndexPath:indexPath]; attributes.frame = UIEdgeInsetsInsetRect(frame, insets); return attributes; } 

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

 - (CGRect)frameForIndexPath:(NSIndexPath*)path { // if there is saved frame for given path, return it NSValue *v = [self.framesByIndexPath objectForKey:path]; if (v) return [v CGRectValue]; // Find X-coordinate and a row which are the closest to the collection left corner. A cell for this path should be placed here. int currentRow = 0; float currentX = MAXFLOAT; for (int i = 0; i < self.edgeXPositions.count; i++) { float x = [[self.edgeXPositions objectAtIndex:i] floatValue]; if (x < currentX) { currentRow = i; currentX = x; } } // Calculate cell frame values based on collection height, current row, currentX, the number of rows and delegate's preferredWidthForItemAtIndexPath: value // If variableFrontierHeight is YES this value will be adjusted for the first and last rows float maxH = self.collectionView.frame.size.height; float rowMaxH = maxH / self.numberOfRows; float x = currentX; float y = rowMaxH * currentRow; float w = [self.delegate collectionLayout:self preferredWidthForItemAtIndexPath:path]; float h = self.collectionView.frame.size.height / self.numberOfRows; float newH = h; // Adjust height of the frame if we need raggy style if (self.variableFrontierHeight) { if (currentRow == 0) { float space = arc4random() % self.randomFirstRowVar; if (self.prevWasTallFirst) { space += self.fixedFirstRowVar; } self.prevWasTallFirst = !self.prevWasTallFirst; y += space; newH -= space; } else if (currentRow == self.numberOfRows - 1) { float space = arc4random() % self.randomLastRowVar; if (self.prevWasTallLast) { space += self.fixedLastRowVar; } self.prevWasTallLast = !self.prevWasTallLast; newH -= space; } } // Assure that we have preferred height more than 1 h = h <= 1 ? 1.f : h; // Adjust frame width with new value of height to save cell's right proportions w = w * newH / h; // Save new calculated data ad return [self.edgeXPositions replaceObjectAtIndex:currentRow withObject:[NSNumber numberWithFloat:x + w]]; CGRect currentRect = CGRectMake(x, y, w, newH); NSValue *value = [NSValue valueWithCGRect:currentRect]; [self.indexPathsByFrame setObject:path forKey:value]; [self.framesByIndexPath setObject:value forKey:path]; return currentRect; } 

рдпрджрд┐ рдореЗрд░рд╛ рдкрд╛рд╕реНрддрд╛ рдХреЛрдб рдФрд░ рдЕрд░реНрдз-рдЕрдВрдЧреНрд░реЗрдЬреА рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдВ рдмрд╣реБрдд рд╕реНрдкрд╖реНрдЯ рдирд╣реАрдВ рд╣реИрдВ, рддреЛ рдореИрдВ рд╕реНрдкрд╖реНрдЯрддрд╛ рдХреЗ рдЕрдзрд┐рдХ рдЕрд░рд╛рдЬрдХрддрд╛ рдХреЛ рдЫрджреНрдо рдкреГрд╖реНрда рдкрд░ рд▓рд╛рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░реВрдВрдЧрд╛:
рдпрд╣рд╛рдБ рд╡рд╣ рд╣реИ
[NSMutableDictionary рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдмреНрд░рд╛рдЙрдЬрд╝ рдХрд░рдирд╛, рдЬрд┐рд╕рдореЗрдВ рд╣рдордиреЗ indexPath рдХреБрдВрдЬрд┐рдпреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдкрд╣рд▓реЗ рдХреА рдЧрдгрдирд╛ рдХреА рдЧрдИ рдлрд╝реНрд░реЗрдореЛрдВ рдХреЛ рд╕рд╣реЗрдЬрд╛ рд╣реИ, рдЕрдЧрд░ рд╣рдореЗрдВ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдПрдХ рдЬреАрдд рд╣реИ, рддреЛ рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдФрд░ рдХреБрдЫ рдирд╣реАрдВ рд╣реИ]

[рдпрджрд┐ рдЧрдгрдирд╛ рд╕реЗ рдмрдЪрд╛ рдирд╣реАрдВ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рддреЛ рд╣рдо рдпрд╣ рдкрддрд╛ рд▓рдЧрд╛рддреЗ рд╣реИрдВ рдХрд┐ рдЕрдВрддрд┐рдо рдлреНрд░реЗрдо рдХреА рджрд╛рдИрдВ рдУрд░ рдХреМрди рд╕реА рдкрдВрдХреНрддрд┐ рддрд╛рд▓рд┐рдХрд╛ рдХреА рд╢реБрд░реБрдЖрдд рдХреЗ рд╕рдмрд╕реЗ рдХрд░реАрдм рд╣реИ - рд╡рд╣рд╛рдБ рд╣рдореЗрдВ рд╡рд░реНрддрдорд╛рди рддрддреНрд╡ рдбрд╛рд▓рдирд╛ рд╣реЛрдЧрд╛ (рдЬреИрд╕реЗ рдкреНрд░рддреНрдпреЗрдХ рдкрдВрдХреНрддрд┐ рдХреЗ рд▓рд┐рдП x рдирд┐рд░реНрджреЗрд╢рд╛рдВрдХ NSMutableAre edgeXPositions рдореЗрдВ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ)]

[рдЕрдм, рдПрдХреНрд╕ рдЕрдХреНрд╖ рдкрд░ рдкрдВрдХреНрддрд┐ рдФрд░ рд╕реНрдерд┐рддрд┐ рдХреЛ рдЬрд╛рдирдирд╛, рддрддреНрд╡ рдХреЗ рд▓рд┐рдП рдкреНрд░рддрд┐рдирд┐рдзрд┐ рджреНрд╡рд╛рд░рд╛ рдЖрд╡рд╢реНрдпрдХ рдЪреМрдбрд╝рд╛рдИ рдХреЛ рдЬрд╛рдирдирд╛, рд╣рдо рдЗрд╕рдХреЗ рдКрдкрд░реА рдмрд╛рдПрдВ рдХреЛрдиреЗ рдореЗрдВ рдЗрд╕рдХреА рд╕реНрдерд┐рддрд┐ рдХреА рдЧрдгрдирд╛ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ; рд╕рдВрдЧреНрд░рд╣ рдХреА рдКрдВрдЪрд╛рдИ рдФрд░ рдкрдВрдХреНрддрд┐рдпреЛрдВ рдХреА рд╕рдВрдЦреНрдпрд╛ рдЬрд╛рдирдиреЗ рдХреЗ рдмрд╛рдж, рд╣рдо рдЙрд╕реА рд╕рдордп рдХреА рдЧрдгрдирд╛ рдХрд░рддреЗ рд╣реИрдВ рдЬреЛ рддрддреНрд╡ рдХреА рдКрдВрдЪрд╛рдИ рд╣реИ]

[рдЕрдЧрд░ рд╣рдореЗрдВ рдХреБрдЦреНрдпрд╛рдд "рдлрдЯреЗ рдХрд┐рдирд╛рд░реЛрдВ" рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рдФрд░ рдкрдВрдХреНрддрд┐ рдкрд╣рд▓реА рдпрд╛ рдЖрдЦрд┐рд░реА рд╣реИ, рддреЛ рдЧрдгрдирд╛ рдХреА рдКрдВрдЪрд╛рдИ рдХреЛ рдереЛрдбрд╝рд╛ рдХрдо рдХрд░реЗрдВ]

[рдпрджрд┐ рд╣рдо рдКрдВрдЪрд╛рдИ рдПрдХ рд╕реЗ рдХрдо рд╣реИ рддреЛ рд╣рдо рдЗрд╕реЗ рд╕реБрд░рдХреНрд╖рд┐рдд рд░рдЦрддреЗ рд╣реИрдВ, рд╣рдо рдКрдВрдЪрд╛рдИ рдореЗрдВ рдХрдореА рдХреЗ рдЕрдиреБрдкрд╛рдд рдореЗрдВ рдЪреМрдбрд╝рд╛рдИ рдХрдо рдХрд░рддреЗ рд╣реИрдВ]

[рдкреНрд░рд╛рдкреНрдд рдореВрд▓реНрдп рдХреЛ indexPathsByFrame рдФрд░ рдлреНрд░реЗрдо рдореЗрдВ рд╕рд╣реЗрдЬреЗрдВред рднрд╡рд┐рд╖реНрдп рдореЗрдВ рддреНрд╡рд░рд┐рдд рдкрд╣реБрдБрдЪ рдХреЗ рд▓рд┐рдПByIndexPath рд╢рдмреНрджрдХреЛрд╢реЛрдВ рдФрд░ рд╡рд┐рдзрд┐ рд╕реЗ рд╡рд╛рдкрд╕ рд▓реМрдЯреЗрдВ]

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

рд╡рд╛рдкрд╕ рд╕рдВрддреЛрд╖ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдПред рдЬрд╛рд╣рд┐рд░ рд╣реИ, рдХреНрд╖реИрддрд┐рдЬ рд╕реНрдХреНрд░реЙрд▓ рдХреЗ рд╕рд╛рде рд╣рдорд╛рд░реЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рдЗрд╕реЗ рдХреБрдЫ рдЗрд╕ рддрд░рд╣ рд╕реЗ рджреЗрдЦрдирд╛ рдЪрд╛рд╣рд┐рдП:

 - (CGSize)collectionViewContentSize { return CGSizeMake(self.edgeX, self.collectionView.frame.size.height); } 

рдЬрд╣рд╛рдВ EdgeX рд╕рдмрд╕реЗ рджреВрд░ рд╕реНрдерд┐рдд рд╕реЗрд▓ рдХрд╛ X рдирд┐рд░реНрджреЗрд╢рд╛рдВрдХ рд╣реИред рдЖрдЦрд┐рд░рдХрд╛рд░, рд╣рдо рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдЬрд╛рдирддреЗ рд╣реИрдВ рдХрд┐ рд╕рднреА рдХреЛрд╢рд┐рдХрд╛рдПрдВ рдХреИрд╕реЗ рд╕реНрдерд┐рдд рд╣реИрдВред рдпрд╛ рдкрддрд╛ рдирд╣реАрдВред рдпрд╛ рд╣рдо рдЕрднреА рднреА рдЬрд╛рдирддреЗ рд╣реИрдВ ... рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдореЗрдВ рддреИрдпрд╛рд░реА рд╡рд┐рдзрд┐ рдХреЛ рдлрд┐рд░ рд╕реЗ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рдЗрд╕рдореЗрдВ рдХреЙрд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдордд рднреВрд▓рдирд╛ [рд╕реБрдкрд░ рддреИрдпрд╛рд░реА] рдФрд░ рдкреНрд░рддреНрдпреЗрдХ рд╕реЗрд▓ рдХреЗ рд▓рд┐рдП рдлреНрд░реЗрдо рдХреА рдЧрдгрдирд╛ рдХрд░реЗрдВ

 - (void)prepareLayout { [super prepareLayout]; // calculate and save frames for all indexPaths. Unfortunately, we must do it for all cells to know content size of the collection for (int i = 0; i < [self.collectionView.dataSource collectionView:self.collectionView numberOfItemsInSection:0]; i++) { NSIndexPath *path = [NSIndexPath indexPathForItem:i inSection:0]; [self frameForIndexPath:path]; } } 

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

 - (NSArray*)layoutAttributesForElementsInRect:(CGRect)bounds { if (CGRectEqualToRect(bounds, self.previousLayoutRect)) { return self.previousLayoutAttributes; } [self.previousLayoutAttributes removeAllObjects]; self.previousLayoutRect = bounds; NSArray *allFrames = self.framesByIndexPath.allValues; for (NSValue *frameValue in allFrames) { CGRect rect = [frameValue CGRectValue]; if (CGRectIntersectsRect(rect, bounds)) { [self.previousLayoutAttributes addObject:[self layoutAttributesForItemAtIndexPath:[self.indexPathsByFrame objectForKey:[NSValue valueWithCGRect:rect]]]]; } } return self.previousLayoutAttributes; } 

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


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

рдЕрдВрддрднрд╛рд╖рдг


рдореБрдЭреЗ рдЙрдореНрдореАрдж рд╣реИ рдХрд┐ рдХрд┐рд╕реА рдХреЛ рджрд┐рд▓рдЪрд╕реНрдкреА рдереА, рдХреЛрдИ рдЙрдкрдпреЛрдЧреА рдерд╛, рдФрд░ рдмрд╛рдХреА рд▓реЛрдЧреЛрдВ рдХреЛ рд╕рд┐рд░реНрдл рдЗрд╕ рдкреЛрд╕реНрдЯ рдХреЛ рдкрдврд╝рдиреЗ рдХрд╛ рдзреИрд░реНрдп рдерд╛ред рдЖрдкрдХрд╛ рдзреНрдпрд╛рди рджреЗрдиреЗ рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рджред
рдЕрдВрдд рдореЗрдВ, рдХреБрдЫ рд▓рд┐рдВрдХ:


PS рдЙрдиреНрд╣реЛрдВрдиреЗ рдореБрдЭреЗ рдкрд╣рд▓реЗ рд╣реА рд▓рд┐рдЦрд╛ рдерд╛ рдХрд┐ рдЕрдВрддрд┐рдо рд╕реНрдкреЙрдЗрд▓рд░ рдореЗрдВ рдХреЛрдИ рдЪрд┐рддреНрд░ рдирд╣реАрдВ рд╣реИред рдореИрдВрдиреЗ рддреАрди рдмрд╛рд░ рдПрдХ рд╣реА рдСрдкрд░реЗрд╢рди рдХрд┐рдпрд╛ - рдореИрдВрдиреЗ рдЗрд╕реЗ рд▓рд╛рдкрддрд╛ рд▓рд┐рдВрдХ рдбрд╛рд▓рдХрд░ рд╕рдВрдкрд╛рджрд┐рдд рдХрд┐рдпрд╛, рдЗрд╕реЗ рдмрдЪрд╛рдпрд╛, рджреЗрдЦрд╛ рдХрд┐ рдмрджрд▓рд╛рд╡ рд╣реБрдП рдереЗ, рдкреГрд╖реНрда рдХреЛ рдмрдВрдж рдХрд░ рджрд┐рдпрд╛, рдЗрд╕реЗ рдлрд┐рд░ рд╕реЗ рдЦреЛрд▓рд╛ рдФрд░ рд╢рд╛рдк рджрд┐рдпрд╛ - рдЪрд┐рддреНрд░ рдлрд┐рд░ рд╕реЗ рдЧрд╛рдпрдм рд╣реЛ рдЧрдпрд╛ред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рд▓рд┐рдВрдХ рдпрд╛ рдпрд╣реАрдВ , рдЬреЛ рдПрдХ рд╣реА рддрд╕реНрд╡реАрд░ рдХреЗ рд▓рд┐рдП рдиреЗрддреГрддреНрд╡ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП, рдЕрдкрдиреЗ рдХрд╛рд░реНрдпрд╛рддреНрдордХ рдХрд░реНрддрд╡реНрдпреЛрдВ рдХреЛ рдкреВрд░рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдмрдВрдж рд╣реЛ рдЧрдпрд╛ рд╣реИред рдореБрд╕реАрдмрддред
рдмрд╕ рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рдореИрдВ рдЗрд╕ рдЕрдирдзрд┐рдХреГрдд рд▓рд┐рдВрдХ рдХреЛ рдХреЗрд╡рд▓ рдкрд╛рда рдХреЗ рд╕рд╛рде рдпрд╣рд╛рдВ рдЫреЛрдбрд╝рддрд╛ рд╣реВрдВ
habr.habrastorage.org/post_images/0e1/0c7/be4/0e10c7be44690901268d5dfa9e532d0e.png

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


All Articles