| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147 | 
							
- //
 
- //  WMZBannerOverLayout.m
 
- //  WMZBanner
 
- //
 
- //  Created by wmz on 2019/12/18.
 
- //  Copyright © 2019 wmz. All rights reserved.
 
- //
 
- #import "WMZBannerOverLayout.h"
 
- @interface WMZBannerOverLayout()
 
- @property(nonatomic,assign)CGPoint collectionContenOffset;
 
- @property(nonatomic,assign)CGSize collectionContenSize;
 
- @property(nonatomic,assign)CGFloat last;
 
- @property(nonatomic,assign)BOOL right;
 
- @end
 
- @implementation WMZBannerOverLayout
 
- - (instancetype)initConfigureWithModel:(WMZBannerParam *)param{
 
-     if (self = [super init]) {
 
-         self.param = param;
 
-         self.collectionView.bounces = NO;
 
-     }
 
-     return self;
 
- }
 
- - (void)prepareLayout
 
- {
 
-     [super prepareLayout];
 
-     if (self.param.wCardOverLapCount<=0) {
 
-         self.param.wCardOverLapCount = 4;
 
-     }
 
-     self.collectionView.pagingEnabled = YES;
 
-     self.itemSize = self.param.wVertical?
 
-     CGSizeMake(self.param.wItemSize.width , (self.param.wItemSize.height - (self.param.wCardOverLapCount - 1)*self.param.wLineSpacing)):
 
-     CGSizeMake(self.param.wItemSize.width - (self.param.wCardOverLapCount - 1)*self.param.wLineSpacing, self.param.wItemSize.height);
 
-     self.minimumInteritemSpacing = (self.param.wCardOverLapCount - 1)*self.param.wLineSpacing*2;
 
-     self.minimumLineSpacing = (self.param.wCardOverLapCount - 1)*self.param.wLineSpacing*2;
 
-     self.sectionInset = self.param.wSectionInset;
 
-     self.scrollDirection = self.param.wVertical? UICollectionViewScrollDirectionVertical
 
-                                                         :UICollectionViewScrollDirectionHorizontal;
 
- }
 
- - (NSArray<UICollectionViewLayoutAttributes *> *)layoutAttributesForElementsInRect:(CGRect)rect {
 
-     return [self cardOverLapTypeInRect:rect];
 
- }
 
- //卡片重叠
 
