2012-04-19 7 views
7

में एक पेंट ऐप के लिए इरेज़र टूल बनाना मैं एक पेंट ऐप बना रहा हूं और मैं जानना चाहता हूं कि इरेज़र टूल को कैसे कार्यान्वित किया जाए। मैं अपने इरेज़र उपकरण को सफेद रंग पेंट करने के लिए नहीं चाहता क्योंकि मैं उपयोगकर्ताओं को पृष्ठभूमि रंग बदलने की अनुमति देना चाहता हूं। और, क्या ब्रश की कठोरता को सेट करना संभव है? यदि हाँ, कृपया मुझे बताएं कि कैसे।आईओएस

धन्यवाद

यहाँ मैं अब तक क्या किया है है:

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event 
{ 
    UITouch *touch = [touches anyObject]; 
    lastPoint = [touch locationInView:self.view]; 
} 

- (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event 
{ 
    UITouch *touch = [touches anyObject]; 
    CGPoint currentPoint = [touch locationInView:self.view]; 
    UIGraphicsBeginImageContext(self.view.frame.size); 
    [drawImage.image drawInRect:CGRectMake(0, 0, self.view.frame.size.width, self.view.frame.size.height)]; 
    CGContextSetLineCap(UIGraphicsGetCurrentContext(), kCGLineCapRound); 
    CGContextSetLineWidth(UIGraphicsGetCurrentContext(), 10); 
    CGContextBeginPath(UIGraphicsGetCurrentContext()); 
    CGContextSetRGBStrokeColor(UIGraphicsGetCurrentContext(), 0.0, 0.0, 0.0, 1.0); 
    CGContextMoveToPoint(UIGraphicsGetCurrentContext(), lastPoint.x, lastPoint.y); 
    CGContextAddLineToPoint(UIGraphicsGetCurrentContext(), currentPoint.x, currentPoint.y); 
    CGContextStrokePath(UIGraphicsGetCurrentContext()); 
    drawImage.image = UIGraphicsGetImageFromCurrentImageContext(); 
    UIGraphicsEndImageContext(); 

    lastPoint = currentPoint; 
} 

- (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event 
{ 
UITouch *touch = [touches anyObject]; 
CGPoint currentPoint = [touch locationInView:self.view]; 
UIGraphicsBeginImageContext(self.view.frame.size); 
[drawImage.image drawInRect:CGRectMake(0, 0, self.view.frame.size.width, self.view.frame.size.height)]; 
CGContextSetLineCap(UIGraphicsGetCurrentContext(), kCGLineCapRound); 
CGContextSetLineWidth(UIGraphicsGetCurrentContext(), 10); 
CGContextBeginPath(UIGraphicsGetCurrentContext()); 
CGContextSetRGBStrokeColor(UIGraphicsGetCurrentContext(), 0.0, 0.0, 0.0, 1.0); 
CGContextMoveToPoint(UIGraphicsGetCurrentContext(), lastPoint.x, lastPoint.y); 
CGContextAddLineToPoint(UIGraphicsGetCurrentContext(), currentPoint.x, currentPoint.y); 
CGContextStrokePath(UIGraphicsGetCurrentContext()); 
drawImage.image = UIGraphicsGetImageFromCurrentImageContext(); 
UIGraphicsEndImageContext(); 

lastPoint = currentPoint; 
} 
- (IBAction)clear:(id)sender { 
drawImage.image = nil; 
} 
+0

यह एक दिलचस्प सवाल यह है कि प्राप्त करने के लिए लिया, लेकिन मुझे लगता है कि आप इसे एक बहुत स्पष्ट कर सकता है। हमें अभी तक बताएं कि आपके पास क्या है; शायद कुछ कोड शामिल करें। – jtbandes

+0

@jtbandes मैंने कोड –

+0

जोड़ा है कृपया इस लिंक को देखें और मेरा उत्तर देखें http://stackoverflow.com/questions/3863931/want-to-add-manual-erasing-option-in-ipad-painting- एप्लिकेशन-बाय-क्वार्ट्ज/12797513 # 12797513 –

उत्तर

13

यहाँ ठीक है कि मैं क्या रबड़ उपकरण के लिए किया था है:

- (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event 
{ 
UITouch *touch = [touches anyObject]; 
CGPoint currentPoint = [touch locationInView:self.view]; 
UIGraphicsBeginImageContext(self.view.frame.size); 
[drawImage.image drawInRect:CGRectMake(0, 0, self.view.frame.size.width, self.view.frame.size.height)]; 

// I add this 
CGContextSetBlendMode(UIGraphicsGetCurrentContext(), kCGBlendModeClear); 

CGContextSetLineCap(UIGraphicsGetCurrentContext(), kCGLineCapRound); 
CGContextSetLineWidth(UIGraphicsGetCurrentContext(), sizeSlider.value); 
CGContextBeginPath(UIGraphicsGetCurrentContext()); 
CGContextSetBlendMode(UIGraphicsGetCurrentContext(), kCGBlendModeClear); 
CGContextMoveToPoint(UIGraphicsGetCurrentContext(), lastPoint.x, lastPoint.y); 
CGContextAddLineToPoint(UIGraphicsGetCurrentContext(), currentPoint.x, currentPoint.y); 

CGContextStrokePath(UIGraphicsGetCurrentContext()); 
drawImage.image = UIGraphicsGetImageFromCurrentImageContext(); 
UIGraphicsEndImageContext(); 
lastPoint = currentPoint; 
} 
+3

बहुत बहुत धन्यवाद। यह कमाल काम करता है। मैं इसे बहुत लंबे समय से खोज रहा हूं। –

+0

आपको बहुत बहुत धन्यवाद :) – iRiziya

4

मैं पेंट आवेदन करने के लिए है और यह आइट्यून्स "आराम से डूडल" अनुप्रयोग पर उपलब्ध है। इरेज़र के लिए कोई विशेष तर्क नहीं है। बस पृष्ठभूमि छवि के आरजीबी मूल्य प्राप्त करें और इसे

CGContextSetRGBStrokeColor(UIGraphicsGetCurrentContext(),R value,G value,B value, 1.0); 

चयनित पृष्ठभूमि छवि के अनुसार पास करें।

+0

@mat hi .. अगर हम पेंट के लिए कस्टम UIView बनाते हैं तो क्या हम बिना मेहेड के पेंट कर सकते हैं? – Hitarth

+0

शायद आप रॉक से पूछना चाहते थे, लेकिन मुझे ऐसा नहीं लगता है, अगर आपके पास कस्टम यूआईवी व्यू है तो आपको प्रत्येक बार जब आप इसे संशोधित करना चाहते हैं तो दृश्य को आकर्षित करने के लिए आपको setNeedsDiplay को कॉल करने की आवश्यकता है। अन्यथा, मेरी पुरानी [समान प्रतिक्रिया] पर एक नज़र डालें (http://stackoverflow.com/a/10667557/251513)। – Mat

+1

यह सही उत्तर नहीं है। सही उत्तर नीचे दिए गए वोटों के साथ एक है। ऐप्पल को इरेज़र फ़ंक्शन में बनाया गया है जो कोड की एक पंक्ति है। यह उत्तर वास्तव में मिटा भी नहीं आता है, यह छवि के लिए बस "पेंट" जोड़ता है, बस उसी रंग के नीचे पिक्सेल (पृष्ठभूमि छवि) के रूप में। वास्तव में मिटा नहीं रहा है (विशेष रूप से यदि पृष्ठभूमि छवि बदलती है) और बहुत अधिक डेटा भारी है। –

1

ठीक है तो:
CGContextSetBlendMode(UIGraphicsGetCurrentContext(), kCGBlendModeClear);

तो कोड कुछ इस तरह कुछ हो जाएगा:
मैं कोड की इस पंक्ति को जोड़ने मैं एक हफ्ते के लिए इरेज़र बनाने के तरीके पर एक समाधान की तलाश कर रहा हूं, मुझे जिस तरह से मैंने देखा था उसे बदलना पड़ा, इससे कोई फर्क नहीं पड़ता कि मैंने कितनी बार मिटाने की कोशिश की, यह पृष्ठभूमि छवि को भी मिटा देगा।

हालांकि, अंत में मुझे एक समाधान मिला जो मुझे उपयुक्त बनाता है (जहां मैं पेंट मिटा सकता हूं और अभी भी पृष्ठभूमि छवि की धारणा छूटे या मिटाई जा रही है) और उम्मीद है कि इससे दूसरों की मदद मिलेगी। तो यहां आता है ...

1) UIView 2) में 2 imageviews बनाएं पृष्ठभूमि छवि है कि आप इसे होना चाहते हैं के साथ दोनों imageviews सेट करें ... 3) मैं अगर निर्धारित करने के लिए एक सेगमेंट में बंटे नियंत्रण बनाया उपयोगकर्ता को मिटाने के लिए 4) जोड़ा निम्नलिखित समारोह जब सेगमेंट में बंटे नियंत्रण चयनित किया जा रहा है ..

