web-dev-qa-db-ja.com

ストーリーボードを使用して、CollectionViewに複数の行を持つ2つの列のみを表示します

IPhoneの画面サイズに関係なく、2つのセルのみを連続して表示したい。のように、 End result required

ストーリーボードには、制約によって接続されたUICollectionViewが含まれています。

Storyboard preview

UICollectionViewのストーリーボード設定は、 enter image description here

これで、6、5秒以下でこれを実行すると、1つのセルのみが行に表示されます。私が使用したコードは、

- (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;
}

しかし、これが正しい方法ではないことも知っているので、これを処理する正しい方法を教えてください。

21
rajesh s

collectionView widthを使用してセルの幅を計算できるため、デバイスのサイズを確認する必要はありません。セルの幅を使用して、必要に応じて高さを計算できます。

もう1つ:UICollectionViewDelegateFlowLayoutを使用して、デリゲートを確認し、以下のメソッドを実装する必要があります

  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.

  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)
    }

:セルのサイズが正方形であることを考慮して質問に回答しました

55
Rohit Pradhan

Xcode 8:=​​Swift

これは古い質問であることは知っていますが、受け入れられた回答でいくつかの問題を見つけました。

ICollectionViewDelegateFlowLayoutを使用しなければなりませんでしたCollectionViewFlowLayout

それから

その中で、「パディング」は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)

   }

}
9
RubberDucky4444
- (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);
}
1
sanjeet

sizeForItemAtIndexPathに渡されるcollectionViewの境界がその時点で正しくないという問題がありました。

これに対する1つの修正は、collectionViewの境界が正しいことを確認するためにviewWillAppearのセルをリロードすることです。

別の方法は、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)が、拡張と同じくらい簡単に実行できます。

0
Alex Scanlan