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 进行了非常清晰和简洁的描述,因此问题解决了:Peter Hosey 在回答这个问题时。 使核心图形不滞后的正确方法是什么?

基本上,这是我正在使用的开源类 MMGridView 中的一个错误,因为它不应该使用 drawRect: 来设置 UIScrollView 上的框或单元格。这是因为没有进行实际的绘图。

因此,通过更改上述方法的名称并在我之前调用 setNeedsDisplay 的地方直接调用它,不再有任何随机延迟。

于 2012-07-20T10:36:10.323 回答