func drawLineForRubber(fromPoint: CGPoint, toPoint: CGPoint) { 

    // 1 
    UIGraphicsBeginImageContext(view.frame.size) 
    let context = UIGraphicsGetCurrentContext() 
    mainImageView.image?.drawInRect(CGRect(x: 0, y: 0, width: view.frame.size.width, height: view.frame.size.height)) 

    // 2 
    CGContextMoveToPoint(context, fromPoint.x, fromPoint.y) 
    CGContextAddLineToPoint(context, toPoint.x, toPoint.y) 

    // 3 
    CGContextSetBlendMode(context, CGBlendMode.Clear) 
    CGContextSetLineCap(context, CGLineCap.Round) 
    CGContextSetLineWidth(context, 10.0) 
    //this line is very important as it paints the screen clear 
    CGContextSetRGBStrokeColor(context, red, green, blue, 0.0) 
    CGContextSetBlendMode(context, CGBlendMode.Clear) 

    // 4 
    CGContextStrokePath(context) 

    // 5 
    mainImageView.image = UIGraphicsGetImageFromCurrentImageContext() 
    mainImageView.alpha = opacity 
    UIGraphicsEndImageContext() 

} 

तुम वहाँ में एक पंक्ति 0.0 के मूल्य के साथ CGContextSetRGBStrokeColor सेट है कि वहाँ देखेंगे के रूप में करना चाहता था, यह महत्वपूर्ण कारण है जब उपयोगकर्ता पेंट मिटा रहा है, तो वह पेंट के साथ एक पेंटपेरेंट कोलो के साथ शीर्ष छविदृश्य से पेंट मिटा रहा है आर। हालांकि, चूंकि आपके पास इसके नीचे एक और छविदृश्य है, इसलिए धारणा यह है कि ऐसा लगता है कि यह पृष्ठभूमि छवि को प्रभावित किए बिना बाहर रगड़ रहा है।

