2012-07-18 91 views
1

我有一個使用開源類MMGridView的iPad應用程序。 基本上我執行一個CoreData查詢,然後這個類在屏幕上以網格模式繪製框來表示結果。這些箱子包括照片。 一切工作正常,除了有時有一個不明原因的時間滯後,直到UI在屏幕上繪製。有時刷新是瞬間的,有時超過20秒。它的行爲看起來非常隨機。DrawRect完成和UI刷新之間的時間差

我已經成功地確定:

  • 的drawRect被調用每次。
  • 表示滯後不在DrawRect方法中發生。
  • 當我運行時間簡檔,從我所知道的,沒有什麼是這個時間差

我的問題是,會發生什麼後的drawRect被調用,我可以嘗試一下,以確定問題的過程中發生?

絕對任何想法將不勝感激。

還要注意,用戶交互能夠縮短滯後時間。 - 旋轉的iPad(觸發重繪)總是讓用戶界面刷新立即 - 按下按鈕重做相同的查詢通常會刷新屏幕

所以它真的看起來像有隻我打一些隨機的延遲,而不是任何類型的處理器/工作負載問題。問題在於編程,我無法分辨UI是否已更新。否則,我可以讓它重新繪製。

我包含DrawRect方法的代碼,以防萬一引發任何想法,但從我所知道的情況來看,此方法在滯後發生之前完成。在對這個問題的迴應由Peter Hosey:由於解決了的時候用一個非常清晰和簡潔的描述,當不使用的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]; 
    } 
} 
} 

回答

1

好的問題。 What is the proper way to make it so core graphics does not lag?

基本上,這是我使用的開源類MMGridView中的一個錯誤,因爲它不應該使用drawRect:在UIScrollView上設置框或單元格。這是因爲沒有實際的繪圖發生。

因此,通過更改上述方法的名稱並直接將它調用到之前稱爲setNeedsDisplay的位置,不再有任何隨機滯後。

+0

我沒有得到你的結果。你能解釋一下嗎(包括一些代碼)?我遇到了MMGridView的問題。基本上,我設置了x行和y列,有時會顯示y行和x colums奇怪地放置...我嘗試了很多組合,但我不知道是什麼導致它。即使演示工作不正常(我在iOS6上測試它) – Piotr 2012-10-28 00:35:48

+1

我的問題是,它選擇繪製網格的方式依賴於MMGridView.m中的方法( - (void)drawRect:(CGRect)矩形) ,但只有在視圖需要重繪時纔會調用此方法。你可以通過調用'[self.view setNeedsDisplay]'來做到這一點。但是這種方法沒有實際的繪圖。該方法實際上創建並放置視圖以形成網格。因此,setNeedsDisplay不會觸發此方法被調用。我簡單地將它重命名爲( - (void)drawCells),並直接使用'[myMMGridView drawCells]'調用它' – Scoop 2012-10-31 09:53:32

+0

你們是否遇到了在使用ios5滾動頁面時閃爍gridview的問題?在ios6中,它很好。 – Linson 2013-08-30 14:24:41

相關問題