Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Sign up for free
Menu
Search
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Pricing
Search
Sign in
Sign up for free
Custom Collection View Layouts
Search
Pawel Dudek
July 26, 2014
Programming
96
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
430
BDD NL
paweldudek
0
270
BDD Bialystok/Wroclaw
paweldudek
0
200
Poznan TDD Workshop Part 1
paweldudek
0
89
TDD Workshop - UIKonf 2016
paweldudek
0
270
Behaviour Driven Development - Mobile Trends
paweldudek
1
390
BDD Mobilization
paweldudek
0
130
Behaviour Driven Development - the whys and hows
paweldudek
0
200
Other Decks in Programming
See All in Programming
GKE アップグレード前に知っておきたい Blue/Green と PDB の関係
stkk
0
160
Swift愛好会と私(ウホーイ) / Swift Fan Club and Uhooi
uhooi
0
150
Family mrubyの進捗
kishima
1
110
「AI時代、配布するPythonコードをどう守るか: 難読化の実験と判断軸」 #PyconJP2026
pkshadeck
PRO
2
190
iOS開発×AI駆動開発 〜最近使って便利だったスキルの話〜
nogu66
0
140
Hello, Hiroshima Geospatial Data! — Exploring DoboX with Python
ra0kley
0
180
Intent as Code
shoppingjaws
6
720
RSSとCodexを使ってX投稿自動化してみた
ochtum
0
110
信頼性の目標を誰も求めてない
shubox
0
500
市販E-Readerを乗っ取れ 〜Embedded Swiftで電子ペーパーガジェットを制御する〜
trickart
0
160
AWS Step Functions 大規模並列の壁を越える / jaws-sonic-2026-niigata-step-functions
kasacchiful
PRO
1
430
AgentCore CLI で進化した AWS での AI エージェントの作り方 : 必要な機能を必要な時に
icoxfog417
PRO
2
270
Featured
See All Featured
The Hidden Cost of Media on the Web [PixelPalooza 2025]
tammyeverts
2
500
Discover your Explorer Soul
emna__ayadi
2
1.3k
How to Align SEO within the Product Triangle To Get Buy-In & Support - #RIMC
aleyda
2
1.8k
Impact Scores and Hybrid Strategies: The future of link building
tamaranovitovic
0
440
Claude Code どこまでも/ Claude Code Everywhere
nwiizo
67
58k
More Than Pixels: Becoming A User Experience Designer
marktimemedia
3
520
A brief & incomplete history of UX Design for the World Wide Web: 1989–2019
jct
2
500
Statistics for Hackers
jakevdp
799
230k
Design of three-dimensional binary manipulators for pick-and-place task avoiding obstacles (IECON2024)
konakalab
0
590
Producing Creativity
orderedlist
PRO
348
41k
WCS-LA-2024
lcolladotor
0
820
Mind Mapping
helmedeiros
1
350
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