2

私は iOS で描画に取り組んでいます。コードは機能しており、描画は正常に機能しています。元に戻す機能とやり直し機能を実装しましたが、何が起こっているかというと、2 本の線を描画してから元に戻すボタンを押すと、最初の行draw が Blur を取得していますが、なぜそれが起こっているのか理解できません。以下は私の元に戻すコードです。

-

(void)redrawLine
{
    UIGraphicsBeginImageContext(self.bounds.size);
    [self.layer renderInContext:UIGraphicsGetCurrentContext()];
    NSDictionary *lineInfo = [lineArray lastObject];
    curImage = (UIImage*)[lineInfo valueForKey:@"IMAGE"];
    UIGraphicsEndImageContext();
    [self setNeedsDisplayInRect:self.bounds];
    [self setNeedsDisplay];
}



-(void)undoButtonClicked
{
    if([lineArray count]>0){
        NSMutableArray *_line=[lineArray lastObject];
        [bufferArray addObject:[_line copy]];
        [lineArray removeLastObject];
        drawStep = UNDO;
        [self redrawLine];
    }

}


- (void)drawRect:(CGRect)rect
{

    switch (drawStep) {
        case DRAW:
        {
            [curImage drawAtPoint:CGPointMake(0, 0)];
            CGPoint mid1 = midPoint(previousPoint1, previousPoint2); 
            CGPoint mid2 = midPoint(currentPoint, previousPoint1);
            CGContextRef context = UIGraphicsGetCurrentContext(); 

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

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

以下は、元に戻すボタンが押されたときに何が起こっているかの画像です

最初の画像は元に戻すボタンがクリックされる前で、2 番目の画像は元に戻すボタンがクリックされた後です

元に戻すボタンがクリックされる前 元に戻すボタンがクリックされた後

よろしくランジット

4

1 に答える 1

5

への呼び出しUIGraphicsBeginImageContextは、ビットマップのサイズをポイント単位 (つまり、フルスクリーンの場合は 320x480) で指定していますが、Retina ディスプレイを搭載したデバイスでは、画面のサイズをピクセル単位 (つまり、640x960) にする必要があります。

0.0UIGraphicsBeginImageContextWithOptionsに設定して呼び出すことができるはずです。scaleドキュメントから:

ビットマップに適用する倍率。値 0.0 を指定すると、倍率はデバイスのメイン画面の倍率に設定されます。

于 2012-07-13T08:56:48.693 に答える