2011-11-04 20 views
6

मैं एक घुमावदार रेखा खींचना चाहता हूं जब तक कि यह पूर्ण घूर्णन न हो जाए और एक पूर्ण सर्कल बनने के लिए जुड़ जाए, केवल सर्कल रूपरेखा न भरें। इसे कई सेकंड में एनिमेटेड होना है।आईफोन: जब तक यह एक सर्कल एनीमेशन नहीं बन जाता है तब तक एक घुमावदार रेखा खींचना

क्या कोई मुझे सही दिशा में इंगित कर सकता है? मैंने पहले से ही similar question से पूछा है, लेकिन मैंने गलत तरीके से यह कहा है कि हर किसी को समझने में कठिनाई हो रही थी और इस प्रकार यह प्रश्नों के समुद्र में खो गया।

किसी भी मदद

[संपादित करें]

के लिए कई धन्यवाद मैं वर्तमान में उप-classing UIView और अधिभावी drawRect हूँ। मुझे एक भरे सर्कल को आकर्षित करने के लिए कोड मिला लेकिन मुझे केवल स्ट्रोक की आवश्यकता है।

- (void)drawRect:(CGRect)rect { 
// Drawing code 

CGRect allRect = self.bounds; 
CGRect circleRect = CGRectInset(allRect, 2.0f, 2.0f); 

CGContextRef context = UIGraphicsGetCurrentContext(); 

// Draw background 
CGContextSetRGBStrokeColor(context, self.strokeValueRed, self.strokeValueGreen, self.strokeValueBlue, self.strokeValueAlpha); // white 
CGContextSetRGBFillColor(context, 1.0f, 1.0f, 1.0f, 0.1f); // translucent white 
CGContextSetLineWidth(context, self.lineWidth); 
CGContextFillEllipseInRect(context, circleRect); 
CGContextStrokeEllipseInRect(context, circleRect); 

// Draw progress 
CGPoint center = CGPointMake(allRect.size.width/2, allRect.size.height/2); 
CGFloat radius = (allRect.size.width - 4)/2; 
CGFloat startAngle = - ((float)M_PI/2); // 90 degrees 
CGFloat endAngle = (self.progress * 2 * (float)M_PI) + startAngle; 
CGContextSetRGBFillColor(context, 1.0f, 1.0f, 1.0f, 1.0f); // white 
CGContextMoveToPoint(context, center.x, center.y); 
CGContextAddArc(context, center.x, center.y, radius, startAngle, endAngle, 0); 
CGContextClosePath(context); 
CGContextFillPath(context); 
} 

