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
Pawel Dudek
July 26, 2014
Programming
93
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
88
TDD Workshop - UIKonf 2016
paweldudek
0
270
Behaviour Driven Development - Mobile Trends
paweldudek
1
380
BDD Mobilization
paweldudek
0
130
Behaviour Driven Development - the whys and hows
paweldudek
0
190
Other Decks in Programming
See All in Programming
What's New in Android 2026
veronikapj
0
240
霧の中の代数的エフェクト
funnyycat
1
450
なぜ関数型プログラミングで「型」と「証明」が語られるのか #fp_matsuri
kajitack
3
1.1k
Foundation Models frameworkで画像分析
ryodeveloper
1
320
為什麼你並不需要ViewModel / No, you don't need a ViewModel
lovee
1
460
変わらないものが、変わるものを決める — 意図駆動開発 × イベントソーシング × イミュータブル | What Doesn't Change Decides What Can — IDD × Event Sourcing × Immutability
tomohisa
0
970
言語を使う側から、作る側へ。 自作 Lisp で得た新たな気づき。
andpad
0
140
今さら聞けない .NET CLI
htkym
0
170
数百円から始めるRuby電子工作
tarosay
0
120
Android CLI
fornewid
0
200
FDEが実現するAI駆動経営の現在地
gonta
2
240
jsmini JavaScript Engine を作ってみた話
yosuke_furukawa
PRO
0
280
Featured
See All Featured
Organizational Design Perspectives: An Ontology of Organizational Design Elements
kimpetersen
PRO
1
780
HDC tutorial
michielstock
2
760
Sharpening the Axe: The Primacy of Toolmaking
bcantrill
46
2.9k
Six Lessons from altMBA
skipperchong
29
4.4k
The Impact of AI in SEO - AI Overviews June 2024 Edition
aleyda
5
1.1k
Have SEOs Ruined the Internet? - User Awareness of SEO in 2025
akashhashmi
0
400
Designing for humans not robots
tammielis
254
26k
Mind Mapping
helmedeiros
PRO
1
290
Conquering PDFs: document understanding beyond plain text
inesmontani
PRO
4
2.9k
Understanding Cognitive Biases in Performance Measurement
bluesmoon
32
3k
What Being in a Rock Band Can Teach Us About Real World SEO
427marketing
0
1.1k
First, design no harm
axbom
PRO
2
1.2k
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