私は、ズームイン/ズームアウトをサポートするという基本的な要件を持つ小さな描画アプリケーションに取り組んでいます。主な問題が 2 つあります。
- ビューをズーム/変換すると、描画がくっきりと鮮明に表示されません。より良いアプローチはありますか、またはビューがズームされているときに描画を改善する方法はありますか? 
- 1200 x 1200 pts のキャンバス (iPhone) に描画すると、描画パフォーマンスが低下します。大きなキャンバスサイズで改善できる可能性はありますか? 
ズームコード:
- (void)scale:(UIPinchGestureRecognizer *)gestureRecognizer {
    [self adjustAnchorPointForGestureRecognizer:gestureRecognizer];
    UIView *canvas = [gestureRecognizer view];
    if ([gestureRecognizer state] == UIGestureRecognizerStateBegan ||
        [gestureRecognizer state] == UIGestureRecognizerStateChanged) {
        // Calculate the drawing view's size
        CGSize drawingViewSize = ...;
        // Calculate the minimum allowed tranform size
        // Developer's Note: I actually wanted to use the size 1/4th of the view
        // but self.view.frame.size doesn't return the correct (actual) width and height
        // It returns these values inverted i.e. width as height, and vice verse.
        // The reason is that the view appears to be transformed (90 degrees).
        // Since there's no work-around this, so for now, I'm just using fixed values.
        CGSize minTranformSize = CGSizeMake(100.0f, 100.0f);
        if ((minTranformSize.width > drawingViewSize.width) && (minTranformSize.height > drawingViewSize.height)) {
            minTranformSize = drawingViewSize;
        }
        // Transform the view, provided
        // 1. It won't scale more than the original size of the background image
        // 2. It won't scale less than the minimum possible transform
        CGSize transformedSize = CGSizeMake(canvas.frame.size.width * [gestureRecognizer scale],
                                            canvas.frame.size.height * [gestureRecognizer scale]);
        if ((transformedSize.width <= drawingViewSize.width) && (transformedSize.height <= drawingViewSize.height) &&
            (transformedSize.width >= minTranformSize.width) && (transformedSize.height >= minTranformSize.height)) {
            canvas.transform = CGAffineTransformScale([canvas transform],
                                                      [gestureRecognizer scale],
                                                      [gestureRecognizer scale]);
        }
        [gestureRecognizer setScale:1.0];
    } else if ([gestureRecognizer state] == UIGestureRecognizerStateEnded) {
        // Recenter the container view, if required (piece is smaller than the view and it's not aligned)
        CGSize viewSize = self.view.bounds.size;
        if ((canvas.frame.size.width < viewSize.width) ||
            (canvas.frame.size.height < viewSize.height)) {
            canvas.center = CGPointMake(viewSize.width/2, viewSize.height/2);
        }
        // Adjust the x/y coordinates, if required (piece is larger than the view and it's moving outwards from the view)
        if (((canvas.frame.origin.x > 0) || (canvas.frame.origin.y > 0)) &&
            ((canvas.frame.size.width >= viewSize.width) && (canvas.frame.size.height >= viewSize.height))) {
            canvas.frame = CGRectMake(0.0,
                                      0.0,
                                      canvas.frame.size.width,
                                      canvas.frame.size.height);
        }
        canvas.frame = CGRectIntegral(canvas.frame);
    }
}
描画コード
- (void)draw {
    CGContextRef context = UIGraphicsGetCurrentContext();
    CGContextSaveGState(context);
    if (self.fillColor) {
        [self.fillColor setFill];
        [self.path fill];
    }
    if ([self.strokeColor isEqual:[UIColor clearColor]]) {
        [self.path strokeWithBlendMode:kCGBlendModeClear alpha:1.0];
    } else if (self.strokeColor) {
        [self.strokeColor setStroke];
        [self.path stroke];
    }
    CGContextRestoreGState(context);
}