[संपादित करें # 2]

मैं सभी को भरने संदर्भ हटाने के लिए कोड अपने ड्राइंग नहीं कुछ भी :(किसी भी विचार बदल लेकिन अब?

- (void)drawRect:(CGRect)rect 
{ 
// Drawing code 

CGRect allRect = self.bounds; 
CGContextRef context = UIGraphicsGetCurrentContext(); 

// Draw background 
CGContextSetRGBStrokeColor(context, self.strokeValueRed, self.strokeValueGreen, self.strokeValueBlue, self.strokeValueAlpha); // white 
CGContextSetLineWidth(context, 5); 

// Draw progress 
CGPoint center = CGPointMake(allRect.size.width/2, allRect.size.height/2); 
CGFloat radius = (allRect.size.width - 4)/2; 
CGFloat startAngle = - ((float)M_PI/2); // 90 degrees 
CGFloat endAngle = (self.progress * 2 * (float)M_PI) + startAngle; 
CGContextAddArc(context, center.x, center.y, radius, startAngle, endAngle, 0); 
CGContextStrokePath(context); 
} 

[संपादित करें # 3] समाधान

ठीक है मुझे सही डिकहेड की तरह लगता है! समस्या यह थी कि स्ट्रोक रंग मूल्यों को प्रारंभ नहीं किया गया था जिसका मतलब है कि रेखा खींची जा रही थी लेकिन स्पष्ट रूप से इसे नहीं देख सका !!

उत्तर

3

भरने के लिए समय-समय पर अपडेट करने के लिए टाइमर का उपयोग कर सकते हैं।

CGContextFillPath को CGContextStrokePath के अंत में बदलें।

अंत में CGContextMoveToPoint और CGContextClosePath बाहर निकालें। वे सिर्फ वेज के सीधे किनारे की रूपरेखा करते हैं।

आपको इसे लेने के बजाय, केंद्र की जगह चाप के प्रारंभ बिंदु पर जाने के लिए CGContextMoveToPoint को बदलना पड़ सकता है।

+0

आपकी मदद के लिए धन्यवाद! – bennythemink

0

यूवीव्यू को उप-वर्गीकृत करने के लिए एक बहुत सीधी आगे की दृष्टिकोण हो सकती है और यह एक चर लंबाई लंबाई खींच सकता है। फिर आप रोटेशन कोण

+0

हे @ एटान मैं यह ठीक कर रहा था लेकिन मैं सिर्फ यह नहीं समझ सकता कि भरे सर्कल को चित्रित किए बिना स्ट्रोक को कैसे आकर्षित किया जाए। मैंने अपना कोड दिखाने के लिए उपरोक्त पोस्ट में संशोधन किया है। – bennythemink

16

यह वही जवाब है जैसा मैंने आपके अन्य प्रश्न here को दिया था।

क्या तुम सच में करना चाहिए चेतन एक CAShapeLayer जहां पथ एक चक्र है के स्ट्रोक के लिए है। यह कोर एनीमेशन का उपयोग करके तेज़ हो जाएगा और ड्रॉरेक्ट में एक सर्कल का हिस्सा खींचने के लिए कम गन्दा है:।

नीचे दिया गया कोड स्क्रीन के केंद्र में एक सर्कल आकार परत बनाएगा और इसके स्ट्रोक को घड़ी की दिशा में एनिमेट करेगा ताकि ऐसा लगता है कि यह खींचा जा रहा है। आप निश्चित रूप से किसी भी आकार का उपयोग कर सकते हैं जो आप चाहें। (आप ओले Begemanns ब्लॉग पर this article पढ़ सकते हैं कि कैसे एक आकार परत के स्ट्रोक चेतन करने के बारे में अधिक जानने के लिए।)

नोट: कि स्टोक गुण परत पर सीमा गुण के रूप में ही नहीं हैं। स्ट्रोक की चौड़ाई को बदलने के लिए आपको "सीमाविड्थ" आदि के बजाय "लाइनविड्थ" का उपयोग करना चाहिए।

// Set up the shape of the circle 
int radius = 100; 
CAShapeLayer *circle = [CAShapeLayer layer]; 
// Make a circular shape 
circle.path = [UIBezierPath bezierPathWithRoundedRect:CGRectMake(0, 0, 2.0*radius, 2.0*radius) 
             cornerRadius:radius].CGPath; 
// Center the shape in self.view 
circle.position = CGPointMake(CGRectGetMidX(self.view.frame)-radius, 
           CGRectGetMidY(self.view.frame)-radius); 

// Configure the apperence of the circle 
circle.fillColor = [UIColor clearColor].CGColor; 
circle.strokeColor = [UIColor blackColor].CGColor; 
circle.lineWidth = 5; 

// Add to parent layer 
[self.view.layer addSublayer:circle]; 

// Configure animation 
CABasicAnimation *drawAnimation = [CABasicAnimation animationWithKeyPath:@"strokeEnd"]; 
drawAnimation.duration   = 10.0; // "animate over 10 seconds or so.." 
drawAnimation.repeatCount   = 1.0; // Animate only once.. 

// Animate from no part of the stroke being drawn to the entire stroke being drawn 
drawAnimation.fromValue = [NSNumber numberWithFloat:0.0f]; 
drawAnimation.toValue = [NSNumber numberWithFloat:1.0f]; 

// Experiment with timing to get the appearence to look the way you want 
drawAnimation.timingFunction = [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseIn]; 

// Add the animation to the circle 
[circle addAnimation:drawAnimation forKey:@"drawCircleAnimation"]; 
+1

हाय डेविड, आपकी मदद के लिए धन्यवाद। मैंने आपके पिछले प्रश्न के उत्तर के रूप में अपना समाधान निर्धारित किया है। किसी को मेरे बुरे प्रश्न का विवरण समझने में खुशी हुई :) – bennythemink

+0

मैं भी इसकी तलाश कर रहा था। महान काम किया ... धन्यवाद डेविड ... –

+0

'हटाया गया अपूर्ण' यहां 'हाँ' के बराबर होना चाहिए। 'strokeEnd' प्रॉपर्टी डिफ़ॉल्ट रूप से पहले से 1.0 है, और एनीमेशन को स्क्रीन पर एक बार पूरा करने की आवश्यकता नहीं है, यह केवल बैटरी/प्रदर्शन को बर्बाद कर देगा। अन्यथा यहां सबसे अच्छा समाधान! – Drmorgan

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

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