我正在开展基于收藏视图的项目,根据用户点击特定索引,Numberofitem将被更改并增加. all在我的项目中完美工作,但是我无法根据collection-view中的单元格数设置单元格大小.此外,collectionview将无法通过调整大小来查看所有单元格修复.
这里我附上了所有的形象.
这里我附上了所有的形象.
1)故事板视图
2)结果与四个单元格
3)当细胞数增加时
目前,我通过以下代码完成了我的单元格的设置.但是我想设置,如果在集合视图中有四个单元格,则每个单元格的大小将根据收藏视图和设备大小增加并适合(iphone 5s,iphone 6,iphone 6plus)
这是我的尝试,
-(CGFloat)collectionView:(UICollectionView *)collectionView layout:(UICollectionViewLayout *)collectionViewLayout minimumInteritemSpacingForSectionAtIndex:(NSInteger)section{ return 5.0; } -(CGFloat)collectionView:(UICollectionView *)collectionView layout:(UICollectionViewLayout *)collectionViewLayout minimumLineSpacingForSectionAtIndex:(NSInteger)section{ return 5.0; } - (CGSize)collectionView:(UICollectionView *)collectionView layout:(UICollectionViewLayout *)collectionViewLayout sizeForItemAtIndexPath:(NSIndexPath *)indexPath { ////@property NSInteger count;//// if (_count == 0) { // width = ((width - (span*5))/4); // return CGSizeMake(self.view.frame.size.width/4,self.view.frame.size.height/4); return CGSizeMake(self.view.frame.size.width/2.5,self.view.frame.size.height/5); } if (_count == 1 || _count == 2) { return CGSizeMake(self.view.frame.size.width/2.5,self.view.frame.size.height/5); // return CGSizeMake(100.0,100.0); } if ( _count == 3 || _count == 4 || _count == 5) { // return CGSizeMake(100.0,100.0); return CGSizeMake(self.view.frame.size.width/3.5,self.view.frame.size.height/6.5); } if ( _count == 6 || _count == 7 || _count == 8 || _count == 9) { //return CGSizeMake(90.0,90.0); return CGSizeMake(self.view.frame.size.width/4,self.view.frame.size.height/8); } if ( _count == 10 || _count == 11 || _count == 12 || _count == 13 || _count == 14) { // return CGSizeMake(80.0,80.0); return CGSizeMake(self.view.frame.size.width/4,self.view.frame.size.height/8); } if ( _count == 15 || _count == 16 || _count == 17 || _count == 18 || _count == 19 || _count ==20) { //return CGSizeMake(70.0,70.0); return CGSizeMake(self.view.frame.size.width/4.75,self.view.frame.size.height/9.5); } if (_count ==21 || _count == 22 || _count == 23 || _count == 24 || _count == 25 || _count == 26 || _count == 27) { // return CGSizeMake(60.0,60.0); return CGSizeMake(self.view.frame.size.width/6,self.view.frame.size.height/12); } if (_count ==28 || _count == 29 ) { // return CGSizeMake(50.0,50.0); return CGSizeMake(self.view.frame.size.width/6.25,self.view.frame.size.height/12.5); } else return CGSizeMake(0,0); } - (NSInteger)collectionView:(UICollectionView *)collectionView numberOfItemsInSection:(NSInteger)section { return itemincollectionview.count; }
注意:-
我也尝试过这个方法.
- (void)viewDidLayoutSubviews { self.automaticallyAdjustsScrollViewInsets = NO; [self.collectionView layoutIfNeeded]; NSArray *visibleItems = [self.collectionView indexPathsForVisibleItems]; NSIndexPath *currentItem = [visibleItems objectAtIndex:0]; NSIndexPath *nextItem = [NSIndexPath indexPathForItem:_setRandomIndex inSection:currentItem.section]; [self.collectionView scrollToItemAtIndexPath:nextItem atScrollPosition:UICollectionViewScrollPositionNone animated:YES]; } - (void)viewWillLayoutSubviews { [super viewWillLayoutSubviews]; [self.collectionView.collectionViewLayout invalidateLayout]; } -(void)viewWillAppear:(BOOL)animated { [super viewWillAppear:YES]; [self.view layoutIfNeeded]; }
解决方法
据我所知,你想复制
this测试的布局.
您需要更好地了解UICollectionView的工作原理,如here
您将必须更改此代理方法中的UICollectionView中的项目数量:
- (NSInteger)numberOfItemsInSection:(NSInteger)section;
在这里,你想在测试开始时返回4,然后是4 * 2,4 * 2 * 2,依此类推.这将给你正确的项目数量.
然后布局.您应该有多个值,因为您不需要元素之间的距离与开始和结束相同的空间.随着物品数量的增加,我会去减少空间.
您需要注意间距,因为它可能导致单元格被强制在下一行
你已经做了很好的工作,通过划分框架获得最大的高度&细胞的宽度,但你的
- (CGSize)collectionView:(UICollectionView *)collectionView layout:(UICollectionViewLayout *)collectionViewLayout sizeForItemAtIndexPath:(NSIndexPath *)indexPath
方法真的很杂乱
由于您的UICollectionView中不会有无限数量的项目,因此您可以使用switch语句,并在每个开关中返回单元格的计算CGSize.
例如,您可以使用它:
switch (numberOfHorizontalItems) { case 2: return CGSizeMake(self.collectionView.frame.size.width/2.5,self.collectionView.frame.size.width/2.5); break; case 4: return CGSizeMake(self.collectionView.frame.size.width/4.5,self.collectionView.frame.size.width/4.5); break; case 8: CGSizeMake(self.collectionView.frame.size.width/8.5,self.collectionView.frame.size.width/8.5); break; (And so on) default: break; }
您应该注意,这里显示的计算出的CGSize必须包含项之间的间距/合并
您也不需要viewWillLayoutSubviews和viewDidLayoutSubviews,您只需要在用户点击单元格时(或在用户点击单元格后处理逻辑的方法中)调用[self.collectionView reloadData]
最后,如果你不想UICollectionView是可滚动的,只需设置属性self.collectionView.scrollEnabled = NO;