自定义UICollectionViewController之后 如何设置UICollectionView的布局方式

我们很多时候使用UICollectionView 可能都是直接创建 UICollectionView   通过初始化的时候  传入一个布局对象的方式来使用UICollectionView

比如我们之前是这样写得:

1  UICollectionViewFlowLayout *layout = [[UICollectionViewFlowLayout alloc] init];
2
3     UICollectionView *collection = [[UICollectionView alloc] initWithFrame:self.view.bounds collectionViewLayout:layout];

但是有时候这样的方式 可能达不到我们的需求  ,比如我们想利用collectionView  创建一个app的新特性的引导界面  这个时候上面这种方式就不适用  这个时候 我们就需要自定义UICollectionViewController

但是这样的画 问题就来了  ,当我们自定义了UICollectionViewController 就无法设置 UICollectionView的布局样式了 ,因为 当我们继承了 UICollectionViewController  他内部的UICollectionViewLayout是只读的无法修改

这个时候 你可能会说  UICollectionViewController  里面不是有个collectionView  吗  ? 拿到collectionView 不就可以修改collectionView的布局了 吗?   当然不行了  因为我们现在时自定义了UICollectionViewController

我们在使用UICollectionViewController 控制器的 时候,也就是初始化的时候 就需要为UICollectionViewController  传入一个布局对象   不相信是吧 !  下面给你演示下 :我们在viewDidLoad  里面修改collectionView的布局

这个时候一运行程序 你会发现报如下错误:

看到这里 你应该相信我说的了吧,也就是 必须在创建collectionViewColler的时候 传入布局对象,那么如何解决呢?

这个时候 就是考验我们对创建对象的理解了 ,我们知道 当我创建一个对象的时候 一般是使用这样的方式:

[[UICollectionViewController  alloc] init]

上面的代码做了两件事:

1.在堆区为UICollectionViewController开辟一块内存空间

2.调用对象的init方法 做一些初始化的操作

讲到这里 聪明的你 一定知道怎么做了,  没错 ,就是在 init方法 上面 做手脚    ,我们可以在init方法里面设置UICollectionViewController 的布局方式

下面是我的做法:

 1 - (instancetype)init
 2 {
 3     //创建流水布局对象
 4     UICollectionViewFlowLayout *layout = [[UICollectionViewFlowLayout alloc] init];
 5     layout.itemSize =  [UIScreen mainScreen].bounds.size;
 6
 7     //设置水平滚动
 8     layout.scrollDirection = UICollectionViewScrollDirectionHorizontal;
 9
10     //    // 设置cell之间间距
11     layout.minimumInteritemSpacing = 0;
12     //    // 设置行距
13     layout.minimumLineSpacing = 0;
14
15     return [super initWithCollectionViewLayout:layout];
16 }

这样我们一创建 UICollectionViewController  的时候 默认就会由流水布局的样式了

其他的一些设置,下面粘贴出我自己写的全部代码

下面是自定义SYCollectionViewController.m文件里面的全部代码
 1 /**
 2 下面是自定义SYCollectionViewController.m文件里面的全部代码
 3 */
 4
 5 #import "SYCollectionViewCell.h"
 6 #import "SYCollectionViewController.h"
 7
 8 @interface SYCollectionViewController ()
 9
