我的细胞是正方形,看起来很好。我希望找到最大的单元格大小,以便显示所有单元格不需要滚动。
例如,这个屏幕截图对于3个玩家来说非常棒,但是将它踢到12个玩家会让它们滚出界限,这是应该避免的。
有没有办法实现这个目标?
答案 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中的一个新解决方案。它使用二进制搜索来获得更好的性能。
假设:
@style/MyTheme
作为最长尺寸并编辑currentTest
或rows
,这是较小的尺寸尺寸)cols