1

オープン ソース クラス MMGridView を使用する iPad アプリがあります。基本的に CoreData クエリを実行すると、このクラスが画面上にグリッド パターンでボックスを描画して結果を表します。箱には写真が含まれています。UI が画面に描画されるまでに原因不明のタイムラグが発生する場合があることを除いて、すべて正常に動作します。瞬時に更新されることもあれば、20 秒以上かかることもあります。その動作は非常にランダムに見えます。

私はそれを決定することができました:

  • DrawRect は毎回呼び出されています。
  • DrawRect メソッドでラグが発生していないこと。
  • タイムプロファイラーを実行すると、私が知る限り、このタイムラグの間に何も起こっていません

私の質問は、問題を特定するために見てみることができる DrawRect が呼び出された後に何が起こるかということです。

絶対にどんなアイデアでも大歓迎です。

また、ユーザーの操作によってラグを短縮できることにも注意してください。- iPad を回転させる (再描画をトリガーする) と、常に UI がすぐに更新されます - ボタンを押して同じクエリをやり直すと、通常は画面が更新されます

したがって、プロセッサ/ワークロードの問題とは対照的に、ランダムな遅延が発生しているように見えます。問題は、UI が更新されたかどうかをプログラムで判断できないことです。それ以外の場合は、もう一度再描画するように依頼できます。

アイデアがひらめいた場合に備えて、DrawRect メソッドのコードを含めていますが、私が知る限り、このメソッドは遅延が発生する前に完了します。

- (void)drawRect:(CGRect)rect {

if (self.dataSource && self.numberOfRows > 0 && self.numberOfColumns > 0) {
    NSInteger noOfCols = self.numberOfColumns;
    NSInteger noOfRows = self.numberOfRows;
    NSUInteger cellsPerPage = noOfCols * noOfRows;
    NSLog(@"rows = %d, cols = %d", noOfCols, noOfRows);
    CGRect gridBounds = self.scrollView.bounds;
    CGRect cellBounds = CGRectMake(0, 0, gridBounds.size.width / (float)noOfCols, 
                                   gridBounds.size.height / (float)noOfRows);

    CGSize contentSize = CGSizeMake(self.numberOfPages * gridBounds.size.width, gridBounds.size.height);
    [self.scrollView setContentSize:contentSize];

    for (UIView *v in self.scrollView.subviews) {
        [v removeFromSuperview];
    }

    for (NSInteger i = 0; i < [self.dataSource numberOfCellsInGridView:self]; i++) {
        MMGridViewCell *cell = [self.dataSource gridView:self cellAtIndex:i];
        [cell performSelector:@selector(setGridView:) withObject:self];
        [cell performSelector:@selector(setIndex:) withObject:[NSNumber numberWithInt:i]];

        NSInteger page = (int)floor((float)i / (float)cellsPerPage);
        NSInteger row  = (int)floor((float)i / (float)noOfCols) - (page * noOfRows);

        CGPoint origin = CGPointMake((page * gridBounds.size.width) + ((i % noOfCols) * cellBounds.size.width), 
                                     (row * cellBounds.size.height));

        CGRect f = CGRectMake(origin.x, origin.y, cellBounds.size.width, cellBounds.size.height);
        cell.frame = CGRectInset(f, self.cellMargin, self.cellMargin);

        [self.scrollView addSubview:cell];
    }
}
}
4

1 に答える 1

1

使用する場合と使用しない場合の drawRect の非常に明確で簡潔な説明により、問題は解決しました。 コアグラフィックが遅れないようにする適切な方法は何ですか?

基本的に、これは私が使用しているオープン ソース クラス MMGridView のバグです。UIScrollView でボックスまたはセルをセットアップするために drawRect: を使用してはならないからです。これは、実際に描画が行われていないためです。

したがって、上記のメソッドの名前を変更し、以前に setNeedsDisplay を呼び出した場所で直接呼び出すことで、ランダムな遅延がなくなりました。

于 2012-07-20T10:36:10.323 に答える