4

私は消しゴムオプションがある描画プロジェクトに取り組んでいます。以下のコードは、アプリを起動していくつかの線を描画し、消しゴムを使用するためのものです。それはうまく機能し、消しゴム効果が得られます。2 番目のシナリオでは、10 本の線を描画してから「元に戻すボタン」をクリックしてすべてを元に戻し、次にすべてをやり直します。次に、「消しゴム ボタン」をクリックして一部を消去しようとします。 、代わりに、描画全体をクリアします。これは私が理解しようとしているものですが、どこが間違っているのか理解できないので、友達、助けてください。

以下は私のコードです。

- (void)drawRect:(CGRect)rect
{


      case DRAW:
    {
        [m_curImage drawAtPoint:CGPointMake(0, 0)];

        CGPoint mid1 = midPoint(m_previousPoint1, m_previousPoint2); 
        CGPoint mid2 = midPoint(m_currentPoint, m_previousPoint1);
        CGContextRef context = UIGraphicsGetCurrentContext(); 



        [self.layer renderInContext:context];
        CGContextMoveToPoint(context, mid1.x, mid1.y);
        CGContextAddQuadCurveToPoint(context, m_previousPoint1.x, m_previousPoint1.y, mid2.x, mid2.y); 
        CGContextSetLineCap(context, kCGLineCapRound);
        CGContextSetLineWidth(context, self.lineWidth);
        CGContextSetStrokeColorWithColor(context, self.lineColor.CGColor);
        CGContextSetAlpha(context, self.lineAlpha);
        CGContextSetAllowsAntialiasing(context, YES);
        CGContextStrokePath(context); 
       //            [super drawRect:rect];           
    }
         break;



        case ERASE:
        {
            [m_curImage drawAtPoint:CGPointMake(0, 0)];
            CGContextRef context = UIGraphicsGetCurrentContext();     
            CGContextClearRect(context, rect);                
            CGContextSetBlendMode(context, kCGBlendModeClear);
            [super drawRect:rect];
            break;                

  }      


        case UNDO:
        {
            [m_curImage drawInRect:self.bounds];
             break;

        }

        case REDO:
        {
            [m_curImage drawInRect:self.bounds];  
             break;           
        }


        default:
            break;
    }    
}

これらは、元に戻す/やり直しをクリックしたときに実行される機能です。

-(void)redrawLine
{
    UIGraphicsBeginImageContextWithOptions(self.bounds.size, NO, 0.0f);
    [self.layer renderInContext:UIGraphicsGetCurrentContext()];
    NSDictionary *lineInfo = [m_lineArray lastObject];
    m_curImage = (UIImage*)[lineInfo valueForKey:@"IMAGE"];
    UIGraphicsEndImageContext();
    [self setNeedsDisplayInRect:self.bounds];   
}


-(void)undoButtonClicked
{
    if([m_lineArray count] > 0)
    {
        NSMutableArray *line = [m_lineArray lastObject];
        [m_bufferArray addObject:line];
        [m_lineArray removeLastObject];
        [self redrawLine];
    }
    m_drawStep = UNDO;

}

-(void)redoButtonClicked
{
    if([m_bufferArray count] > 0)
    {
        NSMutableArray *line = [m_bufferArray lastObject];
        [m_lineArray addObject:line];
        [m_bufferArray removeLastObject];        
        [self redrawLine];
    }
     m_drawStep = REDO;

}

私がそれを正しく行っているかどうか教えてください。

よろしく、

ランジット

4

2 に答える 2

5

私はこの問題を解決しました。問題と以下は完全に機能するコードです

case :ERASE
{
 CGPoint mid1 = midPoint(m_previousPoint1, m_previousPoint2); 
            CGPoint mid2 = midPoint(m_currentPoint, m_previousPoint1);

            [m_curImage drawAtPoint:CGPointMake(0, 0)];
            CGContextRef context = UIGraphicsGetCurrentContext(); 

            [self.layer renderInContext:context];
            CGContextMoveToPoint(context, mid1.x, mid1.y);
            CGContextAddQuadCurveToPoint(context, m_previousPoint1.x, m_previousPoint1.y, mid2.x, mid2.y); 
            CGContextSetLineCap(context, kCGLineCapRound);


            CGContextSetBlendMode(context, kCGBlendModeClear);
            CGContextSetLineJoin(context, kCGLineJoinRound);
            CGContextSetLineWidth(context, self.lineWidth);
            CGContextSetStrokeColorWithColor(context, self.lineColor.CGColor);
            CGContextSetShouldAntialias(context, YES);  
            CGContextSetAllowsAntialiasing(context, YES); 
            CGContextSetFlatness(context, 0.1f);

            CGContextSetAlpha(context, self.lineAlpha);
            CGContextStrokePath(context); 
}

よろしくランジット。

これで問題は解決しました。誰かが同じ問題を抱えている場合は、これを実装してください。

于 2012-07-23T11:01:56.100 に答える
2

ここで何が起こっているのかというと、rect全体を消去するとクリアなnaになりますか?そのため、その消去方法を使用する代わりに、画面と同じ色で線を描画して、ウィンドウがクリアされているように見せ、簡単に試してみてください。

たとえば、描画画面が黒い場合は、画面上でタッチ移動した線を黒い色で描画して、クリアのように見せます。

-(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event{
  lastPoint = [touch locationInView:imagevw];
  }

  -(void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event
   UITouch *touch = [touches anyObject];
   CGPoint currentPoint = [touch locationInView:imagevw];
   UIGraphicsBeginImageContext(self.imagevw.frame.size);

  [self.imagevw.image drawInRect:CGRectMake(0, 0, self.imagevw.frame.size.width,        self.imagevw.frame.size.height)];
    CGContextSetLineWidth(UIGraphicsGetCurrentContext(), width);
    CGContextSetRGBStrokeColor(UIGraphicsGetCurrentContext(), 0.0, 0.0, 0.0, 1.0); // black color
    CGContextBeginPath(UIGraphicsGetCurrentContext());
    CGContextMoveToPoint(UIGraphicsGetCurrentContext(), lastPoint.x, lastPoint.y);
    CGContextAddLineToPoint(UIGraphicsGetCurrentContext(), currentPoint.x, currentPoint.y);
    CGContextStrokePath(UIGraphicsGetCurrentContext());
     imagevw.image = UIGraphicsGetImageFromCurrentImageContext();
     UIGraphicsEndImageContext();

これは、黒いビューに黒い色で線を引くためのコードです...試してみてください...それはあなたを助けるかもしれません..

于 2012-07-18T07:44:21.987 に答える