IOS之UIKit_Day13

day13

目标:UICollectionViewController集合视图

 

1.UICollectionViewController的基本使用:

       1.1 Code纯代码的方式

              a.Cell的简单样式+系统的流式布局

              UICollectionViewCell+UICollectionViewFlowLayout

              和UITableViewController基本相同实现三问一答,注意一答只能从对列中查找

              单元格的冲用可以使用标记:

               //从队列中安标是取cell

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

    //设置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

时间: 2024-10-24 05:48:55

IOS之UIKit_Day13的相关文章

iOS -- SKSpriteNode类

SKSpriteNode类 继承自 SKNode:UIResponder:NSObject 符合 NSCoding(SKNode)NSCopying(SKNode)NSObject(NSObject) 框架  /System/Library/Frameworks/SpriteKit.framework 可用性 可用于iOS 7.0或者更晚的版本 声明于 SKSpriteNode.h 参考指南 Sprite Kit Progamming Guide 概览 重要提示:这是一个初步的API或者开发技术

使用fruitstrap实现命令行将IPA包安装到iOS设备上

Requirements Mac OS X. Tested on Snow Leopard only. You need to have a valid iPhone development certificate installed. Xcode must be installed, along with the SDK for your iOS version. Usage fruitstrap [-d] -b <app> [device_id] Optional -d flag laun

iOS -- SKScene类

SKScene类 继承自 SKEffectNode:SKNode:UIResponder:NSObject 符合 NSCoding(SKNode)NSCopying(SKNode)NSObject(NSObject) 框架  /System/Library/Frameworks/SpriteKit.framework 可用性 可用于iOS 7.0或者更晚的版本 声明于 SKScene.h 参考指南 Sprite Kit Progamming Guide 概览 重要提示:这是一个初步的API或者开

iOS -- SKPhysicsWorld类

SKPhysicsWorld类 继承自 NSObject 符合 NSCodingNSObject(NSObject) 框架  /System/Library/Frameworks/SpriteKit.framework 可用性 可用于iOS 7.0或者更晚的版本 声明于 SKPhysicsWorld.h 参考指南 Sprite Kit Progamming Guide 概览 重要提示:这是一个初步的API或者开发技术文档.虽然已经审阅了本文档的技术准确性,但是它不是最终的版本.本机密信息仅适用于

iOS证书说明和发布

1.首先通过钥匙串访问——证书助理——从证书颁发机构请求证书——填写证书信息(邮箱,常用名称,存储到磁盘)——存储为(自定义名称.certSigningReuqest,简称CSR文件,只是为了提交到苹果开发者账号中,然后就没用了)到本地 2.苹果开发者账号中,创建证书(Development和Production)——上传CSR文件——下载证书运行 ( xxx.cer文件) 注意:只有在当前电脑中生成本地生成证书,上传到苹果开发账号,然后下载cer文件运行后,钥匙串中才有证书以及对应的秘钥 如果

iOS开发——项目实战总结&amp;UITableView性能优化与卡顿问题

UITableView性能优化与卡顿问题 1.最常用的就是cell的重用, 注册重用标识符 如果不重用cell时,每当一个cell显示到屏幕上时,就会重新创建一个新的cell 如果有很多数据的时候,就会堆积很多cell.如果重用cell,为cell创建一个ID 每当需要显示cell 的时候,都会先去缓冲池中寻找可循环利用的cell,如果没有再重新创建cell 2.避免cell的重新布局 cell的布局填充等操作 比较耗时,一般创建时就布局好 如可以将cell单独放到一个自定义类,初始化时就布局好

解决ios下的微信打开的页面背景音乐无法自动播放

后面的项目发现,还有两个坑,需要注意下: ·本文的解决方案的核心是利用了 微信/易信 在ready的时候会有个 WeixinJSBridgeReady/YixinJSBridgeReady事件,通过监听这个事件来触发的.那有个坑就是 如果微信已经ready了,但还没执行到你监听这个ready事件的代码,那么你的监听是没用的,所以最理想的情况是,监听的js放在head前面(放在css外链之前),确保最新执行,切记!切记!. ·另一个坑就是,本文的解决方案只适合一开始就播放的背景音乐.如果你是做那种

iOS程序执行顺序和UIViewController 的生命周期(整理)

说明:此文是自己的总结笔记,主要参考: iOS程序的启动执行顺序 AppDelegate 及 UIViewController 的生命周期 UIView的生命周期 言叶之庭.jpeg 一. iOS程序的启动执行顺序 程序启动顺序图 iOS启动原理图.png 具体执行流程 程序入口进入main函数,设置AppDelegate称为函数的代理 程序完成加载[AppDelegate application:didFinishLaunchingWithOptions:] 创建window窗口 程序被激活[

iOS库--.a与.framework

一.什么是库? 库是共享程序代码的方式,一般分为静态库和动态库. 二.静态库与动态库的区别? 静态库:链接时完整地拷贝至可执行文件中,被多次使用就有多份冗余拷贝. 动态库:链接时不复制,程序运行时由系统动态加载到内存,供程序调用,系统只加载一次,多个程序共用,节省内存. 三.iOS里静态库形式? .a和.framework 四.iOS里动态库形式? .dylib和.framework 五.framework为什么既是静态库又是动态库? 系统的.framework是动态库,我们自己建立的.fram