इसके विपरीत यह रगड़ गया है लेकिन पीछे की छविदृश्य, ऐसा लगता है कि यह ऐसा नहीं है। जब आप छवि को निर्यात करना चाहते हैं (आप इसे कई तरीकों से कर सकते हैं लेकिन मैं निम्नलिखित के साथ गया) आपने पृष्ठभूमि छवि के साथ चित्रित किया है, बस के रूप में दोनों छवि दृश्यों को गठबंधन करें, पहली छविदृश्य में आपके द्वारा चित्रित पेंट होगा और दूसरी छविदृश्य में मूल पृष्ठभूमि छवि होगी जो आप चाहते थे।

func share() { 

    let layer = UIApplication.sharedApplication().keyWindow!.layer 
    let scale = UIScreen.mainScreen().scale 
    UIGraphicsBeginImageContextWithOptions(layer.frame.size, false, scale); // reconsider size property for your screenshot 

    layer.renderInContext(UIGraphicsGetCurrentContext()!) 
    let screenshot = UIGraphicsGetImageFromCurrentImageContext() 
    UIGraphicsEndImageContext() 


    UIGraphicsBeginImageContext(mainImageView.bounds.size) 
    mainImageView.image?.drawInRect(CGRect(x: 0, y: 0, 
     width: mainImageView.frame.size.width, height: mainImageView.frame.size.height)) 

    UIGraphicsEndImageContext() 

    let activity = UIActivityViewController(activityItems: [screenshot], applicationActivities: nil) 
    presentViewController(activity, animated: true, completion: nil) 
} 

आशा इस रास्ते में दूसरों में मदद करता है .. आदमी यह मेरे उम्र के आसपास मेरे सिर =)