仅显示两列,使用故事板在CollectionView中显示多行
我想连续显示两个单元格,无论iPhone的屏幕大小是多少。 喜欢,
我的故事板包含一个由约束连接的UICollectionView
。
UICollectionView
的故事板设置是,
现在,当我在6,5s或更低版本中运行时,只有一个单元格出现在一行中。 我用的代码是,
- (NSInteger)collectionView:(UICollectionView *)collectionView numberOfItemsInSection:(NSInteger)section{ return [categoryImages count]; } - (UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath{ homePageCells *cell = (homePageCells *)[collectionView dequeueReusableCellWithReuseIdentifier:@"cells" forIndexPath:indexPath]; cell.categoryName.text = [categoryNames objectAtIndex:indexPath.row]; return cell; }
我尝试使用代码检测屏幕大小并以编程方式分配适当的单元格大小,
- (CGSize)collectionView:(UICollectionView *)collectionView layout:(UICollectionViewLayout *)collectionViewLayout sizeForItemAtIndexPath:(NSIndexPath *)indexPath { CGSize sizes; CGSize result = [[UIScreen mainScreen] bounds].size; NSLog(@"%f",result.height); if(result.height == 480) { //Load 3.5 inch xib sizes =CGSizeMake(170.f, 170.f); NSLog(@"3gs"); } else if(result.height == 568) { //Load 4 inch xib sizes =CGSizeMake(130.f, 130.f); NSLog(@"5s"); } else if(result.height == 667.000000) { //Load 4.7 inch xib sizes =CGSizeMake(160.f, 160.f); NSLog(@"6"); } else { NSLog(@"else"); sizes =CGSizeMake(170.f, 165.f); } return sizes; }
但我也知道这不是正确的方法,所以请给我一个正确的方法来解决这个问题。
你可以这样做,你不需要检查设备大小,因为我们可以使用tableView
宽度来计算单元格的宽度,并根据我们可以增加我们的高度。
还有一件事你需要使用CollectionViewFlowLayout
并确认下面的委托和实现方法
func collectionView(collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAtIndexPath indexPath: NSIndexPath) -> CGSize { let padding: CGFloat = 50 let collectionViewSize = collectionView.frame.size.width - padding return CGSizeMake(collectionViewSize/2, collectionViewSize/2) }
更新:Swift 4.0
func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAt indexPath: IndexPath) -> CGSize { let padding: CGFloat = 50 let collectionViewSize = collectionView.frame.size.width - padding return CGSize(width: collectionViewSize/2, height: collectionViewSize/2) }
注意 :我已经回答了问题,因为细胞是方形的
Xcode 8:Swift 3
我知道这是一个较老的问题,但我发现了一些接受答案的问题。
我不得不使用不是CollectionViewFlowLayout的 UICollectionViewDelegateFlowLayout
然后
其中’Padding’是Int类型,当你尝试从变量collectionViewSize中减去它时,它会抛出一个错误,因为它们是不同的类型。 但是很容易修复。
我刚补充说:CGFloat就行了
最后,尽管可能有更好的方法,但我必须通过调整collectionView前导和尾随约束来匹配填充。
总而言之,这就是我的代码最终看起来像
extension LandingPageViewController: UICollectionViewDelegateFlowLayout { func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAt indexPath: IndexPath) -> CGSize { let padding: CGFloat = 25 let collectionCellSize = collectionView.frame.size.width - padding return CGSize(width: collectionCellSize/2, height: collectionCellSize/2) } }
- (CGSize)collectionView:(UICollectionView *)collectionView layout:(UICollectionViewLayout *)collectionViewLayout sizeForItemAtIndexPath:(NSIndexPath *)indexPath { CGFloat padding = 50; CGFloat cellSize = collectionView.frame.size.width - padding; return CGSizeMake(cellSize / 2, cellSize / 2); }
我遇到了传递给sizeForItemAtIndexPath
的collectionView的边界在那个时刻不正确的问题。
一个解决方法是在viewWillAppear
重新加载单元格以确保collectionView的边界正确。
另一种是使用UIScreen
类。
-(instancetype)init: { self = [super init]; if (self) { width = [[UIScreen mainScreen] bounds].size.width; } return self; } -(CGSize)collectionView:(UICollectionView *)collectionView layout:(UICollectionViewLayout *)collectionViewLayout sizeForItemAtIndexPath:(NSIndexPath *)indexPath { // Two columns with spacing in between CGFloat size = ((width / 2) - (kSpacing * 2)); return CGSizeMake(size, size); }
在这种情况下,我将委托实例化为一个单独的类(因此是init),但它可以像扩展一样容易地完成。
- iPhone付费应用程序中的Google Maps API
- 当从UIBarButtonItem呈现方向更改后,如何防止UIPopoverController passthroughViews被重置?
- Swift + didUpdateUserLocation没有被调用
- 使用AFJSONRequestOperation和filedata的AFNetworking永远不会完成
- 覆盖function
- Swift如果让评估成功可选(无)
- iPhone获取UIImagePickerController Lat / Lng
- 有没有人有他们的iOS应用程序被拒绝的苹果使用设备的UDID?
- 为什么iOS上的Codename One将audio录制为CAF?