7
7
8
8
#import " BLCollectionViewTagLayout.h"
9
9
10
+ NSString *const BLCollectionElementKindSectionDecoration = @" BLCollectionElementKindSectionDecoration" ;
11
+
10
12
#pragma mark - UICollectionViewTagStyleLayoutSectionAttributes Declare
11
13
#pragma mark -
12
14
@interface UICollectionViewTagStyleLayoutSectionAttributes : NSObject <NSCopying >
13
15
@property (nonatomic ,strong ) UICollectionViewLayoutAttributes *header;
14
16
@property (nonatomic ,strong ) NSArray <UICollectionViewLayoutAttributes *> *items;
15
17
@property (nonatomic ,strong ) UICollectionViewLayoutAttributes *footer;
18
+ @property (nonatomic ,strong ) UICollectionViewLayoutAttributes *decoration;
16
19
+ (instancetype )layoutAttributesWithHeader : (UICollectionViewLayoutAttributes *)header
17
20
items : (NSArray <UICollectionViewLayoutAttributes *> *)items
18
- footer : (UICollectionViewLayoutAttributes *)footer ;
21
+ footer : (UICollectionViewLayoutAttributes *)footer
22
+ decoration : (UICollectionViewLayoutAttributes *)decoration ;
19
23
@end
20
24
#pragma mark - UICollectionViewTagStyleLayoutSectionAttributes Implementation
21
25
#pragma mark -
22
26
@implementation UICollectionViewTagStyleLayoutSectionAttributes
23
27
+ (instancetype )layoutAttributesWithHeader : (UICollectionViewLayoutAttributes *)header
24
28
items : (NSArray <UICollectionViewLayoutAttributes *> *)items
25
29
footer : (UICollectionViewLayoutAttributes *)footer
30
+ decoration : (UICollectionViewLayoutAttributes *)decoration
26
31
{
27
32
UICollectionViewTagStyleLayoutSectionAttributes *obj =
28
33
UICollectionViewTagStyleLayoutSectionAttributes.new ;
29
34
obj.header = header;
30
35
obj.items = items;
31
36
obj.footer = footer;
37
+ obj.decoration = decoration;
32
38
return obj;
33
39
}
34
40
- (id )copyWithZone : (NSZone *)zone
@@ -38,6 +44,7 @@ - (id)copyWithZone:(NSZone *)zone
38
44
obj.header = self.header .copy ;
39
45
obj.items = [[NSArray alloc ] initWithArray: self .items copyItems: YES ];
40
46
obj.footer = self.footer .copy ;
47
+ obj.decoration = self.decoration .copy ;
41
48
return obj;
42
49
}
43
50
@end
@@ -213,9 +220,22 @@ - (void)setup
213
220
_itemRenderPolicy = BLCollectionViewTagLayoutItemRenderDefault;
214
221
_sectionHeadersPinToVisibleBounds = NO ;
215
222
_sectionFootersPinToVisibleBounds = NO ;
223
+ _sectionDecorationVisiable = NO ;
216
224
_invalidatedForPinSectionHeaderFootersToVisibleBounds = NO ;
217
225
_additionalAdjustedContentInset = UIEdgeInsetsZero;
218
226
}
227
+ - (void )registerNib : (UINib *)nib forDecorationViewOfKind : (NSString *)elementKind
228
+ {
229
+ NSAssert ([elementKind isEqualToString: BLCollectionElementKindSectionDecoration],@" Kind of %@ current unsupported" ,elementKind);
230
+ if (![elementKind isEqualToString: BLCollectionElementKindSectionDecoration]) return ;
231
+ [super registerNib: nib forDecorationViewOfKind: elementKind];
232
+ }
233
+ - (void )registerClass : (Class )viewClass forDecorationViewOfKind : (NSString *)elementKind
234
+ {
235
+ NSAssert ([elementKind isEqualToString: BLCollectionElementKindSectionDecoration],@" Kind of %@ current unsupported" ,elementKind);
236
+ if (![elementKind isEqualToString: BLCollectionElementKindSectionDecoration]) return ;
237
+ [super registerClass: viewClass forDecorationViewOfKind: elementKind];
238
+ }
219
239
- (void )invalidateLayoutWithContext : (UICollectionViewLayoutInvalidationContext *)context
220
240
{
221
241
[super invalidateLayoutWithContext: context];
@@ -285,6 +305,12 @@ - (void)setSectionFootersPinToVisibleBounds:(BOOL)sectionFootersPinToVisibleBoun
285
305
_sectionFootersPinToVisibleBounds = sectionFootersPinToVisibleBounds;
286
306
[self invalidateLayout ];
287
307
}
308
+ - (void )setSectionDecorationVisiable : (BOOL )sectionDecorationVisiable
309
+ {
310
+ if (_sectionDecorationVisiable == sectionDecorationVisiable) return ;
311
+ _sectionDecorationVisiable = sectionDecorationVisiable;
312
+ [self invalidateLayout ];
313
+ }
288
314
#pragma mark -
289
315
- (id <BLCollectionViewDelegateTagStyleLayout>)delegate
290
316
{
@@ -311,6 +337,11 @@ - (NSInteger)zIndexForHeaderFooter
311
337
if (CGRectIntersectsRect (rect, obj.footer .frame ) && obj.footer .frame .size .height > 0 ) {
312
338
[layoutAttributes addObject: obj.footer];
313
339
}
340
+ if (self.sectionDecorationVisiable ) {
341
+ if (CGRectIntersectsRect (rect, obj.decoration .frame ) && obj.decoration .frame .size .height > 0 ) {
342
+ [layoutAttributes addObject: obj.decoration];
343
+ }
344
+ }
314
345
}
315
346
return layoutAttributes.copy ;
316
347
}
@@ -409,7 +440,13 @@ - (void)setupLayoutAttributes
409
440
attributesForFooter.frame = CGRectMake (0 , maxY, maxContentWidth, footerReferenceSize.height );
410
441
attributesForFooter.zIndex = self.zIndexForHeaderFooter ;
411
442
412
- [self .originSectionAttributes addObject: [UICollectionViewTagStyleLayoutSectionAttributes layoutAttributesWithHeader: attributesForHeader items: sortedAttributesForItems footer: attributesForFooter]];
443
+ // section decoration
444
+ UICollectionViewLayoutAttributes *attrubuteForDecoration = [UICollectionViewLayoutAttributes layoutAttributesForDecorationViewOfKind: BLCollectionElementKindSectionDecoration withIndexPath: indexPathForHeaderFooter];
445
+ attrubuteForDecoration.frame = CGRectMake (-sectionInset.left , CGRectGetMinY (attributesForHeader.frame ), maxContentWidth + sectionInset.left + sectionInset.right , CGRectGetMaxY (attributesForFooter.frame ) - CGRectGetMinY (attributesForHeader.frame ));
446
+ attrubuteForDecoration.zIndex = -self.zIndexForHeaderFooter ;
447
+
448
+ //
449
+ [self .originSectionAttributes addObject: [UICollectionViewTagStyleLayoutSectionAttributes layoutAttributesWithHeader: attributesForHeader items: sortedAttributesForItems footer: attributesForFooter decoration: attrubuteForDecoration]];
413
450
414
451
maxY = CGRectGetMaxY (attributesForFooter.frame );
415
452
}
@@ -436,12 +473,12 @@ - (void)updateAttributesForPinSectionHeaderFootersToVisibleBounds:(CGRect)newBou
436
473
visibleRectForPinHeaderFooter.origin .y += topOffset;
437
474
visibleRectForPinHeaderFooter.size .height -= topOffset;
438
475
visibleRectForPinHeaderFooter.size .height -= bottomOffset;
439
- // copy items
440
- self.sectionAttributes = [[NSMutableArray alloc ] initWithArray: self .originSectionAttributes copyItems: YES ];
441
476
if (self.collectionViewContentSize .height <= CGRectGetHeight (visibleRectForPinHeaderFooter)) {
442
477
// does no need to pin header or footer to visible bounds any more.
443
478
return ;
444
479
}
480
+ // copy items
481
+ self.sectionAttributes = [[NSMutableArray alloc ] initWithArray: self .originSectionAttributes copyItems: YES ];
445
482
NSArray <UICollectionViewLayoutAttributes *> *attributes = [self layoutAttributesForElementsInRect: visibleRectForPinHeaderFooter sectionAttributes: self .originSectionAttributes];
446
483
if (sectionHeadersShouldPinToVisibleBounds) {
447
484
UICollectionViewLayoutAttributes *header =
@@ -539,7 +576,13 @@ - (UICollectionViewLayoutAttributes *)layoutAttributesForSupplementaryViewOfKind
539
576
}
540
577
- (UICollectionViewLayoutAttributes *)layoutAttributesForDecorationViewOfKind : (NSString *)elementKind atIndexPath : (NSIndexPath *)indexPath
541
578
{
542
- return [super layoutAttributesForDecorationViewOfKind: elementKind atIndexPath: indexPath];
579
+ if (indexPath.section >= self.sectionAttributes .count ) return nil ;
580
+ UICollectionViewTagStyleLayoutSectionAttributes *sectionAttributes = self.sectionAttributes [indexPath.section];
581
+ if (elementKind == BLCollectionElementKindSectionDecoration) {
582
+ return sectionAttributes.decoration ;
583
+ }else {
584
+ return [super layoutAttributesForDecorationViewOfKind: elementKind atIndexPath: indexPath];
585
+ }
543
586
}
544
587
#pragma mark -
545
588
- (UICollectionViewLayoutInvalidationContext *)invalidationContextForBoundsChange : (CGRect )newBounds
@@ -615,6 +658,7 @@ @interface BLCollectionViewTagLayout (IBDESIGNABLE)
615
658
@property (nonatomic ) IBInspectable CGSize footerSize;
616
659
@property (nonatomic ) IBInspectable BOOL pinHeaders;
617
660
@property (nonatomic ) IBInspectable BOOL pinFooters;
661
+ @property (nonatomic ) IBInspectable BOOL useDecoration;
618
662
@end
619
663
620
664
@implementation BLCollectionViewTagLayout (IBDESIGNABLE)
@@ -714,6 +758,14 @@ - (BOOL)pinFooters
714
758
{
715
759
return self.sectionFootersPinToVisibleBounds ;
716
760
}
761
+ - (void )setUseDecoration : (BOOL )useDecoration
762
+ {
763
+ self.sectionDecorationVisiable = useDecoration;
764
+ }
765
+ - (BOOL )useDecoration
766
+ {
767
+ return self.sectionDecorationVisiable ;;
768
+ }
717
769
- (void )setRenderType : (NSInteger )renderType
718
770
{
719
771
self.itemRenderPolicy = renderType;
0 commit comments