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
Sponsored
·
Your Podcast. Everywhere. Effortlessly.
Share. Educate. Inspire. Entertain. You do you. We'll handle the rest.
→
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
240
BDD DEVit
paweldudek
0
430
BDD NL
paweldudek
0
280
BDD Bialystok/Wroclaw
paweldudek
0
200
Poznan TDD Workshop Part 1
paweldudek
0
91
TDD Workshop - UIKonf 2016
paweldudek
0
280
Behaviour Driven Development - Mobile Trends
paweldudek
1
390
BDD Mobilization
paweldudek
0
130
Behaviour Driven Development - the whys and hows
paweldudek
0
210
Other Decks in Programming
See All in Programming
Webの地図
yosuke_furukawa
PRO
6
5k
Augmenting AI with the Power of Jakarta EE
ivargrimstad
0
390
すこし踏み込む CancellationToken
htkym
2
1.6k
re:Inventに行く前に知っておきたい現地参加のノウハウ
nokomoro3
0
310
WebRTC映像をAirPlayに対応させる挑戦.pdf
monolithic_adam
0
330
UnityでSystem.Net.WebSocketsなWebSocketサーバが動かないのでUnity Monoのコードを覗いてみた / about implementing websocket server with unity mono
drumath2237
1
530
Findy - エンジニア向け会社紹介/Findy Company Deck
findyinc
6
400k
Augmenting AI with the Power of Jakarta EE
ivargrimstad
0
470
Starting & Sustaining Code-Based E2E Testing for Non-Coding QA Teams( #jasstniigata )
teyamagu
PRO
1
840
AGENTS.md Is Not Enough:Build Skills, Don't Download Them
lx_t
0
130
Intent as Code
shoppingjaws
6
1.1k
AWSに止められる覚悟してますか?
morizo_1984
2
500
Featured
See All Featured
Measuring & Analyzing Core Web Vitals
bluesmoon
9
1k
Testing 201, or: Great Expectations
jmmastey
46
8.3k
No one is an island. Learnings from fostering a developers community.
thoeni
21
3.8k
State of Search Keynote: SEO is Dead Long Live SEO
ryanjones
0
300
The Language of Interfaces
destraynor
162
27k
Facilitating Awesome Meetings
lara
57
7.2k
The Director’s Chair: Orchestrating AI for Truly Effective Learning
tmiket
1
310
Redefining SEO in the New Era of Traffic Generation
szymonslowik
1
450
jQuery: Nuts, Bolts and Bling
dougneiner
66
8.6k
Scaling GitHub
holman
464
140k
<Decoding/> the Language of Devs - We Love SEO 2024
nikkihalliwell
1
340
GitHub's CSS Performance
jonrohan
1033
470k
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