自定義UICollectionView的FlowLayout

先看最終實現(xiàn)效果:

自定義FlowLayout.gif

我們知道,UICollectionView在使用時,布局要通過UICollectionViewFlowLayout來實現(xiàn).那么UICollectionViewLayout是通過哪些方法實現(xiàn)布局的呢?
參考文章:
iOS自定義UICollectionViewlayout仿英雄聯(lián)盟選擇皮膚立體輪播效果展示
文中介紹比較明白,但是實現(xiàn)過程中,出現(xiàn)了兩邊圖片閃現(xiàn)的問題,如下

自定義FlowLayout閃現(xiàn)問題.gif

反復(fù)測試后,發(fā)現(xiàn)原因是,在布局中,由于圖片太過縮小所致.修改重載中的第一個方法如下,能順利解決.

const CGFloat ZDScale = 1.3f;
- (NSArray<UICollectionViewLayoutAttributes *> *)layoutAttributesForElementsInRect:(CGRect)rect{

    CGRect visibleRect = CGRectMake(self.collectionView.contentOffset.x, 0, self.collectionView.width, self.collectionView.height);
    NSArray *visibleAttriM = [super layoutAttributesForElementsInRect:visibleRect];
    NSLog(@"%@", visibleAttriM);
    [visibleAttriM enumerateObjectsUsingBlock:^(UICollectionViewLayoutAttributes *obj, NSUInteger idx, BOOL * _Nonnull stop) {
        NSLog(@"%@", obj);
        CGFloat leftM = obj.center.x - self.collectionView.contentOffset.x;
        CGFloat halfCenterX = self.collectionView.width * 0.5;
        CGFloat absOffset = fabs(leftM - halfCenterX) * 0.8;
        NSLog(@"%.2f", absOffset);
        CGFloat scale = 1 - absOffset / halfCenterX;
        obj.transform3D = CATransform3DMakeScale(ZDScale * scale, ZDScale * scale, 1);
        if (self.needAlpha) {
            if (scale < 0.6) {
                obj.alpha = 0.6;
            }else if (scale > 0.99){
                obj.alpha = 1.0;
            }else{
                obj.alpha = scale;
            }
        }
    }];
    
    NSArray *attriM = [[NSArray alloc] initWithArray:visibleAttriM copyItems:true];
    return attriM;
}

詳情參考
Demo

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容