10 @end
11
12 @implementation SYCollectionViewController
13
14 - (instancetype)init
15 {
16     //创建流水布局对象
17     UICollectionViewFlowLayout *layout = [[UICollectionViewFlowLayout alloc] init];
18     layout.itemSize =  [UIScreen mainScreen].bounds.size;
19
20     //设置水平滚动
21     layout.scrollDirection = UICollectionViewScrollDirectionHorizontal;
22
23     //    // 设置cell之间间距
24     layout.minimumInteritemSpacing = 0;
25     //    // 设置行距
26     layout.minimumLineSpacing = 0;
27
28     return [super initWithCollectionViewLayout:layout];
29 }
30
31 static NSString *ID = @"cell";
32 - (void)viewDidLoad
33 {
34     [super viewDidLoad];
35
36     self.collectionView.pagingEnabled = YES;
37
38     //隐藏水平滚动条
39     self.collectionView.showsHorizontalScrollIndicator = NO;
40
41     //取消弹簧效果
42     self.collectionView.bounces = NO;
43
44     //注册cell
45     [self.collectionView registerClass:[SYCollectionViewCell class] forCellWithReuseIdentifier:ID];
46
47 }
48
49
50 /**
51  *  一共有多少组数据
52  */
53 - (NSInteger)numberOfSectionsInCollectionView:(UICollectionView *)collectionView
54 {
55     return 1;
56 }
57
58 /**
59  *  每一组有多少条数据
60  */
61 - (NSInteger)collectionView:(UICollectionView *)collectionView numberOfItemsInSection:(NSInteger)section
62 {
63     return 4;
64 }
65
66 /**
67  *  每一个cell的显示样式
68  *
69  */
70 - (UICollectionViewCell*)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath
71 {
72     SYCollectionViewCell *cell = [collectionView dequeueReusableCellWithReuseIdentifier:ID forIndexPath:indexPath];
73
74     cell.image  = [UIImage imageNamed:[NSString stringWithFormat:@"guide%ldBackground",indexPath.item+1]];
75
76     NSLog(@"%@",[NSString stringWithFormat:@"guide%ldBackground",indexPath.item+1]);
77
78     return cell;
79 }
80 @end
下面是自定义cell ,SYCollectionViewCell.h文件里面的全部代码
1 #import <UIKit/UIKit.h>
2
3 @interface SYCollectionViewCell : UICollectionViewCell
4 /**cell显示的图片**/
5 @property(nonatomic,strong)UIImage *image;
6 @end

下面是自定义cell ,SYCollectionViewCell.m文件里面的全部代码

 1 #import "SYCollectionViewCell.h"
 2
 3 @interface SYCollectionViewCell ()
 4
 5 /**内部imageView控件**/
 6 @property(nonatomic,weak)UIImageView *imageView;
 7
 8 @end
 9
10 @implementation SYCollectionViewCell
11 /**
12  *  重写imageView的getter方法  在里面做添加imageView到cell上面的操作
13  *
14  */
15 - (UIImageView *)imageView
16 {
17     if (!_imageView) {
18         //创建一个新的UIImageView 对象
19         UIImageView *imageView = [[UIImageView alloc] initWithFrame:self.bounds];
20
21         //赋值给成员变量
22         _imageView = imageView;
23
24         //添加到cell中
25         [self.contentView addSubview:imageView];
26     }
27     return _imageView;
28 }
29
30 /**
31  *  重写setter方法 为imageView赋值
32  *
33  */
34 - (void)setImage:(UIImage *)image
35 {
36     _image = image;
37     //为imageView赋值
38     self.imageView.image = image;
39 }
40
41
42 @end

如何使用了 ,为了操作简单  我就直接设置了窗口的根控制器为UICollectionViewController  控制器 所以在AppDelegate 写上如下代码

这样好了  允许效果如下:

 
时间: 2024-08-04 12:34:15

自定义UICollectionViewController之后 如何设置UICollectionView的布局方式的相关文章

自定义UICollectionViewController之后 如何设置UICollectionView的布局方式--备用

