Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
Custom Collection View Layouts
Search
Sponsored
·
Your Podcast. Everywhere. Effortlessly.
Share. Educate. Inspire. Entertain. You do you. We'll handle the rest.
→
Pawel Dudek
July 26, 2014
Programming
91
0
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
Custom Collection View Layouts
Pawel Dudek
July 26, 2014
More Decks by Pawel Dudek
See All by Pawel Dudek
Swift Mocks
paweldudek
0
230
BDD DEVit
paweldudek
0
420
BDD NL
paweldudek
0
270
BDD Bialystok/Wroclaw
paweldudek
0
190
Poznan TDD Workshop Part 1
paweldudek
0
86
TDD Workshop - UIKonf 2016
paweldudek
0
270
Behaviour Driven Development - Mobile Trends
paweldudek
1
370
BDD Mobilization
paweldudek
0
130
Behaviour Driven Development - the whys and hows
paweldudek
0
190
Other Decks in Programming
See All in Programming
Developing with AI Agents — Codex, Claude Code & Cowork Practical Guide
x5gtrn
PRO
0
1.3k
Dataformのリポジトリを立ち上げるときにまずやること / dataform-day0-2026
snhryt
0
150
jQueryをバージョンアップする前に使いたいjQuery Migrate
matsuo_atsushi
0
320
Claspは野良GASの夢をみるか
takter00
0
190
ローカルLLMを使ってB2Bサービスを作っていての学び
yaotti
0
160
肥大化するレガシーコードに立ち向かうためのインターフェース分離と依存の逆転 / JJUG CCC 2026 Spring
hirokunimaeta
0
540
The NotImplementedError Problem in Ruby
koic
1
730
生成AI時代にこそ効くGo | Why Go Works in the Age of Generative AI
mom0tomo
8
3.2k
ADKを使って簡単にAIエージェントを作ってみよう
k1mu21
0
260
Inside Stream API
skrb
1
690
Hunting Vulnerabilities in Symfony with LLMs
vinceamstoutz
0
540
Make SRE Operations Easier with Azure SRE Agent
kkamegawa
0
5.5k
Featured
See All Featured
I Don’t Have Time: Getting Over the Fear to Launch Your Podcast
jcasabona
34
2.8k
svc-hook: hooking system calls on ARM64 by binary rewriting
retrage
2
290
The Mindset for Success: Future Career Progression
greggifford
PRO
0
360
Applied NLP in the Age of Generative AI
inesmontani
PRO
4
2.3k
JavaScript: Past, Present, and Future - NDC Porto 2020
reverentgeek
52
6k
How To Stay Up To Date on Web Technology
chriscoyier
790
250k
Cheating the UX When There Is Nothing More to Optimize - PixelPioneers
stephaniewalter
287
14k
Design in an AI World
tapps
1
240
Building AI with AI
inesmontani
PRO
1
1.1k
Have SEOs Ruined the Internet? - User Awareness of SEO in 2025
akashhashmi
0
370
Technical Leadership for Architectural Decision Making
baasie
3
400
Fantastic passwords and where to find them - at NoRuKo
philnash
52
3.7k
Transcript
CUSTOM COLLECTION VIEW LAYOUTS
WHO HAS EVER BUILT A CUSTOM LAYOUT?
THAT DOES NOT INHERIT FROM FLOW LAYOUT?
CUSTOM LAYOUT VS INHERITING FROM FLOW LAYOUT
WHENEVER YOU CAN USE FLOW LAYOUT Flow layout is a
line breaking layout. Any variation that lays items in a line and breaks when it gets to an end can be covered with flow layout.
WHENEVER YOU CAN USE FLOW LAYOUT ▸ Add new views
▸ Tweak layout attributes ▸ New layout attributes ▸ Gesture support ▸ Custom insert/delete animations
FLOW LAYOUT IS HIGHLY OPTIMIZED AND VERSATILE TOOL
YOU SHOULD USE IT
WHY WOULD I WANT TO BUILD A CUSTOM LAYOUT?
WHAT ARE THE TYPES OF LAYOUTS?
LAYOUT DRIVEN
LAYOUT DRIVEN THINK FLOW LAYOUT
DATA DRIVEN
DATA DRIVEN THINK CALENDAR LAYOUT
UICOLLECTIONVIEWLAYOUT ATTRIBUTES
DEFINES HOW ITEMS ARE LAID OUT BY YOUR COLLECTION VIEW.
NS_CLASS_AVAILABLE_IOS(6_0) @interface UICollectionViewLayoutAttributes : NSObject @property (nonatomic) CGRect frame; @property
(nonatomic) CGPoint center; @property (nonatomic) CGSize size; @property (nonatomic) CATransform3D transform3D; @property (nonatomic) CGRect bounds NS_AVAILABLE_IOS(7_0); @property (nonatomic) CGAffineTransform transform NS_AVAILABLE_IOS(7_0); @property (nonatomic) CGFloat alpha; @property (nonatomic) NSInteger zIndex; // default is 0 @property (nonatomic, getter=isHidden) BOOL hidden; @property (nonatomic, retain) NSIndexPath *indexPath; @property (nonatomic, readonly) UICollectionElementCategory representedElementCategory; @property (nonatomic, readonly) NSString *representedElementKind;
YOU CAN PROVIDE YOUR OWN SUBCLASS TO PASS ADDITIONAL INFORMATION
TO CELLS, SUPPLEMENTARY AND DECORATION VIEWS.
NS_CLASS_AVAILABLE_IOS(6_0) @interface UICollectionReusableView : UIView (…) - (void)applyLayoutAttributes:(UICollectionViewLayoutAttributes *)attributes; (…)
@end
YOU HAVE TO OVERRIDE isEqual & copy
BUILDING CUSTOM COLLECTION VIEW LAYOUT
HOW DOES UICOLLECTIONVIEW PREPARE ITS LAYOUT? - (void)prepareLayout; - (CGSize)collectionViewContentSize;
- (NSArray *)layoutAttributesForElementsInRect:(CGRect)rect;
PREPARE LAYOUT - (void)prepareLayout { [super prepareLayout]; (...) }
CONTENT SIZE - (CGSize)collectionViewContentSize { CGSize myCustomSize = (...) return
myCustomSize; }
LAYOUT ATTRIBUTES FOR ELEMENTS IN RECT - (NSArray *)layoutAttributesForElementsInRect:(CGRect)rect {
return [super layoutAttributesForElementsInRect:rect]; }
The rect parameter does not define whole bounds of collection
view.
UICOLLECTIONVIEW CONSIDERS ITS LAYOUT UP AND READY AFTER THESE THREE
METHODS ARE CALLED.
LAYOUT ATTRIBUTES FOR ELEMENT AT INDEX PATH - (UICollectionViewLayoutAttributes *)layoutAttributesForItemAtIndexPath:(NSIndexPath
*)path { return [super layoutAttributesForItemAtIndexPath:indexPath]; }
INVALIDATING LAYOUT WHEN?
INVALIDATE WHEN A VALUE THAT DRIVES LAYOUT CHANGES ▸ Bounds
▸ Content offset ▸ Data (data driven layouts) ▸ Layout-specific
INVALIDATING LAYOUT [layout invalidateLayout];
INVALIDATING LAYOUT - (BOOL)shouldInvalidateLayoutForBoundsChange:(CGRect)newBounds { return [super shouldInvalidateLayoutForBoundsChange:newBounds]; }
ASSIGNMENT 1 CAROUSEL LAYOUT
GOALS ▸ Behaves like paging in scroll view with horizontal
scroling ▸ Item is always centered veritcally when scroll rests ▸ When iPad is rotated the same cell stays in the middle of the screen ▸ No code related to setting up layout in controller ▸ Does not inherit from UICollectionViewFlowLayout (optional)
EXAMPLE
None
TIPS
USE TARGET CONTENT OFFSET WITH VELOCITY - (CGPoint)targetContentOffsetForProposedContentOffset:(CGPoint)proposedContentOffset withScrollingVelocity:(CGPoint)velocity;
AND TARGET CONTENT OFFSET - (CGPoint)targetContentOffsetForProposedContentOffset:(CGPoint)proposedContentOffset;
None
LET'S CODE!
ASSIGNMENT 2 CALENDAR LAYOUT LET'S TRY SOMETHING HARDER
GOALS ▸ Displays items of different sizes that represent events
▸ Displays a 'bead' view that shows current time ▸ Does not inherit from flow layout
EXAMPLE
None
GETTING DATA TO YOUR COLLECTION VIEW LAYOUT
THE EXTENSIBLE DELEGATE PATTERN
@protocol CalendarCollectionViewLayoutDelegate <UICollectionViewDelegate>
WHAT DATA WILL YOU NEED?
TIME TO POSITION BEAD VIEW
EVENTS FOR CALENDAR
START OF DISPLAYED DAY
END OF DISPLAYED DATE
BEAD VIEW CONSIDER IT AS A DECORATION VIEW
REGISTERING A DECORATION VIEW [self registerClass:[BeadView class] forDecorationViewOfKind:DecorationKindBead];
PROVIDING DECORATION LAYOUT ATTRIBUTES SAME AS WITH CELL LAYOUT ATTRIBUTES
- (UICollectionViewLayoutAttributes *)layoutAttributesForDecorationViewOfKind:(NSString *)kind atIndexPath:(NSIndexPath *)indexPath
[UICollectionViewLayoutAttributes layoutAttributesForDecorationViewOfKind:DecorationKindBead withIndexPath:indexPath];
HAVE TO ALSO BE PASSED IN LAYOUT ATTRIBUTES FOR RECT
1 MINUTE EQUALS 1 PIXEL
[self.startOfDisplayedDay mt_minutesUntilDate:self.endOfDisplayedDay];
None
LET'S CODE!
ASSIGNMENT 3 CALENDAR LAYOUT SEPARATORS
GOALS ▸ Display dark gray line at each hour ▸
Display light gray line at each half an hour ▸ Display hour next to each dark gray line
EXAMPLE
None
TIPS
USE CUSTOM LAYOUT ATTRIBUTES TO GET COLOR/TEXT TO SEPARATOR VIEW
SEPARATORS DECORATION VIEWS
LET'S CODE!
CONCLUSION ▸ Flow layout can be easily modified to developer
needs ▸ Building custom layouts is not that hard ▸ Layout attributes can be a great way of providing additional data to collection view elements
THANK YOU FOR YOUR ATTENTION!
PAWEL DUDEK @ELDUDI HTTPS://GITHUB.COM/PAWELDUDEK