14

ストーリーボード (iPad) で を含むビューを定義しました。UICollectionViewビューの下部には もありUIToolbarます。に、Core-Plot Graph (クラス) である別のビューを含む(クラスによって実装された)UICollectionViewを追加しました。UICollectionViewCelliPadCellCollectionViewCellCPTGraphHostingView

と を実装する X というクラスがUICollectionViewDelegateありUICollectionViewDataSourceます。

クラス X では、( のViewDidLoad) ビューの各セルに対して Core-Plot Graph を作成し、次のコードを使用して、グラフを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 にを追加する代わりに、回避策を見つけました。CPTGraphHostingView自分UICollectionViewCellでビルドすると、前のコードは次のようになります。

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

}

このコードでは、すべてが正常に機能しています。IBに を追加CPTGraphHostingViewしているときに機能しない理由について説明はありますか?UICollectionViewCell

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

4

2 に答える 2

9

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

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

編集:セルビューが再利用されるときにセルビューを更新する簡単な方法は、次のようにオーバーライドapplyLayoutAttributes:することです。iPadCellCollectionViewCell

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

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

于 2012-11-23T19:25:12.917 に答える
3

これは、sectionInsets を使用する場合の UICollectionView のバグのようです。セルが非表示になることはありません。高速スクロールすると、境界から外れて配置されることがあります。

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

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

これまでの私の解決策は、sectionInsets を使用せず、contentInset とセクション ヘッダーの空白スペースを使用して囲むことでした。

Twitterで同じ問題を抱えている他の人も見つけました。それに関するバグレポートもあります: 12353513

于 2012-11-28T11:29:50.843 に答える