UICollectionViewを使用するのは2回目であり、おそらく噛むことができる以上に噛み付いています。
サブクラス化したカスタムUICollectionViewCellを使用するUICollectionView(myCollectionView)を実装しています。サブクラス化されたセル(FullReceiptCell)はUITableViewを含み、ViewControllerのサイズです。 FullReceiptCells間の水平スクロールを許可しようとしています。
MyCollectionViewを含むサブクラス化されたUICollectionViewControllerは、navコントローラースタックにプッシュされています。現在、myCollectionView loasと水平スクロールが有効になっています。ただし、セルは表示されません。私はそれを確認しました
- (NSInteger)collectionView:(UICollectionView *)collectionView numberOfItemsInSection:(NSInteger)section
また、myCollectionViewのデリゲートとデータソースがIBでサブクラス化されたUICollectionViewControllerに適切に設定されていることも確認しました。
セルをロードする方法:
- (UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath
呼び出されていません。
ここで、そのコントローラー内でUICollectionViewControllerとviewDidLoadメソッドをプッシュします(注:initWithBillは通常のイニシャライザーのオーバーライドです)。
前のViewControllers .mファイルで:
FullReceiptViewController *test = [[FullReceiptViewController alloc] initWithBill:currentBill];
test.title = @"Review";
[self.navigationController pushViewController:test animated:YES];
FullReceiptViewController.m内:
- (void)viewDidLoad
{
[super viewDidLoad];
// Do any additional setup after loading the view from its nib.
[self.myCollectionView registerClass:[FullReceiptCell class] forCellWithReuseIdentifier:@"FullReceiptCellIdentifier"];
self.myCollectionView.pagingEnabled = YES;
// Setup flowlayout
self.myCollectionViewFlowLayout = [[UICollectionViewFlowLayout alloc] init];
[self.myCollectionViewFlowLayout setItemSize:CGSizeMake(320, 548)];
[self.myCollectionViewFlowLayout setSectionInset:UIEdgeInsetsMake(0, 0, 0, 0)];
[self.myCollectionViewFlowLayout setScrollDirection:UICollectionViewScrollDirectionHorizontal];
self.myCollectionViewFlowLayout.minimumLineSpacing = 0;
self.myCollectionViewFlowLayout.minimumInteritemSpacing = 0;
[self.myCollectionView setCollectionViewLayout:myCollectionViewFlowLayout];
//testing to see if the collection view is loading
self.myCollectionView.backgroundColor = [UIColor colorWithWhite:0.25f alpha:1.0f];
なぜ呼び出されないのかについての手がかりはありますか?
後でここでつまずく人のために....理由:
- (UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath
collectionViewFlowLayoutのitemSizeが高すぎるために呼び出されていませんでした。
[self.myCollectionViewFlowLayout setItemSize:CGSizeMake(320, 548)];
高さを410に変更すると、cellForItemAtIndexPathが実行されます。
私の場合、レイアウトクラスが UICollectionViewLayout
ではなく UICollectionViewFlowLayout
から誤ってサブクラス化されたためでした
コンテンツサイズ情報をコレクションビューに提供しない場合、cellForItemAtIndexPathは呼び出されません。
後者の場合、layoutAttributesForElementsRectも呼び出されないこともわかります。その理由は、コンテンツのサイズを指定していないため、デフォルトではサイズがCGSizeZeroになります。これは基本的に、ペイントするコンテンツがないことをコレクションビューに伝えるので、属性やセルを要求することはありません。
したがって、collectionViewContentSizeをオーバーライドして、適切なサイズを指定するだけで、問題が解決するはずです。
たぶん見落としているだけかもしれませんが、デリゲートとデータソースが見つからないようです。ヘッダーファイルで、これらが追加されていることを確認します。
<UICollectionViewDelegate, UICollectionViewDataSource>
そして、あなたのviewDidLoadメソッドでこれを追加します:
self.myCollectionView.delegate = self;
self.myCollectionView.dataSource = self;
また、.xibを介してロードする場合は、IBOutletがUICollectionViewに接続されていることを確認してください。
より複雑なビュー階層については、これを確認してください blog 。それは私の命を救った!
self.automaticallyAdjustsScrollViewInsets = NO;
クラスがUICollectionviewControllerのサブクラスであり、collectionViewをプログラムで作成している場合は、
let layout = UICollectionViewFlowLayout()
layout.scrollDirection = .Vertical
layout.itemSize = CGSizeMake(50, 50)
collectionView?.setCollectionViewLayout(layout, animated: false)
私は自動レイアウトを使用していましたが、私の場合は高さの制約がありませんでした
私の場合、私が非常に愚かに忘れていたのは、UICollectionViewDataSource
プロトコルメソッドnumberOfItemsInSection
を実装することでした。
私の問題は、同じビュー内に2つのコレクションビューがあり、両方が計算されたUICollectionViewFlowLayout
インスタンスを共有していたことです。同じフローレイアウトの個別のインスタンスを作成すると、正常に機能しました。
Xcode 7.0.1では、ストーリーボードと付随するコードを別のプロジェクトからコピーしたときにこの問題が発生しました。コレクションビューには、ストーリーボードにカスタムフローレイアウトが設定されていました。解決策は次のとおりです。
今ではうまくいきました:)
私の場合、UINavigationBarの半透明をNOに変更すると問題は解決しました。
CellForItemメソッドが呼び出されることを修正することにより、アイテムの高さ== 0のときにそれが起こっていました。
10分前にこの問題に遭遇しましたが、愚かな間違いを犯しました。
私の意図は、UICollectionViewFlowLayoutを使用することです。
しかし、ミスのため、UICollectionViewLayoutを使用しました。
numberOfSectionsInCollectionView
も正の整数を返すようにしてください。
コレクションには少なくとも1つのセクションが必要です。
コレクションビューで自動サイズ変更マスクをfalseに設定するのを忘れていました。
collectionView.translatesAutoresizingMaskIntoConstraints = false
関連するレイアウトの問題である可能性があります。存在する場合は、コンソールからレイアウトの警告を確認してください。
私の場合、間違った自動レイアウト制約のために、親ビューでコレクションビューが完全に表示されませんでした。そのため、制約を修正するとコレクションビューがすべて表示され、cellForItemAtIndexPathが呼び出されました。
-(NSInteger)collectionView:numberOfItemsInSection:が正の値(読み取り、ゼロより大きい)を返していることを確認してください。 [self.collectionView reloadData]を配置することが問題になる場合があります。完了ハンドラー。
Storyboard/xib UICollectionViewプロパティのcellSizeは{0、0}であってはなりません
私にも同じことが起こりました。 2つのUICollectionViewがありましたが、必要ないので一度削除しました。その後、CellForItemAtIndexPathが呼び出されるのではなく、他の必要なメソッドが呼び出されることに気付きました。上記のすべてを試しましたが、標準の魔法をかけました。ストーリーボードからコレクションビューを削除し、再度追加しました。その後、動作し始めました。理由はわかりませんが、説明はありませんが、おそらく接続の問題があります。
私の場合、collectionView.prefetchingEnabled = NO;
を設定して問題を解決しました。 iOS 10でのみ動作します。
また、アニメーションでコレクションビューを更新している間(挿入、削除、更新、またはperformBatchUpdates)にreloadDataが呼び出されないようにしてください。
UICollectionViewDelegateFlowLayout
を使用する場合、この関数が返すものに注意してください。 width
とheight
の両方は、0
より大きくなければなりません。 window
をフレーム参照として使用しましたが、ビュー階層ウィンドウが複雑だったため、実行時にnil
でした。画面の幅に基づいて要素の幅を調整する必要がある場合は、UIScreen.main.bounds
を使用します。
func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout:
UICollectionViewLayout, sizeForItemAt indexPath: IndexPath) -> CGSize {}
私にとっては、autolayoutを介してself.view(collectionViewのスーパービュー)の高さを更新し、その後layoutIfNeeded
を呼び出す必要があります。
[self.view mas_updateConstraints:^(MASConstraintMaker *make) {
make.height.equalTo(@(height));
}];
[self.view layoutIfNeeded];
やや特定の状況で、この問題を解決しました。
私の場合、親ViewControllerでUICollectionViewControllerを手動で初期化し、UICollectionViewControllerのビューをサブビューとして追加していました。
親のviewDidAppearのcollectionViewで 'setNeedsLayout'および/または 'setNeedsDisplay'を呼び出すことで問題を解決しました。
- (void)viewDidAppear:(BOOL)animated {
[super viewDidAppear:animated];
[_collection.view setNeedsLayout];
[_collection.view setNeedsDisplay];
}