Ios 如何在drawRect中重画某个rect

Ios 如何在drawRect中重画某个rect,ios,ipad,uiimage,drawrect,Ios,Ipad,Uiimage,Drawrect,这是我的问题。我计划在设置时在视图内绘制999个圆圈,这在drawRect中已成功完成。之后,我计划在用户触摸时编辑每个圆的颜色(我正在使用视图控制器中的点击手势进行处理)。问题是,当我调用[self.pegView setNeedsDisplay]时;drawRect被调用并转到if in drawRect的else部分(它应该这样做),但是所有其他珠子都被移除了,我只看到1个珠子而不是999个珠子 下面是我的代码 - (void)drawRect:(CGRect)rect { if

这是我的问题。我计划在设置时在视图内绘制999个圆圈,这在drawRect中已成功完成。之后,我计划在用户触摸时编辑每个圆的颜色(我正在使用视图控制器中的点击手势进行处理)。问题是,当我调用[self.pegView setNeedsDisplay]时;drawRect被调用并转到if in drawRect的else部分(它应该这样做),但是所有其他珠子都被移除了,我只看到1个珠子而不是999个珠子

下面是我的代码

- (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);
     }
  }
-(void)drawRect:(CGRect)rect
{
如果(!self.iseditinghapping)//用于初始设置
{
CGRect beadRect=CGRectMake(胎圈原点X、胎圈原点Y、胎圈视图大小、胎圈视图大小);
self.ctx=UIGraphicsGetCurrentContext();
对于(int i=0;i<999;i++)
{
//为每个柱设置胎圈视图的步骤
如果(i!=0&&i%37!=0)
{
beadRect.origin=CGPointMake((beadRect.origin.x+BEAD\u视图\u大小),beadRect.origin.y);
}
//为每行设置胎圈视图的步骤
如果(i!=0&&i%37==0)
{
beadRect.origin.y+=珠子视图大小;
beadRect.origin=CGPointMake(BEAD\u origin\u 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];
点中心;
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);
//添加外圆
CGContextAddEllipseInRect(self.ctx,beadRect);
//用任何颜色填充外圆
CGContextSetRGBFillColor(self.ctx,color.redValue,color.greenValue,color.blueValue,1);
cgContextFilllellipseInRect(self.ctx,beadRect);
//添加内圈
CGContextAddEllipseInRect(self.ctx,newInnerRect);
//用白色填充内圈
CGContextSetRGBFillColor(self.ctx,1,1,0.4);
cgContextFilllellipseInrect(self.ctx,newInnerRect);
}
}
else//正在进行编辑时
{
NSLog(@“重绘rect为%@”,NSStringFromCGRect(rect));
CGContextSaveGState(self.ctx);
CGRect beadRect;
beadRect.size=CGSizeMake(胎圈视图尺寸,胎圈视图尺寸);
beadRect.origin=CGPointMake(self.columntToBeUpdated*珠子视图尺寸,self.rowToBeUpdated*珠子视图尺寸);
点中心;
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);
//添加外圆
CGContextAddEllipseInRect(self.ctx,beadRect);
//用任何颜色填充外圆
CGContextSetRGBFillColor(self.ctx、self.colortobeshownwhileeded.redValue、self.colortobeshownwhileeded.greenValue、self.colortobeshownwhileeded.blueValue、1);
cgContextFilllellipseInRect(self.ctx,beadRect);
//添加内圈
CGContextAddEllipseInRect(self.ctx,newInnerRect);
//用白色填充内圈
CGContextSetRGBFillColor(self.ctx,1,1,0.4);
cgContextFilllellipseInrect(self.ctx,newInnerRect);
}
}

我打算做的是,保留所有999个珠子,但只编辑用户触摸过的一个珠子的颜色。我也尝试使用[setNeedsDisplayInRect],但没有正确传递rect。请帮帮我

如果我没记错的话,它会清除画布上的其他项目-因此每次都需要运行初始设置


或者,您可以为每个珠子创建单独的视图,这样您就可以专门遵循该珠子。每个珠子都可以包含自己的逻辑。

我尝试为每个珠子创建一个视图,但这会带来太多的开销,而且在滚动视图中缩放视图时会滞后太多(因为每次缩放都需要调用999个视图)。所以我走上了一条道路,所有999颗珠子都有一个视图。