2011-08-02 14 views
7

मुझे अंडाकार या अंडाकार के आकार में एक रेडियल ढाल की आवश्यकता है और ऐसा लगता है कि यह CGContextDrawRadialGradient केवल एक आदर्श सर्कल खींच सकता है। मैं एक वर्ग संदर्भ में चित्रण कर रहा हूं फिर एक आयताकार संदर्भ में प्रतिलिपि/चित्रण कर रहा हूं।क्या कोई सही सर्कल के बजाय एक अंडाकार के रूप में CGContextDrawRadialGradient को आकर्षित करने का कोई तरीका है?

ऐसा करने का कोई बेहतर तरीका है?

धन्यवाद!

उत्तर

4

आप संदर्भ एक अंडाकार आकर्षित करने के लिए की बदलना बदल सकते हैं (उदाहरण के लिए, बस CGContextDrawRadialGradient कॉल करने से पहले CGContextScaleCTM (संदर्भ, 2.0, 1.0) लागू() एक अंडाकार ढाल के रूप में यह अधिक है दो बार के रूप में व्यापक है कि आकर्षित करने के लिए)। हालांकि, अपनी शुरुआत और अंत बिंदुओं में उलटा परिवर्तन लागू करना याद रखें।

+0

इससे मुझ पर मिल सही ट्रैक धन्यवाद! मैंने इसे नीचे एक कोड उदाहरण के साथ विस्तारित किया। –

5

मार्क एफ ने सुझाव दिया है कि मुझे ऐसा करने का एकमात्र तरीका है, लेकिन मुझे लगता है कि उत्तर को समझने में आसान होने के लिए एक उदाहरण की आवश्यकता है।

आईओएस में एक दृश्य में एक अंडाकार ढाल ड्रा (और एआरसी का उपयोग कर):

- (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); 
} 

एक काले रंग की पृष्ठभूमि के साथ एक दृश्य में रखो आपको मिलेगा:

enter image description here

संबंधित मुद्दे

 संबंधित मुद्दे