Ios DrawRect完成和UI刷新之间的时间间隔
我有一个使用开源类MMGridView的iPad应用程序。 基本上我执行一个CoreData查询,然后这个类在屏幕上以网格模式绘制框来表示结果。盒子里有照片。 一切正常,只是有时候在屏幕上绘制UI之前会出现无法解释的时间延迟。有时刷新是即时的,有时超过20秒。它的行为似乎很随机 我已设法确定:Ios DrawRect完成和UI刷新之间的时间间隔,ios,drawrect,lag,Ios,Drawrect,Lag,我有一个使用开源类MMGridView的iPad应用程序。 基本上我执行一个CoreData查询,然后这个类在屏幕上以网格模式绘制框来表示结果。盒子里有照片。 一切正常,只是有时候在屏幕上绘制UI之前会出现无法解释的时间延迟。有时刷新是即时的,有时超过20秒。它的行为似乎很随机 我已设法确定: 每次都会调用DrawRect DrawRect方法中没有出现延迟 当我运行时间分析器时,据我所知,在这个时间延迟期间没有发生任何事情 我的问题是,调用DrawRect后会发生什么,我可以尝试查看以确定
- 每次都会调用DrawRect李>
- 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];
}
}
}
-(void)drawRect:(CGRect)rect{
if(self.dataSource&&self.numberOfRows>0&&self.numberOfColumns>0){
NSInteger noOfCols=self.numberOfColumns;
NSInteger noOfRows=self.numberOfRows;
NSUTEGER cellsPerPage=noOfCols*noOfRows;
NSLog(@“行=%d,列=%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(self.scrollView.subview中的UIView*v){
[v从SuperView移除];
}
对于(NSInteger i=0;i<[self.dataSource numberOfCellsInGridView:self];i++){
MMGridViewCell*cell=[self.dataSource gridView:self-cellAtIndex:i];
[单元格性能选择器:@selector(setGridView:)with object:self];
[cell performSelector:@selector(setIndex:)with object:[NSNumber numberWithInt:i]];
NSInteger页面=(int)floor((float)i/(float)cellsPerPage);
NSInteger row=(int)地板((浮动)i/(浮动)noOfCols)-(第*页noOfRows);
CGPoint origin=CGPointMake((page*gridBounds.size.width)+(i%noOfCols)*cellbunds.size.width),
(行*单元格边界、大小、高度);
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];
}
}
}
由于Peter Hosey在回答此问题时对何时使用和何时不使用drawRect:进行了非常清晰和简洁的描述,所以问题得到了解决。
基本上,这是我正在使用的开源类MMGridView中的一个bug,因为它不应该使用drawRect:在UIScrollView上设置框或单元格。这是因为没有实际绘图
因此,通过更改上述方法的名称,并在我之前调用setNeedsDisplay的地方直接调用它,就不再存在任何随机延迟。由于Peter Hosey在回答此问题时对何时使用和何时不使用drawRect:进行了非常清晰和简洁的描述,问题得到了解决。 基本上,这是我正在使用的开源类MMGridView中的一个bug,因为它不应该使用drawRect:在UIScrollView上设置框或单元格。这是因为没有实际绘图
因此,通过更改上述方法的名称,并在我以前调用setNeedsDisplay的地方直接调用它,就不再存在任何随机延迟。我不明白您的答案。你能再解释一下吗(包括一些代码)?我对MMGridView有问题。基本上,我正在设置x行和y列,有时它会显示y行和x列的奇怪位置。。。我试过很多组合,但我不知道是什么引起的。即使demo也不能正常工作(我正在iOS6上测试它),我的问题是它选择绘制网格的方式依赖于MMGridView.m中的方法(((void)drawRect:(CGRect)rect),但该方法仅在视图需要重新绘制自身时才被调用。您可以通过调用“[self.view setNeedsDisplay]”来完成此操作。然而,在这种方法中没有实际绘图。该方法实际上创建并放置视图以形成网格。因此setNeedsDisplay不会触发调用此方法。我只是简单地将它重命名为(-(void)drawCells)并直接使用“[myMMGridView drawCells]”调用它。你们在ios5中滚动页面时,是否有闪动gridview的问题?在ios6中没关系,我不明白你的意思。你能再解释一下吗(包括一些代码)?我对MMGridView有问题。基本上,我正在设置x行和y列,有时它会显示y行和x列的奇怪位置。。。我试过很多组合,但我不知道是什么引起的。即使demo也不能正常工作(我正在iOS6上测试它),我的问题是它选择绘制网格的方式依赖于MMGridView.m中的方法(((void)drawRect:(CGRect)rect),但该方法仅在视图需要重新绘制自身时才被调用。您可以通过调用“[self.view setNeedsDisplay]”来完成此操作。但是,没有实际的图纸