टच

2012-02-03 15 views
5

मैं अपने imageView (नीचे दिए गए कोड में maskPreview) में कार्यक्षमता बढ़ रहा है जिससे कि उपयोगकर्ता, एक तस्वीर है, जो maskPreview में निहित है स्थानांतरित कर सकते हैं स्क्रीन के चारों ओर बनाने के लिए कोशिश कर रहा हूँ के साथ एक UIImageView स्थानांतरित करने के लिए कैसे। यहाँ स्पर्श के लिए मेरे कोड शुरू है और स्पर्श ले जाया गया:टच

-(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event 
{ 
if ([touches count]==1) { 
    UITouch *touch= [touches anyObject]; 
    originalOrigin = [touch locationInView:maskPreview]; 
} 
} 
-(void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event 
{ 
if ([touches count]==1) { 
    UITouch *touch = [touches anyObject]; 
    CGPoint lastTouch = [touch previousLocationInView:self.view]; 
    CGFloat movedDistanceX = originalOrigin.x-lastTouch.x; 
    CGFloat movedDistanceY = originalOrigin.y-lastTouch.y; 
    [maskPreview setFrame:CGRectMake(maskPreview.frame.origin.x+movedDistanceX, maskPreview.frame.origin.y + movedDistanceY, maskPreview.frame.size.width, maskPreview.frame.size.height)]; 
} 
} 

लेकिन मैं app से कुछ अजीब प्रतिक्रियाओं हो रही है। मैंने इस बात पर प्रतिबंध नहीं लगाया है कि छविदृश्य कितनी दूर जा सकता है, यानी इसे स्क्रीन से बाहर जाने से रोकने के लिए, लेकिन यदि यह एक छोटा कदम है, तो भी मेरी छविदृश्य जंगली हो जाती है और गायब हो जाती है।

बहुत सभी मदद

उत्तर

9

touchesBegan और इतने पर लागू करने के लिए अग्रिम धन्यवाद इस आधुनिक दुनिया में जिस तरह से overkill है। आप केवल अपने आप से बिल्ली को भ्रमित कर रहे हैं, और आपका कोड जल्दी से समझने या बनाए रखने के लिए असंभव हो जाएगा। UIPanGestureRecognizer का उपयोग करें; यही वह है जो इसके लिए है। UIPanGestureRecognizer के साथ ड्रैग करने योग्य दृश्य बनाना छोटा है।

- (void) dragging: (UIPanGestureRecognizer*) p { 
    UIView* vv = p.view; 
    if (p.state == UIGestureRecognizerStateBegan || 
     p.state == UIGestureRecognizerStateChanged) { 
     CGPoint delta = [p translationInView: vv.superview]; 
     CGPoint c = vv.center; 
     c.x += delta.x; c.y += delta.y; 
     vv.center = c; 
     [p setTranslation: CGPointZero inView: vv.superview]; 
    } 
} 
+0

बहुत बढ़िया मैट, आप एक पूर्ण प्रतिभाशाली हैं !! आपके जवाब को रेट किया होगा लेकिन मेरे पास पर्याप्त प्रतिष्ठा नहीं है !! मेरे जीवन को इतना आसान बना दिया !! – Septronic

+0

बस एफवाईआई, वह कोड सीधे मेरी पुस्तक से बाहर आया: http://shop.oreilly.com/product/0636920023562.do - वह और कहां से आया था ... – matt

+0

भयानक, मैं इसे देख लूँगा :) धन्यवाद – Septronic

2

अपने कोड के साथ दो समस्याएं हैं: यहाँ दृश्य खींचने योग्य बनाता है कि एक UIPanGestureRecognizer के लिए कार्रवाई हैंडलर है। सबसे पहले, इस लाइन गलत है:

CGPoint lastTouch = [touch previousLocationInView:self.view]; 

यह इस होना चाहिए:

CGPoint lastTouch = [touch previousLocationInView:maskPreview]; 

वास्तव में, तुम भी previousLocationInView: नहीं का उपयोग करना चाहिए। तुम सिर्फ इस तरह locationInView: का उपयोग कर किया जाना चाहिए:

CGPoint lastTouch = [touch locationInView:maskPreview]; 

दूसरे, आप movedDistanceX और movedDistanceY गलत के संकेत मिल रहे हैं। उन्हें इस में बदलें:

आप super बुला (एक आम उपयोग पैटर्न) के बिना इस पद्धति को ओवरराइड, तो आप भी ओवरराइड चाहिए के लिए अन्य तरीकों:

CGFloat movedDistanceX = lastTouch.x - originalOrigin.x; 
CGFloat movedDistanceY = lastTouch.y - originalOrigin.y; 

इसके अलावा, touchesBegan:withEvent: के लिए दस्तावेज़ इस कहते हैं हैंडलिंग टच इवेंट, अगर केवल स्टब (एम्पी) कार्यान्वयन के रूप में।

तो सुनिश्चित करें कि आप touchesEnded:withEvent: और touchesCancelled:withEvent: ओवरराइड कर रहे हैं।

वैसे भी, आप इस पास बहुत-सी बस कर सकते हैं। एक तरीका touchesBegan:withEvent: खाली बनाना है और में previousLocationInView: और locationInView: दोनों का उपयोग करके और maskPreview.frame के बजाय maskPreview.center अपडेट करके सभी काम करें।

-(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event 
{ 
} 

-(void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event 
{ 
    if ([touches count]==1) { 
     UITouch *touch = [touches anyObject]; 
     CGPoint p0 = [touch previousLocationInView:maskPreview]; 
     CGPoint p1 = [touch locationInView:maskPreview]; 
     CGPoint center = maskPreview.center; 
     center.x += p1.x - p0.x; 
     center.y += p1.y - p0.y; 
     maskPreview.center = center; 
    } 
} 

यह करने के लिए एक और तरीका है एक UIPanGestureRecognizer का उपयोग करना है: तुम भी originalOrigin उदाहरण चर जरूरत नहीं होगी। मैं इसे पाठक के लिए एक अभ्यास के रूप में छोड़ देता हूं।

+0

हाय रोब, उत्तर के लिए धन्यवाद, और मेरे कोड में गलतियों को महसूस किया !! मैंने UIPanGestureRecognizer के लिए मैट के ट्यूटोरियल का उपयोग किया, और यह एक इलाज किया। लेकिन सभी स्पर्श घटनाओं के ऊपर सवार होने के बारे में थोड़ा सा मदद थी, मुझे नहीं पता था और नहीं सोचा था कि हमें ऐसा करना चाहिए। – Septronic