iOS:UICollectionView純自訂的布局:堆疊式布局、圓式布局 (一般用來製作相簿)

來源:互聯網
上載者:User

標籤:

集合視圖的自動布局:UICollectionViewLayout是抽象根類,必須用它的子類才能建立執行個體,下面是重寫的方法,計算item的布局屬性

//每一次重新布局前,都會準備布局(蘋果官方推薦使用該方法進行一些初始化)

-(void)prepareLayout

 

//重寫layoutAttributesForItemAtIndexPath,返回每一個item的布局屬性(流式布局內部已經協助完成)

-(UICollectionViewLayoutAttributes *)layoutAttributesForItemAtIndexPath:(NSIndexPath *)indexPath

 

//是否要重新重新整理布局(只要顯示的item邊界發生改變就重新布局)

//只要每一次重新布局內部就會調用下面的layoutAttributesForElementsInRect:擷取所有cell(item)的屬性

-(BOOL)shouldInvalidateLayoutForBoundsChange:(CGRect)newBounds

 

//返回需要重新布局的所有item的屬性

-(NSArray*)layoutAttributesForElementsInRect:(CGRect)rect

 

??下面的這兩個布局可以直接帶走使用,不需要做任何其他的操作,歐耶

 

堆疊式布局代碼如下:

CustomStackLayout.h

#import <UIKit/UIKit.h>@interface CustomStackLayout : UICollectionViewLayout@end

CustomStackLayout.m

#import "CustomStackLayout.h"#define RANDOM_0_1  arc4random_uniform(100)/100.0/* 由於CustomStackLayout是直接繼承自UICollectionViewLayout的,父類沒有幫它完成任何的布局,因此, 需要使用者自己完全重新對每一個item進行布局,也即設定它們的布局屬性UICollectionViewLayoutAttributes*/@implementation CustomStackLayout//重寫shouldInvalidateLayoutForBoundsChange,每次重寫布局內部都會自動調用-(BOOL)shouldInvalidateLayoutForBoundsChange:(CGRect)newBounds{    return YES;}//重寫collectionViewContentSize,可以讓collectionView滾動-(CGSize)collectionViewContentSize{    return CGSizeMake(400, 400);}//重寫layoutAttributesForItemAtIndexPath,返回每一個item的布局屬性-(UICollectionViewLayoutAttributes *)layoutAttributesForItemAtIndexPath:(NSIndexPath *)indexPath{    //建立布局執行個體    UICollectionViewLayoutAttributes *attrs = [UICollectionViewLayoutAttributes layoutAttributesForCellWithIndexPath:indexPath];        //設定布局屬性    attrs.size = CGSizeMake(100, 100);    attrs.center = CGPointMake(self.collectionView.frame.size.width*0.5, self.collectionView.frame.size.height*0.5);        //設定旋轉方向    //int direction = (i % 2 ==0)? 1: -1;        NSArray *directions = @[@0.0,@1.0,@(0.05),@(-1.0),@(-0.05)];        //只顯示5張    if (indexPath.item >= 5)    {        attrs.hidden = YES;    }    else    {        //開始旋轉        attrs.transform = CGAffineTransformMakeRotation([directions[indexPath.item]floatValue]);                //zIndex值越大,圖片越在上面        attrs.zIndex = [self.collectionView numberOfItemsInSection:indexPath.section] - indexPath.item;    }    return attrs;}//重寫layoutAttributesForElementsInRect,設定所有cell的布局屬性(包括item、header、footer)-(NSArray *)layoutAttributesForElementsInRect:(CGRect)rect{    NSMutableArray *arrayM = [NSMutableArray array];    NSInteger count = [self.collectionView numberOfItemsInSection:0];        //給每一個item建立並設定布局屬性    for (int i = 0; i < count; i++)    {        //建立item的布局屬性        UICollectionViewLayoutAttributes *attrs = [self layoutAttributesForItemAtIndexPath:[NSIndexPath indexPathForItem:i inSection:0]];                 [arrayM addObject:attrs];    }    return arrayM;}@end

 

圓式布局代碼如下:

CustomCircleLayout.h

#import <UIKit/UIKit.h>@interface CustomCircleLayout : UICollectionViewLayout@end

CustomCirclelayout.m

#import "CustomCircleLayout.h"@implementation CustomCircleLayout//重寫shouldInvalidateLayoutForBoundsChange,每次重寫布局內部都會自動調用-(BOOL)shouldInvalidateLayoutForBoundsChange:(CGRect)newBounds{    return YES;}//重寫layoutAttributesForItemAtIndexPath,返回每一個item的布局屬性-(UICollectionViewLayoutAttributes *)layoutAttributesForItemAtIndexPath:(NSIndexPath *)indexPath{    //建立布局執行個體    UICollectionViewLayoutAttributes *attrs = [UICollectionViewLayoutAttributes layoutAttributesForCellWithIndexPath:indexPath];        //設定item的大小    attrs.size = CGSizeMake(50, 50);        //設定圓的半徑    CGFloat circleRadius = 70;        //設定圓的中心點    CGPoint circleCenter = CGPointMake(self.collectionView.frame.size.width*0.5, self.collectionView.frame.size.height *0.5);        //計算每一個item之間的角度    CGFloat angleDelta = M_PI *2 /[self.collectionView numberOfItemsInSection:indexPath.section];        //計算當前item的角度    CGFloat angle = indexPath.item * angleDelta;        //計算當前item的中心    CGFloat x = circleCenter.x + cos(angle)*circleRadius;    CGFloat y = circleCenter.y - sin(angle)*circleRadius;        //定位當前item的位置    attrs.center = CGPointMake(x, y);        //設定item的順序,越後面的顯示在前面    attrs.zIndex = indexPath.item;        return attrs;}//重寫layoutAttributesForElementsInRect,設定所有cell的布局屬性(包括item、header、footer)-(NSArray *)layoutAttributesForElementsInRect:(CGRect)rect{    NSMutableArray *arrayM = [NSMutableArray array];    NSInteger count = [self.collectionView numberOfItemsInSection:0];        //給每一個item建立並設定布局屬性    for (int i = 0; i < count; i++)    {        //建立item的布局屬性        UICollectionViewLayoutAttributes *attrs = [self layoutAttributesForItemAtIndexPath:[NSIndexPath indexPathForItem:i inSection:0]];                [arrayM addObject:attrs];    }    return arrayM;}@end

 

堆疊式布局示範:                                               圓式布局示範:

        

 

iOS:UICollectionView純自訂的布局:堆疊式布局、圓式布局 (一般用來製作相簿)

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.