使UICollectionViewCell完全适合可用空间

时间:2013-12-15 04:22:51

标签: ios cocoa-touch uikit uicollectionview

我的细胞是正方形,看起来很好。我希望找到最大的单元格大小,以便显示所有单元格不需要滚动。

例如,这个屏幕截图对于3个玩家来说非常棒,但是将它踢到12个玩家会让它们滚出界限,这是应该避免的。

有没有办法实现这个目标?

enter image description here

3 个答案:

答案 0 :(得分:2)

根据上面的rdelmar代码,取出所有的技巧。蛮力计算确保在某些边缘情况下正确答案,另一个答案失败。

使用二进制搜索提高效率。

// Make the cells fit
override func viewDidLayoutSubviews() {
    var highestWorking = 0
    var lowestNotWorking = 9999
    while lowestNotWorking > highestWorking + 1 {
        let currentTest = (highestWorking + lowestNotWorking) / 2
        let cols = Int(playerPhotoCollectionView.frame.size.width + 10) / (currentTest + 10)
        let rows = Int(playerPhotoCollectionView.frame.size.height + 10) / (currentTest + 10)
        if cols * rows >= game.numberOfPlayers {
            highestWorking = currentTest
        } else {
            lowestNotWorking = currentTest
        }
    }
    let size = CGSize(width: CGFloat(highestWorking), height: CGFloat(highestWorking))
    (self.playerPhotoCollectionView.collectionViewLayout as! UICollectionViewFlowLayout).itemSize = size
    super.viewDidLayoutSubviews()
}

答案 1 :(得分:1)

解决这个问题的主要是代数,并抛出一点逻辑。首先,你需要获得集合视图的宽高比,这样你就知道是否应该有更多行或更多列。一旦你知道了,你就可以计算itemsPerRow和numberOfRows。由于您希望单元格为正方形,因此您需要使用计算的两个尺寸中较小的一个,以适应行或列中的项目数。计算尺寸时,需要考虑每个方向的最小间距。这是一个小测试项目,展示了我是如何做到的。

#define PLAYERS 4.0
#import "ViewController.h"

@interface ViewController ()
@property (weak,nonatomic) IBOutlet UICollectionView *collectionView;
@end

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    [(UICollectionViewFlowLayout *)self.collectionView.collectionViewLayout setMinimumInteritemSpacing:10];
    [(UICollectionViewFlowLayout *)self.collectionView.collectionViewLayout setMinimumLineSpacing:10];
}

-(void)viewDidLayoutSubviews {
    CGFloat aspectRatio =  (self.collectionView.bounds.size.height/self.collectionView.bounds.size.width);
    int itemsPerRow = (aspectRatio > 1)? floorf(pow(PLAYERS,.5)) : ceilf(pow(PLAYERS,.5));
    if (aspectRatio >1) {
        itemsPerRow = itemsPerRow - (floorf(aspectRatio) - 1);
    }else{
        itemsPerRow = itemsPerRow - (floorf(1/aspectRatio) - 1);
    }
        int numberOfRows = ceilf(PLAYERS/itemsPerRow);
        CGFloat width = (self.collectionView.bounds.size.width - ((itemsPerRow - 1) *10)) / itemsPerRow;
        CGFloat height = (self.collectionView.bounds.size.height - ((numberOfRows - 1) *10)) / numberOfRows;
        CGFloat dim = MIN(width, height);
        [(UICollectionViewFlowLayout *)self.collectionView.collectionViewLayout setItemSize:CGSizeMake(dim,dim)];
        [self.collectionView reloadData];
}


-(NSInteger)collectionView:(UICollectionView *)collectionView numberOfItemsInSection:(NSInteger)section {
    return PLAYERS;
}

-(UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath {
    static NSString *cellIdentifier = @"Cell";
    UICollectionViewCell *cell = [collectionView dequeueReusableCellWithReuseIdentifier:cellIdentifier forIndexPath:indexPath];
    return cell;
}

答案 2 :(得分:0)

这是Swift中的一个新解决方案。它使用二进制搜索来获得更好的性能。

假设:

  • 您的收藏视图只有一个部分
  • 您的屏幕小于9999像素
  • 您的单元格是正方形(否则使用@style/MyTheme作为最长尺寸并编辑currentTestrows,这是较小的尺寸尺寸)
cols