- - (NSArray<UICollectionViewLayoutAttributes *> *)cardOverLapTypeInRect:(CGRect)rect{
 
-     
 
-     NSInteger itemsCount = [self.collectionView numberOfItemsInSection:0];
 
-     if (itemsCount <= 0) {
 
-         return nil;
 
-     }
 
-     self.param.myCurrentPath = self.param.wVertical?
 
-     MAX(floor ((int)self.collectionContenOffset.y / self.collectionContenSize.height ), 0):
 
-     MAX(floor((int)self.collectionContenOffset.x / self.collectionContenSize.width ), 0);
 
- //    self.param.overFactPath = self.param.wVertical?
 
- //           MAX(ceil ((int)self.collectionContenOffset.y / self.collectionContenSize.height ), 0):
 
- //           MAX(ceil((int)self.collectionContenOffset.x / self.collectionContenSize.width ), 0);
 
-     NSInteger minVisibleIndex = MAX(self.param.myCurrentPath, 0);
 
-     NSInteger contentOffset =  self.param.wVertical?
 
-     self.collectionContenOffset.y:self.collectionContenOffset.x;
 
-     NSInteger collectionBounds = self.param.wVertical?
 
-     self.collectionContenSize.height:self.collectionContenSize.width;
 
-     CGFloat offset = contentOffset % collectionBounds;
 
-     CGFloat offsetProgress = offset / (self.param.wVertical?self.collectionContenSize.height:self.collectionContenSize.width)*1.0f;
 
-     NSInteger maxVisibleIndex = MAX(MIN(itemsCount - 1, self.param.myCurrentPath + self.param.wCardOverLapCount), minVisibleIndex);
 
-     NSMutableArray *mArr = [[NSMutableArray alloc] init];
 
-     
 
-     for (NSInteger i = minVisibleIndex; i<=maxVisibleIndex; i++) {
 
-         NSIndexPath *indexPath = [NSIndexPath indexPathForRow:i inSection:0];
 
-         UICollectionViewLayoutAttributes *attributes = [[self layoutAttributesForItemAtIndexPath:indexPath] copy];
 
-            
 
-         NSInteger visibleIndex = MAX(indexPath.item - self.param.myCurrentPath + 1, 0);
 
-         attributes.size =  self.itemSize;
 
-         CGFloat topCardMidX = self.param.wVertical?
 
-         (self.collectionContenOffset.y +  self.collectionContenSize.height / 2):
 
-         (self.collectionContenOffset.x +  self.collectionContenSize.width / 2);
 
-         attributes.center = self.param.wVertical?
 
-         CGPointMake(self.collectionContenSize.width/2, topCardMidX + self.param.wLineSpacing * (visibleIndex - 1)):
 
-         CGPointMake(topCardMidX + self.param.wLineSpacing * (visibleIndex - 1), self.collectionContenSize.height/2);
 
-         attributes.zIndex = 925457662 - visibleIndex;
 
-         CGFloat scale = [self parallaxProgressForVisibleIndex:visibleIndex offsetProgress:offsetProgress minScale:self.param.wScaleFactor];
 
-         attributes.transform = CGAffineTransformMakeScale(scale, scale);
 
-         if (visibleIndex == 1) {
 
-             if (self.param.wVertical) {
 
-                 if (minVisibleIndex != maxVisibleIndex) {
 
-                     if (self.collectionContenOffset.y >= 0) {
 
-                         attributes.center = CGPointMake(attributes.center.x, attributes.center.y - offset);
 
-                     }else{
 
-                         attributes.center = CGPointMake(attributes.center.x , attributes.center.y + attributes.size.height * (1 - scale)/2 - self.param.wLineSpacing * offsetProgress);
 
-                     }
 
-                 }
 
-             }else{
 
-                 if (minVisibleIndex != maxVisibleIndex) {
 
-                     if (self.collectionContenOffset.x >= 0) {
 
-                            attributes.center =  CGPointMake(attributes.center.x - offset, attributes.center.y);
 
-                        }else{
 
-                            attributes.center = CGPointMake(attributes.center.x + attributes.size.width * (1 - scale)/2 - self.param.wLineSpacing * offsetProgress, attributes.center.y);
 
-                        }
 
-                    }
 
-                }
 
-                if (self.param.wCardOverAlphaOpen) {
 
-                     attributes.alpha = MAX(1-offsetProgress, MAX(self.param.wCardOverMinAlpha, 0));
 
-                }
 
-            }else if (visibleIndex == self.param.wCardOverLapCount + 1){
 
-                attributes.center = self.param.wVertical?
 
-                     CGPointMake(attributes.center.x, attributes.center.y + attributes.size.height * (1 - scale)/2 - self.param.wLineSpacing):
 
-                     CGPointMake(attributes.center.x + attributes.size.width * (1 - scale)/2 - self.param.wLineSpacing, attributes.center.y);
 
-                     if (self.param.wCardOverAlphaOpen) {
 
-                         attributes.alpha = MAX(offsetProgress, MAX(self.param.wCardOverMinAlpha, 0));
 
-                     }
 
-            }else{
 
-                attributes.center = self.param.wVertical?
 
-                         CGPointMake(attributes.center.x , attributes.center.y + attributes.size.height * (1 - scale)/2 - self.param.wLineSpacing * offsetProgress):
 
-                         CGPointMake(attributes.center.x + attributes.size.width * (1 - scale)/2 - self.param.wLineSpacing * offsetProgress, attributes.center.y);
 
-               if (self.param.wCardOverAlphaOpen) {
 
-                  attributes.alpha = MAX(offsetProgress, MAX(self.param.wCardOverMinAlpha*2, 0));
 
-               }
 
-            }
 
-            [mArr addObject:attributes];
 
-         }
 
-     return mArr;
 
- }
 
- - (BOOL)shouldInvalidateLayoutForBoundsChange:(CGRect)newBounds {
 
-     return YES;
 
- }
 
- - (CGFloat)parallaxProgressForVisibleIndex:(NSInteger)visibleIndex
 
-                          offsetProgress:(CGFloat)offsetProgress
 
-                                minScale:(CGFloat)minScale
 
- {
 
-     CGFloat step = (1.0 - minScale) / (self.param.wCardOverLapCount-1)*1.0;
 
-     return (1.0 - (visibleIndex - 1) * step + step * offsetProgress);
 
- }
 
- - (CGSize)collectionContenSize{
 
-      return CGSizeMake((int)self.collectionView.bounds.size.width, (int)self.collectionView.bounds.size.height);
 
- }
 
- - (CGPoint)collectionContenOffset{
 
-     return CGPointMake((int)self.collectionView.contentOffset.x, (int)self.collectionView.contentOffset.y);
 
- }
 
- @end
 
 
  |