IOS之UIKit_Day13

day13佈局

目標:UICollectionViewController集合視圖spa

 

1.UICollectionViewController的基本使用:設計

       1.1 Code純代碼的方式code

              a.Cell的簡單樣式+系統的流式佈局orm

              UICollectionViewCell+UICollectionViewFlowLayout繼承

              和UITableViewController基本相同實現三問一答,注意一答只能從對列中查找接口

              單元格的衝用可使用標記:隊列

               //從隊列中安標是取cell圖片

   UICollectionViewCell *cell=[collectionViewdequeueReusableCellWithReuseIdentifier:reuseIdentifier       forIndexPath:indexPath];ci

    //設置cell的背景顏色

   cell.backgroundColor=[UIColor redColor];

    UILabel*lable=(UILabel *)[cell.contentView viewWithTag:1];//注意標記的值 不能爲0

    if(lable==nil) {

       lable=[[UILabel alloc]init];

       lable.frame=CGRectMake(0, 0, cell.bounds.size.width,cell.bounds.size.height);

       lable.textColor=[UIColor whiteColor];

       lable.font=[UIFont boldSystemFontOfSize:26];

       lable.textAlignment=UITextAlignmentCenter;

        //爲lable添加tag標示

        lable.tag=1;

       [cell.contentView addSubview:lable];

    }

   lable.text=[NSString stringWithFormat:@"%d",indexPath.row];

       returncell;

 

      b.Cell的簡單樣式+自定義的流式佈局

          UICollectionViewCell+MyFlowLayout

          自定義的流式佈局:須要重寫類繼承自UICollectionViewFlowLayout

                   而且重寫初始化方法:

                   //佈局的自定義

       self.itemSize=CGSizeMake(80, 80);//項的大小

       self.minimumLineSpacing=10.0;//行間距的大小

       self.minimumInteritemSpacing=10.0;//內部項之間的距離

       self.scrollDirection=UICollectionViewScrollDirectionHorizontal;//設置水平滾動

       //self.scrollDirection=UICollectionViewScrollDirectionVertical;//設置垂直滾動

       self.sectionInset=UIEdgeInsetsMake(154, 30, 154, 30);//上 

 

          c.自定義Cell+自定義的流式佈局

          MyCell+MyFlowLayout

          自定義cell:須要重寫cell繼承自UICollectionViewCell

          自定義的流式佈局:須要重寫UICollectionViewFlowLayout

          在Cell的類方法中設置Cell的樣式

          -(id)initWithFrame:(CGRect)frame

{

    self =[super initWithFrame:frame];

    if (self) {

       self.bgImageView = [[UIImageView alloc]initWithFrame:CGRectMake(0, 0,frame.size.width, frame.size.height)];

        //設置圖片視圖爲cell的背景視圖

       self.backgroundView = self.bgImageView;

       self.label = [[UILabel alloc]initWithFrame:CGRectMake(0, 0,frame.size.width, frame.size.height)];

       self.label.textAlignment = NSTextAlignmentCenter;

       self.label.font = [UIFont boldSystemFontOfSize:30];

        //將標籤添加到cell的內容視圖中

       [self.contentView addSubview:self.label];

    }

    return self;

}

 

1.2 Xib方式:

          a、只經過Xib創建

                   新建視圖類繼承自UICollectionViewController並勾選Xib  刪除自帶的Xib視圖 新建CollectionView 選擇Files Owner把View連線到collectionView,選擇collectionView的第六個檢查器,把dataSource和Delegate連線到Files Owner

                   選擇第四個檢查器 設計collectionView的顯示效果

        b、cell經過Xib設計自定義流式佈局

              新建FlowLayout繼承自UICollectionViewFlowLayout在a中的Xib文件的第四個檢查器中Layout選擇Custom Class選擇FlowLayout

                   在新建的FlowLayout中的-(id)initWithCoder:(NSCoder *)aDecoder{}方法中設計佈局

        c、自定義Cell自定義流式佈局

              新建Cell繼承於UICollectionViewCell 當前狀態下沒法勾選Xib,再新建選擇interface-選擇Empty新建一個Xib名字與繼承UICollectionViewCell類的名字相同

              在該Xib下拉入一個collectionViewCell 選擇第三個檢查器 Class選擇當前類,在該Xib下實現要設計的顯示效果便可。

 

 1.3 StoryBoard方式實現

       同Xib方式基本類似

 