我们很多时候使用UICollectionView 可能都是直接创建 UICollectionView   通过初始化的时候  传入一个布局对象的方式来使用UICollectionView 比如我们之前是这样写得: 1 UICollectionViewFlowLayout *layout = [[UICollectionViewFlowLayout alloc] init]; 2 3 UICollectionView *collection = [[UICollectionView alloc]

Android应用之——利用getItemViewType为Listview的item设置不同的布局

一.概述 在项目的需求中,有一处需要显示一个交易记录的列表,这个列表很容易让人联想到用listview来实现,但是这个列表又有稍许不同的地方,那就是它里面的item并不是一样的布局,其中某些部分显示的是消费的记录,而有些地方显示的是充值的记录,也就对应了不同的item布局.而且,这两处地方都是从服务端获取数据的,这两个item的数据对应的类内容也各不相同,该怎么处理呢? 下面来一步步实现这个效果. 二.先看效果图 三.实现步骤 实现的原理就是listview的adapter中的一个关键的方法就是

SAP系统取消用户设置ALV全局布局

文章为原创,转载请联系我,欢迎交流[email protected] 大部分情况下,ALV布局由关键用户或者系统管理员控制,一般用户不需要改变布局. SAP取消用户设置ALV全局布局 具有权限对象S_ALV_LAYO且其值为23时用户可以更改全局布局,即更改后所有用户的那个页面的布局跟着改变 先查找哪些角色包含改权限对象 T-code:/nsuim 更改其值 双击查到的角色 CTRL + F 输入 S_ALV_LAYO 授权对象:S_ALV_LAYO,取消该授权对象23的权限,用户将不可设置全局

easyui 自定义验证,动态设置提示信息

//自定义验证规则 名称为name //$.fn.validatebox.defaults.rules.name.message 动态自定义提示内容 $.extend($.fn.validatebox.defaults.rules, { name: { validator: function (value, param) { var error=false;; if(!/^\S{4,25}$/.test(value)){ //4-25验证 $.fn.validatebox.defaults.ru

gnome设置dvorak键盘布局

若桌面环境为gnome,设置Dvorak键盘程序员布局很简单.系统设置 -> 键盘 -> 布局设置 -> 点击"+" ->选择"英语(适合程序员的Dvorak布局) 之后在布局选项里可以绑定切换布局的快捷键,以便换回qwerty 另外可用xmodmap修改键映射 下面这个图片可以保存下来作为壁纸,练习时查看 更多参考资料 http://www.kaufmann.no/roland/dvorak/ http://www.cnblogs.com/zhang

自定义Button 的图片设置不显示问题。

如果你是自定义button  那么你设置图片就要用 button.imageView.image = [UIImage imageName:@""]; 如果你是给系统原生的button设置图片就要用 [button setImage:[UIImage imageName:@""] forstate:]; 因为自定义button 设置图片的话,就相当于给一个普通的imageView设置图片..原生button  就要用系统原生的方法来设置button.

利用column-width属性设置多栏布局

css样式设置为: div{ background:blanchedalmond; margin:0 auto; width:1230px; -moz-column-width:400px; -webkit-column-width:400px; } 在利用column-width属性设置多栏布局是可能会出现这样的情况:每列长度为600px 与设置的样式相悖,出现这种情况的原因是column-gap的最小值为1em即列与列之间的最小距离为16px;当列的长度为400px ,如果将整个div分为3

Swing自定义JScrollPane的滚动条设置,重写BasicScrollBarUI方法

Swing自定义JScrollPane的滚动条设置,重写BasicScrollBarUI方法 摘自:https://blog.csdn.net/qq_31635851/article/details/80986870 1.自定义BasicScrollBarUI类 1 import java.awt.AlphaComposite; 2 import java.awt.Color; 3 import java.awt.Dimension; 4 import java.awt.GradientPain

Android 开发之旅:view的几种布局方式及实践

本文的主要内容就是分别介绍以上视图的七种布局显示方式效果及实现,大纲如下: 1.View布局概述 2.线性布局(Linear Layout) 2.1.Tips:android:layout_weight="1" 3.相对布局(Relative Layout) 4.表格布局(Table Layout) 5.列表视图(List View) 5.1.一个小的改进 5.2.补充说明 6.网格视图(Grid View) 7 .绝对布局() 8.标签布局(Tab Layout) 1.view的布局