iOS UICollectionView怎样根据item的样本数量的确定来确定高度

主题 : iOS UICollectionView怎样根据item的数量来确定高度
级别: 侠客
UID: 564604
可可豆: 684 CB
威望: 619 点
在线时间: 197(时)
发自: Web Page
来源于&&分类
iOS UICollectionView怎样根据item的数量来确定高度&&&
item的数量是变化的
级别: 侠客
可可豆: 217 CB
威望: 217 点
在线时间: 428(时)
发自: Web Page
同问&&&&&&&&&&&&&&&&&&&&&&&& 。
级别: 新手上路
UID: 316733
可可豆: 89 CB
威望: 79 点
在线时间: 380(时)
发自: Web Page
跟tableview 的动态高度差不多啊。。。只不过你要计算换行之后的高度&&比如你3个一行&&你就只算一行的高度&& 4个那就要算2行高度 同理7行3行高度 以此类推&& 记得算上行间距
拉低iOS平均薪资的罪人
级别: 侠客
UID: 564604
可可豆: 684 CB
威望: 619 点
在线时间: 197(时)
发自: Web Page
回 2楼(codelin) 的帖子
比如说第一次进来高度是itemHeight*6,横屏滑动后是itemHeight*5,在滑动一屏又变成itemHeight*4,就是item数量不确定
级别: 新手上路
UID: 316733
可可豆: 89 CB
威望: 79 点
在线时间: 380(时)
发自: Web Page
不是很理解你的需求&&&&横向滑动的话 你用collectionview&& 布局应该不是理想吧
拉低iOS平均薪资的罪人
级别: 新手上路
UID: 485800
可可豆: 251 CB
威望: 198 点
在线时间: 491(时)
发自: Web Page
回 4楼(codelin) 的帖子
每行个数不固定,又怎么办
级别: 骑士
UID: 546406
可可豆: 763 CB
威望: 763 点
在线时间: 483(时)
发自: Web Page
reloadData后取contentSize.height
级别: 新手上路
可可豆: 1 CB
威望: 1 点
在线时间: 3(时)
发自: Web Page
回 5楼(海宝笨笨) 的帖子
我也遇到同样的问题!!!!
关注本帖(如果有新回复会站内信通知您)
苹果公司现任CEO是谁?2字 正确答案:库克
发帖、回帖都会得到可观的积分奖励。
按"Ctrl+Enter"直接提交
关注CocoaChina
关注微信 每日推荐
扫一扫 浏览移动版主题 : iOS UICollectionView怎样根据item的数量来确定高度
级别: 侠客
UID: 564604
可可豆: 684 CB
威望: 619 点
在线时间: 197(时)
发自: Web Page
来源于&&分类
iOS UICollectionView怎样根据item的数量来确定高度&&&
item的数量是变化的
级别: 侠客
可可豆: 217 CB
威望: 217 点
在线时间: 428(时)
发自: Web Page
同问&&&&&&&&&&&&&&&&&&&&&&&& 。
级别: 新手上路
UID: 316733
可可豆: 89 CB
威望: 79 点
在线时间: 380(时)
发自: Web Page
跟tableview 的动态高度差不多啊。。。只不过你要计算换行之后的高度&&比如你3个一行&&你就只算一行的高度&& 4个那就要算2行高度 同理7行3行高度 以此类推&& 记得算上行间距
拉低iOS平均薪资的罪人
级别: 侠客
UID: 564604
可可豆: 684 CB
威望: 619 点
在线时间: 197(时)
发自: Web Page
回 2楼(codelin) 的帖子
比如说第一次进来高度是itemHeight*6,横屏滑动后是itemHeight*5,在滑动一屏又变成itemHeight*4,就是item数量不确定
级别: 新手上路
UID: 316733
可可豆: 89 CB
威望: 79 点
在线时间: 380(时)
发自: Web Page
不是很理解你的需求&&&&横向滑动的话 你用collectionview&& 布局应该不是理想吧
拉低iOS平均薪资的罪人
级别: 新手上路
UID: 485800
可可豆: 251 CB
威望: 198 点
在线时间: 491(时)
发自: Web Page
回 4楼(codelin) 的帖子
每行个数不固定,又怎么办
级别: 骑士
UID: 546406
可可豆: 763 CB
威望: 763 点
在线时间: 483(时)
发自: Web Page
reloadData后取contentSize.height
级别: 新手上路
可可豆: 1 CB
威望: 1 点
在线时间: 3(时)
发自: Web Page
回 5楼(海宝笨笨) 的帖子
我也遇到同样的问题!!!!
关注本帖(如果有新回复会站内信通知您)
苹果公司现任CEO是谁?2字 正确答案:库克
发帖、回帖都会得到可观的积分奖励。
按"Ctrl+Enter"直接提交
关注CocoaChina
关注微信 每日推荐
扫一扫 浏览移动版使用 estimatedItemSize 实现 CollectionViewCell 自适应高度 - 简书
使用 estimatedItemSize 实现 CollectionViewCell 自适应高度
必须 iOS8.0 以上版本
今年苹果推出了 iOS10 ,往下数三个版本,也就说我们不必支持iOS7.0 了。这真是极好的消息。吓得我赶紧日一下狗表示自己的激动。这意味着我们不必再用纯代码,自己去计算 cell 的高度。可以使用 iOS8.0 的 Self-Sizing Cells
1. 设置 estimatdItemSize
设置 layout 的 estimatdItemSize (预估高度)
layout.estimatedItemSize = CGSizeMake(itemWidth, itemHeight);
默认值为 CGSizeZero ,给一个非0值开启高度估算。
2. 给 cell 添加约束
如果想要 cell 高度自适应,一定要给清楚 cell 宽度的约束;如果想要宽度自适应,给定高度约束。
注意: 不要在 xib 或者 Storyboard 给控件添加约束,因为这样添加上 top 和 left 会直接添加到 cell 上,而不是cell.contentView 上。(如果你是纯代码选手,请忽视这一点。)
同时我们还需要把 xib File's owner 的 Use Auto Layout 给禁用掉。
iOS8.0 之后苹果加强了 autolayout 的推广使用。在 WWDC2015 大会中 特别介绍了这一点。视频地址:
虽然苹果的autoLayout语法变得简洁了许多,但个人更喜欢用 Masonry 来写约束。
下面将用 Masonry 来写 图中的约束。最下面的灰色字体 Label 为动态高度。
// 注意: 一定要 禁用 file's owner 的 autoLayout
[self.contentView makeConstraints:^(MASConstraintMaker *make) {
make.left.top.equalTo(@(0));
make.width.equalTo(@(screenWidth - 12 * 2)); // 这里必须给定width的值
make.bottom.equalTo(ws.descLabel.bottom).offset(10); // content.bottom = ws.desLabel.bottom + 10
[self.coverImageView makeConstraints:^(MASConstraintMaker *make) {
make.left.top.width.equalTo(ws.contentView);
make.height.equalTo(ws.coverImageView.width).multipliedBy(110/351.0);
[self.titleLabel makeConstraints:^(MASConstraintMaker *make) {
make.left.equalTo(ws.coverImageView).offset(10);
make.top.equalTo(ws.coverImageView.bottom).offset(10);
make.width.equalTo(ws.coverImageView);
make.height.equalTo(@(17));
[self.descLabel makeConstraints:^(MASConstraintMaker *make) {
make.left.equalTo(ws.titleLabel);
make.top.equalTo(ws.titleLabel.bottom).offset(10);
make.width.equalTo(ws.titleLabel);
make.height.greaterThanOrEqualTo(@(14)).priority(1000);
注意: (前提高度自适应)1、必须给定 contentView 的宽度2、top 和 bottom 约束一定要设定,并且注意 contentView.bottom = descLabel.bottom 是给 contentView 添加约束。
3. 重写 preferredLayoutAttributesFittingAttributes 方法
在该方法内部,获取 contentView 自适应的 size。更改 attributes.frame 后返回。
// 重写优先约束属性
- (UICollectionViewLayoutAttributes *)preferredLayoutAttributesFittingAttributes:(UICollectionViewLayoutAttributes *)layoutAttributes {
[self setNeedsLayout];
[self layoutIfNeeded];
CGSize size = [self.contentView systemLayoutSizeFittingSize:layoutAttributes.size]; // 获取自适应size
CGRect newFrame = layoutAttributes.
newFrame.size.height = size.
newFrame.size.width = screenWidth - 12 * 2; // 不同屏幕适配
layoutAttributes.frame = newF
return layoutA
效果如图:录屏用的 30fps 实际上是很流畅的。
参考资料:
菜鸟一枚 提臀迎大牛调教collectionview,ios,footerview的高度为什么设置
编辑: 万众百科网 &&&来源:用户发表&&&发布时间:&&&点击次数:46
求助了茑!collectionview,ios,footerview的高度为什么设置?急急急。
【最新回答】
怎样在UICollectionView中添加Header和footer
首先检索该数组的section number然后从section中获取具体的items。 最后,怎样给collection view实现两个section,这个可以通过方法调用下面的方法来完成即:在RecipeCollectionViewController.m中的numberOfSectionsInCollectionView方法,在col...
ios怎么设置collectionview的head跟tabview的hea...
可以利用Tabview的separatorStyle属性来设置,选择其中的UITableViewCellSeparatorStyleNone 可去除cell之间的下划线。self.tableView.separatorStyle = UITableViewCellSeparatorStyleN
为什么自定义的uicollectionviewflowlayout没有hea...
初始化: //初始化布局类(UICollectionViewLayout的子类) UICollectionViewFlowLayout *fl = [[UICollectionViewFlowLayout alloc]init]; //初始化collectionView self.collectionView = [[UICollectionView alloc]initWithFrame:CGRectZero coll...
如何纯代码给UICollectionView添加HeaderView和Foo...
collectionView和table基本用法一样但是header和footer,就找不到方法了 自己找了好久网上也没个人写的就一个写的是用storyBoard写的 对于纯代码的可能不怎么太理解。 自己摸索的做出来了。下面纯代码的步骤: 如果要给你的collectionView添加he...
怎样在UICollectionView中添加Header和footer-iPho...
每个collection view都必须有数据源为其提供内容。它的责任是为collection views完成以下的事情: 控制collection view的section数目 每个section中的item的个数 为特定的数据项提供cell view 显然,简单的Recipe app,我们在前面的教程中包含了
电脑数码相关
更多相关内容
本站内容来自网友发布,本站无法保证其部分内容的正确性,请用户一定仔细辨别。
[] &&[联系QQ:] &
沪ICP备号&iOS 中 TableView 内嵌套 CollectionView 动态高度的实现
我的图书馆
iOS 中 TableView 内嵌套 CollectionView 动态高度的实现
原文出处: &&&在有社交分享平台属性的app中,我们经常看见类似有tableview中多图展示。不管是发布的表单界面中,还是社交动态的时间线的界面中,都需要根据图片数量动态变化界面。最近刚好写了一个这样的界面,花了点时间写了个Demo总结一下,希望可以帮助有需要的人。实现Demo效果如下图。
collectionintable.gif
实现原理分析
初步思路是在tableview的cell中内嵌一个collecitonview,collectionview高度动态变化并是collectionview所在的tableview的cell的高度动态变化。总结起来我们需要这几件事:
1.实现一个tableview并自定义一种tableviewcell并实现高度自适应
2.在tableviewcell中实现collectionview并实现高度动态变化
3.自定义collectionviewcell中实现按钮点击事件(如删除,跳转),数据展示操作
1.实现tableview和自定义tableviewcell
tableview就很简单,storyboard或者代码写一下都可以。实现数据源协议啥的,很普通。要实现tableviewcell的高度自适应,一般来说有两种方式,一种是用iOS7后支持的cell的estimatedRowHeight和iOS8后支持的self-sizing cells(两者差不多,iOS8更完善一些),另一种是用孙源大神的第三方开源库,可以看这篇,两者共同之处都是需要设置cell里contenview的元素对cell的contenview的四个边的布局约束,换言之要让cell里的元素把cell四边“撑”起来。Demo里使用了原生的self-sizing cells来高度自适应,需要下面两句代码。
self.tableview.estimatedRowHeight = 100.f;//数字为大致估算高度,比如有些50有些100可以估算75左右self.tableview.rowHeight = UITableViewAutomaticDimension;
如果tableview是用代码创建的,那么rowheight属性的默认参数就是UITableViewAutomaticDimension,不需要第二行代码。而在storyboard或xib里拖的默认rowheight是拖的storyboard属性菜单里的,需要更改为UITableViewAutomaticDimension。
接着自定义一个CDZTableViewCell,并用xib拖上一个collectionview并设置对contenview的autolayout约束。用Masonry之类的第三方布局库或原生进行代码约束也可以。然后在tableview里用registerNib方法注册一下自定义的cell。当然要实现动态高度变化,我们还需要让cell在合适的时候通知tableview应该更新数据和布局了,即调用tableview自身的reloadData方法。这里我用delegate实现,通知的话也可以,但是通知的要明确接受者和发送者的对应关系,不然有些情况会接受对象不明确(比如实现了两个类似的tableview在视图里)。在cell的头文件里创建delegate。
@protocol CDZTableViewCellDelegate- (void)shouldReload;@end@interface CDZTableViewCell : UITableViewCell@property (nonatomic,assign) id delegate;@end
然后让tableview遵守CDZTableViewCellDelegate并在tableview的datasource或delegate方法里设置cell的delegate,比如
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{&&&&//......&&&&cell.delegate = self;&&&&//......}
也可以在delegate里的-(void)collectionView:(UICollectionView *)collectionView willDisplayCell:(UICollectionViewCell *)cell forItemAtIndexPath:(NSIndexPath *)indexPath里设置(感觉这个方法更好些,datasource应该处理数据相关的,而且有时候会复用抽离出来)。
2.实现collectionview和自定义collectionviewcell
collectionview在约束上,除了实现collecitionview对tableviewcell的上下左右约束外,还要实现其高度约束,因为本质collectionview是scrollview的子类,实现scollview的autolayout其实就是需要实现对其撑起来contentview的约束,而动态实现contentview的高度,则需要我们更新contenview的高度布局约束的值。collectionview也是类似的,我们先设定一个collectionview的高度约束,再在数据更新时更新高度约束。
这里再提一句,collectionview本身和tableview类似,系统本身也有self-sizing cells的api,如下:
self.collectionViewFlowLayout.estimatedItemSize = CGSizeMake(125, 100);self.collectionViewFlowLayout.itemSize = UICollectionViewFlowLayoutAutomaticSize;
同样也要实现collectionviewcell里元素对cell四边的约束,“撑”起来自动计算高度,但是不知道为何用了之后在一个cell的时候会莫名其妙居中,且cell的indexPath有些错乱,根据cell的indexPath找出来的cell是错误的,不知道是啥问题,若有人知道可以告诉一声囧。
这里就不用collectionview的大小自适应了,常规的用设置itemsize的大小就好了。在tableviewcellawakeFromNib方法中,我们让collectionviewreloadData更新一下高度布局约束为collectionview的真实高度并调用刚才自定义的delegate去让tableviewreloadData从而让tableview的cell高度自适应。
- (void)reloadCell{&&&&[self.collectionView reloadData];&&&&self.collectionViewHeightLayout.constant =&&&&&&self.collectionViewFlowLayout.collectionViewContentSize.height;&&&&[self updateConstraintsIfNeeded];&&&&[self.delegate shouldReload];}
collectionview的真实大小其实是他的layout对象的collectionviewcontentsize的值。所以我们需要在每次数据发生改变时,更新一下高度约束的值。
还有就是实现collectionview的delegate,点击后执行操作,在赋值在cell对应的model里等操作(比如调用相册等)。注意当点击最后一个collectioncell时,要在它的后面插入一个数据,也就是说,最后一个总是会保持在最后。
123456789101112
- (void)collectionView:(UICollectionView *)collectionView didSelectItemAtIndexPath:(NSIndexPath *)indexPath{&&&&//载入数据,如图片等&&&&CDZCollectionViewItem *item = [CDZCollectionViewItem new];&&&&item.image = [UIImage imageNamed:@'example'];&&&&if ((indexPath.row == self.itemsArray.count - 1)) {&&&&&&&&[self.itemsArray insertObject:item atIndex:self.itemsArray.count - 1];&&&&}&&&&else{&&&&&&&&self.itemsArray[indexPath.row] = item;&&&&}&&&&[self reloadCell];}
3.自定义collectionviewcell并实现删除按钮
先自定义一个CDZCollectionViewCell,并用xib拖上一个imageview用于展示图片,一个button用于点击关闭cell。并定义好解析item的方法。item中设定一个delBtnHidden属性用于设定cell里的button是否隐藏。
- (void)setItem:(CDZCollectionViewItem *)item{&&&&//&&解析需要的数据&&&&self.imageView.image = item.image;&&&&self.delButton.hidden = item.delBtnHidden;}
并定义一个delegate用于将按钮点击事件回传给collectionview并删除数据。
@protocol CDZCollectionCellDelegate- (void)didDelete:(UICollectionViewCell *)cell;@end@interface CDZCollectionViewCell : UICollectionViewCell@property (strong, nonatomic) CDZCollectionViewItem *item;@property (assign, nonatomic) id delegate;@end
并在点击按钮的事件中调用delegate,把cell本身传回tableview,从而找到cell对应的item。
- (IBAction)delCell:(UIButton *)sender{&&&&if ([self.delegate respondsToSelector:@selector(didDelete:)]){&&&&&&&&[self.delegate didDelete:self];&&&&}}
然后使collectionview所在的tableviewcell遵守CDZCollectionCellDelegate。并和之前一样,在collectionview的datasource或delegate中设置delegate。
- (UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath{&&&&//......&&&&cell.delegate = self;&&&&//......}
并调用cell的delegate的方法,通过cell去找到对应的indexPath
- (void)didDelete:(UICollectionViewCell *)cell{&&&&NSIndexPath *indexPath = [self.collectionView indexPathForCell:cell];&&&&[self.itemsArray removeObjectAtIndex:indexPath.row];&&&&[self reloadCell];}
第一个cell是没有关闭按钮的,那么只要把第一个item的delBthHidden属性设为YES就可以了。
所有源码和
如果您觉得有帮助,不妨给个star鼓励一下,欢迎关注&交流
有任何问题欢迎评论私信或者提issue
TA的最新馆藏
喜欢该文的人也喜欢

我要回帖

更多关于 qtreeview item数量 的文章

 

随机推荐