2、使用UICollectionViewController實現複雜的佈局

       2.1 自定義的複雜的流式佈局實現水平波動的縮放

              可分爲a.、b、c、三種狀況

              以a純代碼的方式爲例:

                     a、建立MyCollectionViewController繼承UICollectionViewController,並設置分區數、每一個分區的項數、以及每一項的格式(與UITableViewController類似)

                    b、建立MyCell繼承自UICollectionViewCell,公開一個imageView的接口,在初始化的時候初始化該ImageView的大小,並把ImageView賦給self.backgroundView[能夠經過self.contentView.layer.borderWidth=1.0f;設置圖片的外邊框 self.contentView.layer.borderColor設置外邊框的顏色]

                     c、建立MyFlowLayout繼承UICollectionViewFlowLayout,並在初始化方法(init)中設置self.itemSize的大小、self.scrollDirection設置滑動方向、self.sectionInset =UIEdgeInsetsMake(60, 0, 60, 0)設置item的位置。

                     關鍵步驟:在-(NSArray *)layoutAttributesForElementsInRect:(CGRect)rect{}方法中實現如下幾步:

                     1.獲得全部的item

                     2.建立可視化矩形區域,並求出可視化矩形區域的中心點

                     3.遍歷全部的item

                            求出每個item的中心點座標

                            計算出兩個中心點座標的差值

                            判斷是否在某一區域{

                            在就根據差值的大小產生一個ZoomFator縮放因子

                            對獲得的item調用transform3D=CATransform3DMakeScale(zoomFactor,zoomFactor, 1)設置縮放

}

 

Eg:

          -(NSArray*)layoutAttributesForElementsInRect:(CGRect)rect{

          //獲得每個item放入集合

    NSArray*array = [super layoutAttributesForElementsInRect:rect];

    //建立可視化的矩形區域

    CGRectvisiabelRect = CGRectZero;//初始化爲0

   visiabelRect.origin = self.collectionView.contentOffset;//滑動的座標

   visiabelRect.size = self.collectionView.bounds.size;//bounds=frame

    //可視化矩形區域的中心點x

    CGFloatvisiableRectCenterX = CGRectGetMidX(visiabelRect);

    //依次獲取系統指定的矩形區域中的每個item

    //的中心點座標

    //將可視化區域的中心點與item的中心點進行

    //比對,根據兩個中心點的距離產生一個變化的

    //比率,並將該比率做爲item的縮放比率便可

    for(UICollectionViewLayoutAttributes *attributes in array) {

        //獲取每個item的中心點

        CGFloat itemCenterX =attributes.center.x;

        //計算兩個中心點的距離

        CGFloatdistance = visiableRectCenterX - itemCenterX;

        //設定兩個中心點的距離在200之內時

        //才針對item作放大縮小的操做

        if(ABS(distance) < 200) {

            //根據distance的大小產生一個變化的zoomFator縮放因子

           CGFloat zoomFactor = 1 + 0.5*(1-ABS(distance/200.0));

           attributes.transform3D = CATransform3DMakeScale(zoomFactor, zoomFactor,1);

        }

    }

    returnarray;

}

 

//當滑動改變時從新肯定座標

-(BOOL)shouldInvalidateLayoutForBoundsChange:(CGRect)newBounds{

    return YES;

}

 

2.2、自定義的不規則佈局

       .......Tomower...Duang......Duang.....

 

補充:

       1.frame描述的視圖在父視圖中的位置以及大小所佔區域

       2.bounds描述的視圖自己的大小

       3.屏幕:3.4  寬320  高480

         屏幕:4.0  寬320  高568

相關文章
相關標籤/搜索