2012-11-19 14 views
14

私のストーリーボード(iPad)にはUICollectionViewを含むビューが定義されています。ビューの最下部にはUIToolbarもあります。 UICollectionViewには、(iPadCellCollectionViewCellクラスで実装されています)に、コアプロットグラフ(CPTGraphHostingViewクラス)の別のビューが含まれています。スクロール後にUICollectionViewのセルが常にリフレッシュされない

私はUICollectionViewDelegateUICollectionViewDataSourceを実装するXというクラスを持っています。クラスXで

、私は私のビュー(ViewDidLoadで)コアプロットグラフの各セルのために構築し、私はUICollectionViewCell

- (UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath { 
static NSString* cellId = @"ChartCollectionId"; 

iPadCellCollectionViewCell* cell = [self.theCollectionView dequeueReusableCellWithReuseIdentifier:cellId forIndexPath:indexPath]; 

MyChart* chart = [_charts objectAtIndex:indexPath.row]; 

cell.hostingView.hostedGraph = chart.barChart; 

return cell; 

}のセルにグラフをリンクするために、次のコードを持っています

正常に動作しているため、すべてのグラフが画面に正しく表示されています。この問題は、ユーザーがビューをスクロールしたときに1つまたは複数のセルが「空白」になるときに発生します。なぜ私は本当に理解していない。

私が代わりにInterface Builderで UICollectionViewCellCPTGraphHostingViewを追加するので、私はそれを自分自身を構築し、前のコードとなり、回避策を発見した

- (UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath { 
static NSString* cellId = @"ChartCollectionId"; 

iPadCellCollectionViewCell* cell = [self.theCollectionView dequeueReusableCellWithReuseIdentifier:cellId forIndexPath:indexPath]; 


[cell.contentView addSubview:[_hostingViews objectAtIndex:indexPath.row]]; 

return cell; 

}

をこのコードのすべてでありますうまく動作します。 UICollectionViewCellCPTGraphHostingViewをIBに追加するときに、なぜ機能しないのか説明がありますか?

メソッドが呼び出されるたびに「addSubview」を呼び出すのは問題ですか?メモリリークはありませんか?

答えて

3

これは、sectionInsetsを使用するとUICollectionViewのバグのようです。 セルは見えなくなりません。速いスクロールでは、セルが範囲外に正しく配置されません。

通常、1行に3つのアイテムがある場合は、1つの行に4番目のアイテムが表示されますが、次の行の最初のアイテムにはアイテムはありません。

UICollectionViewを境界にクリップしないように設定し、それをUIの上に移動すると、 が表示されることがあります。

私の解決策はsectionInsetsを使用しないようにしていましたが、contentInsetとセクションヘッダーの空きスペースを使用して解決しました。

私は同じ問題を抱えたTwitterで他の人も見つけました。 バグ報告もあります:12353513

+0

どこで私はそのバグレポートを見ますか? – bandejapaisa

9

私も同様の問題がありました。 setFrame:が私のカスタムコンテンツに呼び出されたときに再描画を強制することで修正しました。あなたの場合は、サブクラスCPTGraphHostingViewと、このメソッドをオーバーライド:

-(void)setFrame:(CGRect)frame { 
    [super setFrame:frame]; 
    [self setNeedsDisplay]; // force drawRect: 
} 

編集:それらが再利用されている場合、セルのビューを更新する簡単な方法は、次のようにiPadCellCollectionViewCellapplyLayoutAttributes:を上書きすることです:

-(void)applyLayoutAttributes:(UICollectionViewLayoutAttributes *)layoutAttributes { 
    // apply custom attributes... 
    [self.hostingView setNeedsDisplay]; // force drawRect: 
} 

についてあなたの回避策:コンテンツビューにはさらに多くのサブビューがありますが、これはおそらく良いことではありません。ただし、新しいサブビューを追加する前に古いサブビューを削除する場合は、それも問題ありません。

+2

横方向にスクロールするときに間違った位置にセルをレンダリングするのと同じ問題がありますが、残念なことに、この2つのフィックスのどちらも私には効果がありませんでした。 –

+0

偉大な、両方のアプローチを試して、両方とも働いた。 – anka

+0

ありがとう第2のオプションは私のために働いた – slik

関連する問題