gpt4 book ai didi

ios - DrawRect 完成和 UI 刷新之间的时间延迟

转载 作者:行者123 更新时间:2023-11-29 13:32:22 24 4
gpt4 key购买 nike

我有一个使用开源类 MMGridView 的 iPad 应用程序。基本上我执行一个 CoreData 查询,然后这个类以网格模式在屏幕上绘制框来表示结果。盒子里有照片。一切正常,除了有时在屏幕上绘制 UI 之前存在无法解释的时间延迟。有时刷新是即时的,有时超过 20 秒。它的行为看起来非常随机。

我已经设法确定:

  • DrawRect 每次都被调用。
  • DrawRect 方法中没有出现延迟。
  • 当我运行时间分析器时,据我所知,在这段时间延迟期间没有发生任何事情

我的问题是,在调用 DrawRect 之后会发生什么,我可以尝试查看以找出问题所在?

如果有任何想法,我们将不胜感激。

另请注意,用户交互能够缩短延迟。- 旋转 iPad(触发重绘)总是使用户界面立即刷新- 按下按钮重做相同的查询通常会刷新屏幕

所以看起来我遇到的只是一些随机延迟,而不是任何类型的处理器/工作负载问题。问题是以编程方式,我无法判断 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];
}
}
}

最佳答案

由于对何时使用和何时不使用 drawRect 的非常清晰和简洁的描述,问题解决了:Peter Hosey 在对这个问题的回应中。 What is the proper way to make it so core graphics does not lag?

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

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

关于ios - DrawRect 完成和 UI 刷新之间的时间延迟,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11539598/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com