2012-02-14 36 views
6

मैं touchesMoved: विधि के अनुसार रेखाएं खींच रहा हूं और आमतौर पर यह ठीक काम करता है। लेकिन जब मैं छवि में ज़ूम करता हूं और ड्रॉ करता हूं, तो पहले खींची गई रेखाएं विस्थापित होती हैं और अधिक से अधिक धुंधली होती रहती हैं, अंततः गायब हो जाती हैं। मैंने UIPinchGestureRecognizer का उपयोग करने की कोशिश की है और framemyImageView (केवल मल्टी-टच ईवेंट के लिए) बढ़ाना है लेकिन समस्या दोनों तरीकों से होती है।CGContextStrokePath छवियों को ज़ूम करने और चित्रित करते समय काम नहीं कर रहा है

- (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event { 
NSArray *allTouches = [touches allObjects]; 
int count = [allTouches count]; 
if(count==1){//single touch case for drawing line 
    UITouch *touch = [touches anyObject]; 
    CGPoint currentPoint = [touch locationInView:myImageView]; 
    UIGraphicsBeginImageContext(myImageView.frame.size); 
    [drawImage.image drawInRect:CGRectMake(0, 0, myImageView.frame.size.width, myImageView.frame.size.height)]; 
    CGContextSetLineCap(UIGraphicsGetCurrentContext(), kCGLineCapRound); 
    CGContextSetLineWidth(UIGraphicsGetCurrentContext(), 2.0); 
    CGContextBeginPath(UIGraphicsGetCurrentContext()); 
    CGContextMoveToPoint(UIGraphicsGetCurrentContext(), lastPoint.x, lastPoint.y); 
    CGContextAddLineToPoint(UIGraphicsGetCurrentContext(), currentPoint.x, currentPoint.y); 
    CGContextStrokePath(UIGraphicsGetCurrentContext()); 
    drawImage.image = UIGraphicsGetImageFromCurrentImageContext(); 
    UIGraphicsEndImageContext(); 
    lastPoint = currentPoint; 
} 
else{//multi touch case 
    // handle pinch/zoom 
    } 
} 

यहाँ छवि ज़ूम किए बिना अधिक तैयार की है:: यहाँ ड्राइंग के लिए कोड है

enter image description here

और इस छवि को जूम करने में लाल तीर के साथ खंड दिखा के बाद समस्या को दर्शाया गया है जो ज़ूमिंग-इन से पहले ही खींचा गया था (जैसा कि पिछली छवि में दिखाया गया है)। छवि दोनों धुंधला और विस्थापित है:

enter image description here

यह भी देखा जा सकता है कि अंत में खींची गई रेखा का एक हिस्सा अप्रभावित है और घटना समय में वापस खींचा लाइनों के लिए होता है। मेरा मानना ​​है कि इसका कारण यह है कि जब मैं ज़ूम इन/आउट करता हूं तो छवि आकार विशेषताओं को खो दिया जा रहा है जो शायद धुंध और शिफ्ट का कारण बनता है, लेकिन मुझे इसके बारे में निश्चित नहीं है!

EDIT - मैंने यह दिखाने के लिए a short video अपलोड किया है। यह मनोरंजक प्रकार है ...

EDIT 2- यहां a sample single-view app समस्या पर ध्यान केंद्रित कर रहा है।

+0

मुझे लगता है कि सामग्री के साथ ऐसा कुछ हो सकता है जिस दृश्य में आप चित्रित कर रहे हैं। UIViewContentModeRedraw आज़माएं? – kevboh

+0

मैंने इसे 'myImageView' और' drawImage' '(दोनों' UIImageView') के लिए सेट करने का प्रयास किया लेकिन यह काम नहीं किया :(... – tipycalFlow

+0

@kevboh मैंने एक वीडियो अपलोड किया है (और उत्तर में जोड़ा गया है) जो हो सकता है आपको समस्या का बेहतर विचार देता है ... – tipycalFlow

उत्तर

4

मैंने आपकी परियोजना डाउनलोड की और मुझे पता चला कि समस्या ऑटोरेसाइजिंग की है। निम्नलिखित चरणों का यह समाधान होगा:

चरण 1. टिप्पणी लाइन 70:

drawImage.frame = CGRectMake(0, 0, labOrderImgView.frame.size.width, labOrderImgView.frame.size.height); 
अपने touchesMoved विधि में

चरण 2. कोड की एक पंक्ति जोड़े के बाद drawImage alloc एड (लाइन 90) viewDidLoad विधि में है:

drawImage.autoresizingMask = UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight; 

फिर, बग तय हो गई है।

+0

बिल्कुल शानदार ... धन्यवाद आदमी! आप अधिक उत्साह के लायक हैं! – tipycalFlow

1

मैं अगले तरीके से इस तरह व्यवहार लागू किया:

  1. आप अपने पथ (मॉडल) के सभी निर्देशांक याद रखना चाहिए।
  2. छवि दृश्य के अस्थायी सबव्यू में अपना रास्ता बनाएं।
  3. जब उपयोगकर्ता आपकी छवि चुटकी/ज़ूम शुरू करता है - कुछ भी नहीं, यानी आईओएस
  4. द्वारा स्केल किया जाएगा, उस समय जब उपयोगकर्ता चुटकी ज़ूमिंग समाप्त कर चुका है - अपने मॉडल का उपयोग करके सही तरीके से अपना रास्ता दोबारा हटाएं।

यदि आप छवि के रूप में पथ को सहेजते हैं तो आपको परिणामस्वरूप खराब दिखने वाला स्केलिंग मिलता है। इसके अलावा - सीधे छवि पर पथ खींचें - कुछ पारदर्शी दृश्य को खींचें और संपादन के अंत में उन्हें विभाजित करें।

+0

बीटीडब्ल्यू, मैंने आपका मान लिया कोड उदाहरण - और मैं आपको ड्रॉइंग से अलग-अलग पथ को पकड़ने/सहेजने के लिए अनुशंसा करता हूं। इससे आपको कई परेशानियों से बचने में मदद मिल सकती है। मॉडल-व्यू-कंट्रोलर पैटर्न – SVGreg

+0

असल में, खराब परिणाम ज़ूमिंग के दौरान नहीं आते हैं। यह तब होता है जब मैं ** ज़ूम कर रहा हूं कि ** यह अजीबता होती है। बेहतर विचार पाने के लिए प्रश्न में संक्षिप्त वीडियो देखें। – tipycalFlow

+0

हाँ मैंने वीडियो देखा - यह कुछ धुंधला प्रभाव है - सीधे छवि पर पथ नहीं खींचें - कुछ को आकर्षित करें पारदर्शी vie डब्ल्यू और संपादन के अंत में उन्हें एक साथ विभाजित करें। – SVGreg

1

आप हमेशा छवि छवि के आकार को चित्रित करने के लिए चित्रित करते हैं - यह निश्चित रूप से धुंधला हो जाता है, क्योंकि जब आप ज़ूम इन करते हैं तो उच्च रिज़ॉल्यूशन के अनुकूल नहीं होते हैं। इसके बजाय UIBezierPath बनाने के लिए यह अधिक समझदार होगा और touchesMoved विधि में बस इसे एक लाइन जोड़ें (addLineToPoint: के साथ), फिर इसे [bezierPath stroke] के माध्यम से कस्टम drawRect विधि में खींचें। आप छवि दृश्य के सबव्यू के रूप में CAShapeLayer को भी जोड़ सकते हैं और path प्रॉपर्टी को CGPath पर bezierPath की संपत्ति सेट कर सकते हैं जो आपने पहले बनाया था।

उदाहरण के लिए Drawing bezier curves with my finger in iOS? देखें।

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

  • कोई संबंधित समस्या नहीं^_^