0

私の見解を文脈に引き込もうとして、少し問題があるようです。

私の基本的な設定は、UIPageViewControllerユーザーの指で描画できるビューをコントローラーにロードするビューコントローラーを所有していることです。基本的には引き込める本があります。

本のページがめくられたら、電話して画像を保存します

- (UIImage *)wholeImage {
    // Render the layer into an image and return
    UIGraphicsBeginImageContext(self.bounds.size);
    [self.layer renderInContext:UIGraphicsGetCurrentContext()];
    UIImage *wholePageImage = UIGraphicsGetImageFromCurrentImageContext();
    UIGraphicsEndImageContext();
    return wholePageImage;
}

次に、この戻り値がファイルに保存されます。ただし、このsaveメソッドを呼び出すと、

[self.layer renderInContext:UIGraphicsGetCurrentContext()];

ヒットしますdrawRect:。これは、次のようにオーバーライドされる私のメソッドを呼び出しているようです。

- (void)drawRect:(CGRect)rect {
    // Draw the current state of the image
    [self.currentImage drawAtPoint:CGPointMake(0.0f, 0.0f)];
    CGPoint midPoint1 = [self midPointOfPoint1:previousPoint1 point2:previousPoint2];
    CGPoint midPoint2 = [self midPointOfPoint1:currentPoint point2:previousPoint1];

    // Get the context
    CGContextRef context = UIGraphicsGetCurrentContext(); 

    // Add the new bit of line to the image
    [self.layer renderInContext:context];
    CGContextMoveToPoint(context, midPoint1.x, midPoint1.y);
    CGContextAddQuadCurveToPoint(context, previousPoint1.x, previousPoint1.y, midPoint2.x, midPoint2.y); 
    CGContextSetLineCap(context, kCGLineCapRound);
    CGContextSetLineWidth(context, self.lineWidth);
    if (self.drawMode == LNDrawViewDrawModeTipex) CGContextSetBlendMode(context, kCGBlendModeClear);
    else CGContextSetBlendMode(context, kCGBlendModeCopy);
    CGContextSetStrokeColorWithColor(context, self.lineColour.CGColor);
    CGContextStrokePath(context);

    // Call super
    [super drawRect:rect];
}

これは理にかなっていますが、最終的にこの行でEXC_BAD_ACCESSを取得するまで、再帰的に呼び出されるようです。

[self.currentImage drawAtPoint:CGPointMake(0.0f, 0.0f)];

何がこれを引き起こしているのかについて完全に途方に暮れていて、私を狂わせています。

それが役に立ったら、私のコールスタックはこのように始まります

ここに画像の説明を入力してください

そして、最終的にで終わるまで再帰的に進みます

ここに画像の説明を入力してください

誰もが与えることができる本当に感謝し、助けと洞察をお願いします!

編集:(タッチが追加されました)

-(void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event {
    // Get the touch
    UITouch *touch = [touches anyObject];

    // Get the points
    previousPoint2 = previousPoint1;
    previousPoint1 = [touch previousLocationInView:self];
    currentPoint = [touch locationInView:self];

    // Calculate mid point
    CGPoint mid1 = [self midPointOfPoint1:previousPoint1 point2:previousPoint2]; 
    CGPoint mid2 = [self midPointOfPoint1:currentPoint point2:previousPoint1];

    // Create a path for the last few points
    CGMutablePathRef path = CGPathCreateMutable();
    CGPathMoveToPoint(path, NULL, mid1.x, mid1.y);
    CGPathAddQuadCurveToPoint(path, NULL, previousPoint1.x, previousPoint1.y, mid2.x, mid2.y);
    CGRect pathBounds = CGPathGetBoundingBox(path);
    CGPathRelease(path);

    // Take account of line width
    pathBounds.origin.x -= self.lineWidth * 2.0f;
    pathBounds.origin.y -= self.lineWidth * 2.0f;
    pathBounds.size.width += self.lineWidth * 4.0f;
    pathBounds.size.height += self.lineWidth * 4.0f;

    UIGraphicsBeginImageContext(pathBounds.size);
    [self.layer renderInContext:UIGraphicsGetCurrentContext()];
    self.currentImage = UIGraphicsGetImageFromCurrentImageContext();
    UIGraphicsEndImageContext();

    [self setNeedsDisplayInRect:pathBounds];    

}

4

1 に答える 1

0

期間中は電話[self.layer renderInContext:]をかけないでくださいdrawRect:。ご存知のように、実装されている場合はrenderInContext:呼び出します。これにより、無限の再帰が発生します。drawRect:

本をそのままレンダリングしてから、レンダリングされた画像を使用して、ユーザーがその上に描画できるようにする必要があります。これを行う1つの方法は、自己完結型の描画コードをUIGraphicsBeginImageContext()/UIGraphicsEndImageContext()ブロックで囲み、結果の画像をで使用することdrawRect:です。もう1つの方法は、相互のサブビューではない2つの異なるビューを使用することです。一方は変更されていない本を描画し、もう一方はユーザーのスケッチを描画します。

編集:まず、元の画像(本のページなど)が必要です。呼び出さずUIGraphicsBeginImageContext()に/UIGraphicsEndImageContext()ブロック内に描画し、ビューのivarに保存します(たとえば)。ビューを更新するために呼び出し中(それはあなたを呼び出します)。背景画像として使用します。 [self.layer renderInContext:]self.currentImagetouchesMoved:withEvent:setNeedsDisplaydrawRect:self.currentImagedrawRect:

漠然としすぎないことを願っています。

于 2012-04-12T18:12:41.397 に答える