59

何が起こっていますか

現在、UICollectionViews内で2 つを使用するアプリケーションがありますUITableView。このようにして、Pulse News のようなアプリケーションを作成します。これに関する私の問題は、6行目と11行目が完全に消えて、セルであるべき場所に空白が残ることがあることです。すべてのセルがこのようなものであったとしても (そして、このようにして、私が正しく行っていないと仮定することができます)、実際には気にしませんが、問題は、それらの特定のセルで起こっていることです。

私の理論

6 行目と 11 行目はスクロールを開始したときに表示される行なので、デフォルトでは 5 つのセルが表示され、最初の水平スクロールを行うと 6 行目が表示されます (空白のスペースがある場合があります)。

私が持っているもの

私が現時点で行っている唯一のことはこれです:

 [self.collectionView registerNib:[UINib nibWithNibName:CELL_NIB_NAME bundle:nil] forCellWithReuseIdentifier:CELL_IDENTIFIER];

viewDidLoad。そして、セルの作成について:

- (UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath
{
    MyCell *cell = [collectionView dequeueReusableCellWithReuseIdentifier:CELL_IDENTIFIER forIndexPath:indexPath];

    NSMutableDictionary *dictionary = [self.DataSource objectAtIndex:[indexPath row]];

    [cell buildViewWithDictionary:dictionary withReferenceParent:self.referenceViewController];

    return cell;
}

ですから、ここで起こっていることは何もありません。データ ソース (ダミーの JSON ファイル) に何か問題があったと思いますが、正常に動作し、セルが表示される場合があるため、その部分からは問題ないと思います。

だから私の「質問」:何が起こっているのか知っている人はいますか?iOS のバグだとは言いたくないのですが、他に思いつきません。


編集 1.0

驚くべき部分は、この方法です

-(UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath;

[0,5]を計算せずに[0,4]からindexPath[0,6]になります。iOSでこれが実際に起こっているのを初めて見ました。


編集 2.0

セルを作成する方法を切り替えました。デキューする代わりに、古い方法を使用しています。

NSArray *nib = [[NSBundle mainBundle] loadNibNamed:CELL_NIB_NAME owner:self options:nil];
MyCell *cell = (MyCell *)[nib objectAtIndex:0];

相変わらず悲しい結果です。

4

12 に答える 12

38

それで、何がうまくいきましたか?

1) サブクラスUICollectionViewFlowLayout

2) my の flowLayout をUICollectionView新しいサブクラスに設定します。

3)UICollectionViewFlowLayoutサブクラスの init メソッドで、必要な向きを設定します。

self.scrollDirection = UICollectionViewScrollDirectionHorizontal;

私の場合、それは水平です。

4)重要な部分:

-(BOOL)shouldInvalidateLayoutForBoundsChange:(CGRect)newBounds
{
   return YES;
}

現時点では、少し理論化する必要がありますが、正直なところ、手がかりがありません。

于 2012-11-13T21:02:32.917 に答える
18

上記の答えは私にはうまくいきませんでしたが、画像をダウンロードした後、コレクションビューを更新するためにコードを置き換え、 [self.myCollectionView reloadData] すべて [self.myCollectionView reloadSections:[NSIndexSet indexSetWithIndex:0]]; のセルを表示しました。試してみてください。

于 2015-06-26T18:21:27.533 に答える
8

誰からも提供された解決策は、アプリに必要なカスタム レイアウトで役に立ちませんでした。代わりに、私はこれをしなければなりませんでした:(そして、ええ、それはうまくいきます!!!

- (NSArray *)layoutAttributesForElementsInRect:(CGRect)rect{
    CGSize size = [self collectionViewContentSize];
    rect.size.height = size.height*2;
    NSArray *atrributes_Super = [super layoutAttributesForElementsInRect:rect];
    return atrributes_Super;
}

結局のところ、UICollectionView は、画面の四角形に表示される要素の属性を探しているだけです。

于 2015-11-20T10:53:12.250 に答える
3

バグに関するRobのヒントが役に立ちました。バグは、セクションのインセットとセルの幅と間隔が画面の幅に正確に加算される場合、最初の列がランダムに消えて、いくつかの場所のいくつかのセルで再表示されることがあると述べています。セル幅をサブクラス化または変更するのではなく、ストーリーボードの左右のセクション インセットを 6 から 4 に変更しましたが、問題は再び発生していません。

于 2013-01-16T03:38:21.040 に答える
1

私の場合(垂直スクロール、最初のビューでセルが消える)、推定サイズが正しくないためにセルが消えていました。UICollectionView推定サイズを使用して、最初のビューでロードするアイテムを計算しているようです。推定サイズを高く設定しすぎたため、最初の画面にロードするアイテム数の計算が間違っていました。

推定高さを少し低くした瞬間、すべてのセルが正しく表示されました。

于 2016-09-19T04:02:33.623 に答える
1

最近、セルの消失に遭遇し、「非表示の」セルをスキップするのではなく、誤って 0x0 サイズのセルを挿入していることに気付きました。結果として生じる動作は非常に紛らわしく、これらの目に見えないセルが問題であることを示唆していませんでした。正しいサイズのセルとレイアウトが表示されますが、画面をオフ/オンにスクロールすると、有効なセルのいくつかが常に消えてしまいます。0 サイズのセルを混在させるとこの動作が発生する理由はわかりませんが、それらを削除すると問題が解決しました。これは問題の原因ではないかもしれませんが、同様の症状を探している開発者にとっては役立つかもしれません。

于 2018-01-08T04:47:09.610 に答える
0

スクロール時にすべての UICollectionView セルが消えるという問題が発生しました。

宣言したからこうなった

extension UICollectionViewLayout {
    static let defaultLayout: UICollectionViewLayout {
        let layout = UICollectionViewFlowLayout()
        layout.estimatedItemSize = UICollectionViewFlowLayout.automaticSize
        return layout
    }()
}

...同じレイアウトインスタンスが複数のUICollectionViewsで使用されていたことを意味します。私はそれを計算された変数にするつもりでした。これが、誤って複数のコレクション ビューで同じレイアウト オブジェクトを使用している人に役立つことを願っています。

于 2019-11-28T00:05:20.940 に答える