2011-08-02 11 views

cevap

4

Bir elips çizmek için bağlamın dönüşümü değiştirebilirsiniz (örneğin, sadece CGContextDrawRadialGradient çağırmadan önce CGContextScaleCTM (bağlam, 2.0, 1.0) uygulamak() yüksek olduğu iki katı genişliğinde bulunuyor eliptik eğimi çizmek için). Yine de ters dönüşümü başlangıç ​​ve bitiş noktalarınıza uygulamayı unutmayın.

+0

Bu beni almak yardımcı doğru yol. Teşekkürler! Bunu aşağıdaki kod örneği ile genişlettim. –

5

Bunu yapmamın tek yolu Mark F'nin önerdiği gibi, ama cevabın daha kolay anlaşılması için bir örneğe ihtiyacı olduğunu düşünüyorum.

iOS bir görünümde eliptik eğimi çizin (ve ARC kullanarak): siyah arka plana sahip bir görünümde koyun

- (void)drawRect:(CGRect)rect { 

    CGContextRef ctx = UIGraphicsGetCurrentContext(); 

    // Create gradient 
    CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB(); 
    CGFloat locations[] = {0.0, 1.0}; 

    UIColor *centerColor = [UIColor orangeColor]; 
    UIColor *edgeColor = [UIColor purpleColor]; 

    NSArray *colors = [NSArray arrayWithObjects:(__bridge id)centerColor.CGColor, (__bridge id)edgeColor.CGColor, nil]; 
    CGGradientRef gradient = CGGradientCreateWithColors(colorSpace, (__bridge CFArrayRef)colors, locations); 

    // Scaling transformation and keeping track of the inverse 
    CGAffineTransform scaleT = CGAffineTransformMakeScale(2, 1.0); 
    CGAffineTransform invScaleT = CGAffineTransformInvert(scaleT); 

    // Extract the Sx and Sy elements from the inverse matrix 
    // (See the Quartz documentation for the math behind the matrices) 
    CGPoint invS = CGPointMake(invScaleT.a, invScaleT.d); 

    // Transform center and radius of gradient with the inverse 
    CGPoint center = CGPointMake((self.bounds.size.width/2) * invS.x, (self.bounds.size.height/2) * invS.y); 
    CGFloat radius = (self.bounds.size.width/2) * invS.x; 

    // Draw the gradient with the scale transform on the context 
    CGContextScaleCTM(ctx, scaleT.a, scaleT.d); 
    CGContextDrawRadialGradient(ctx, gradient, center, 0, center, radius, kCGGradientDrawsBeforeStartLocation); 

    // Reset the context 
    CGContextScaleCTM(ctx, invS.x, invS.y); 

    // Continue to draw whatever else ... 

    // Clean up the memory used by Quartz 
    CGGradientRelease(gradient); 
    CGColorSpaceRelease(colorSpace); 
} 

Alacağınız:

enter image description here

İlgili konular