2012-09-10 25 views
0

這是我的問題。我計劃在安裝時在視圖內繪製999個圓圈,這在drawRect中成功完成。之後,我打算在用戶觸摸時編輯每個圓圈的顏色(我在視圖控制器中使用輕擊手勢來處理)。問題是,當我調用[self.pegView setNeedsDisplay]; drawRect被調用,並在drawRect(它應該)中轉到if的else部分,但所有其他小珠都被刪除,而我只看到1個小珠而不是999個小珠。如何重繪drawRect中的某個矩形

以下是我的代碼。

- (void)drawRect:(CGRect)rect 
{ 

    if(!self.isEditingHappening) // For the initial setup 
    { 
     CGRect beadRect = CGRectMake(BEAD_ORIGIN_X, BEAD_ORIGIN_Y, BEAD_VIEW_SIZE, BEAD_VIEW_SIZE); 
     self.ctx = UIGraphicsGetCurrentContext(); 

     for(int i = 0 ; i < 999 ; i++) 
     { 
      // To set up the bead view for each column 
      if (i !=0 && i % 37 !=0) 
      { 
       beadRect.origin = CGPointMake((beadRect.origin.x + BEAD_VIEW_SIZE), beadRect.origin.y); 
      } 

      // To set up bead view for each row 
      if (i !=0 && i %37 ==0) 
      { 
       beadRect.origin.y += BEAD_VIEW_SIZE; 
       beadRect.origin = CGPointMake(BEAD_ORIGIN_X, beadRect.origin.y); 
      } 

      BeadPattern *pattern = [self.beadPatternsArray objectAtIndex:(i/37)]; 

      int beadType=[[pattern.eachRowPattern objectAtIndex:i%37] intValue]; 
      BeadColor *color=[self.beadColorsArray objectAtIndex:beadType]; 


      CGPoint center; 
      center.x = beadRect.origin.x + beadRect.size.width/2.0; 
      center.y = beadRect.origin.y + beadRect.size.height/2.0; 

      CGRect newInnerRect; 
      newInnerRect.size.width = beadRect.size.width * 0.6; 
      newInnerRect.size.height = beadRect.size.height * 0.6; 
      newInnerRect.origin.x = center.x - newInnerRect.size.width/2; 
      newInnerRect.origin.y = center.y - newInnerRect.size.height/2; 



      [[UIColor whiteColor] set]; 
      UIRectFill(beadRect); 

      // Adds the outer circle 
      CGContextAddEllipseInRect(self.ctx, beadRect); 

      // Fill the outer circle with any color 
      CGContextSetRGBFillColor(self.ctx, color.redValue, color.greenValue, color.blueValue, 1); 

      CGContextFillEllipseInRect(self.ctx, beadRect); 

      //Add inner circle 
      CGContextAddEllipseInRect(self.ctx, newInnerRect); 


      //Fill inner circle with white color 
      CGContextSetRGBFillColor(self.ctx, 1, 1, 1, 0.4); 
      CGContextFillEllipseInRect (self.ctx, newInnerRect); 

     } 
    } 
    else // When editing is happening 
    { 
     NSLog(@"The redrawing rect is %@", NSStringFromCGRect(rect)); 
     CGContextSaveGState(self.ctx); 
     CGRect beadRect; 
     beadRect.size = CGSizeMake(BEAD_VIEW_SIZE, BEAD_VIEW_SIZE); 
     beadRect.origin = CGPointMake(self.columnToBeUpdated * BEAD_VIEW_SIZE, self.rowToBeUpdated * BEAD_VIEW_SIZE); 

     CGPoint center; 
     center.x = beadRect.origin.x + beadRect.size.width/2.0; 
     center.y = beadRect.origin.y + beadRect.size.height/2.0; 

     CGRect newInnerRect; 
     newInnerRect.size.width = beadRect.size.width * 0.6; 
     newInnerRect.size.height = beadRect.size.height * 0.6; 
     newInnerRect.origin.x = center.x - newInnerRect.size.width/2; 
     newInnerRect.origin.y = center.y - newInnerRect.size.height/2; 

     CGContextRestoreGState(self.ctx); 

     [[UIColor whiteColor] set]; 
     UIRectFill(beadRect); 

     // Adds the outer circle 
     CGContextAddEllipseInRect(self.ctx, beadRect); 

     // Fill the outer circle with any color 
     CGContextSetRGBFillColor(self.ctx, self.colorToBeShownWhileEdited.redValue, self.colorToBeShownWhileEdited.greenValue, self.colorToBeShownWhileEdited.blueValue, 1); 

     CGContextFillEllipseInRect(self.ctx, beadRect); 

     //Add inner circle 
     CGContextAddEllipseInRect(self.ctx, newInnerRect); 

     //Fill inner circle with white color 
     CGContextSetRGBFillColor(self.ctx, 1, 1, 1, 0.4); 
     CGContextFillEllipseInRect (self.ctx, newInnerRect); 
    } 
    } 

我打算做的是,保留所有999個珠子,但只編輯用戶觸摸的珠子的一種顏色。我也試着使用[setNeedsDisplayInRect],但是rect沒有正確傳遞。請在這裏幫助我。

回答

0

如果我沒有記錯的話,它清除了畫布上的其他項目 - 所以您的初始設置的東西將需要運行每次。

或者,您可以爲每個珠子創建單獨的視圖,以便您可以專門追蹤該視圖。每個珠子可以包含它自己的邏輯。

+0

我試過每個珠子有單一的視圖,但是它的開銷太大了,當我們縮放滾動視圖內的視圖時(因爲它必須爲每個縮放調用999個視圖),它太滯後了。所以我走到了所有999個珠子都有一個視野的道路上。 – jeevangs