2010-01-02 18 views
8

काफी आम सवाल है, जिसके लिए मेरे पास कुछ जवाब हैं और मैं लगभग वहां हूं। मैं एक बटन है जो जब दबाया, एक छवि (कोड इस प्रकार) का निर्माण करेगा हैUIImage का पता लगाने और खींचने

(numImages शून्य करने के लिए लोड पर सेट किया गया है और बनाए गए सभी छवियों का टैग संख्या के लिए गिनती के रूप में प्रयोग किया जाता है)

UIImage *tmpImage = [[UIImage imageNamed:[NSString stringWithFormat:@"%i.png", sender.tag]] retain]; 
UIImageView *myImage = [[UIImageView alloc] initWithImage:tmpImage]; 

numImages += 1; 

myImage.userInteractionEnabled = YES; 
myImage.tag = numImages; 
myImage.opaque = YES; 
[self.view addSubview:myImage]; 
[myImage release]; 

तब मेरे पास स्पर्श होता है, जो कि पता लगाता है कि क्या स्पर्श किया गया है। मुझे यह करने की ज़रूरत है कि उपयोगकर्ता को नव निर्मित छवि को खींचने दें। यह लगभग काम कर रहा है, लेकिन जब आप इसे खींचते हैं तो छवि पूरी जगह पर झिलमिलाहट करती है। मैं जिस छवि पर क्लिक करता हूं उसे एक्सेस कर सकता हूं क्योंकि मैं इसे TAG प्राप्त कर सकता हूं, लेकिन मैं इसे अच्छी तरह से खींच नहीं सकता हूं।

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

    UITouch *touch = [[event allTouches] anyObject]; 
    CGPoint location = [touch locationInView:touch.view]; 

    if (touch.view.tag > 0) { 
     touch.view.center = location; 
    } 

    NSLog(@"tag=%@", [NSString stringWithFormat:@"%i", touch.view.tag]); 

} 

- (void) touchesMoved:(NSSet *)touches withEvent: (UIEvent *)event { 
    [self touchesBegan:touches withEvent:event]; 
} 

यह काम करता है, के रूप में मैं उन पर क्लिक करें कि में मैं प्रत्येक छवि के लिए टैग का उत्पादन मिलता है। लेकिन जब मैं खींचता हूं, तो यह चमकता है ... कोई विचार?

उत्तर

34

मेरे अपने प्रश्न के उत्तर में - मैंने दृश्यों को संभालने के लिए कक्षा बनाने का निर्णय लिया।

कोड अगर कोई रुचि है ....

Draggable.h

#import <Foundation/Foundation.h> 
@interface Draggable : UIImageView { 
    CGPoint startLocation; 
} 
@end 

Draggable.m

#import "Draggable.h" 
@implementation Draggable 

- (void) touchesBegan:(NSSet*)touches withEvent:(UIEvent*)event { 
    // Retrieve the touch point 
    CGPoint pt = [[touches anyObject] locationInView:self]; 
    startLocation = pt; 
    [[self superview] bringSubviewToFront:self]; 
} 
- (void) touchesMoved:(NSSet*)touches withEvent:(UIEvent*)event { 
    // Move relative to the original touch point 
    CGPoint pt = [[touches anyObject] locationInView:self]; 
    CGRect frame = [self frame]; 
    frame.origin.x += pt.x - startLocation.x; 
    frame.origin.y += pt.y - startLocation.y; 
    [self setFrame:frame]; 
} 
@end 

और यह उत्तर के लिए

UIImage *tmpImage = [[UIImage imageNamed:"test.png"] retain]; 
UIImageView *imageView = [[UIImageView alloc] initWithImage:tmpImage]; 

CGRect cellRectangle; 
cellRectangle = CGRectMake(0,0,tmpImage.size.width ,tmpImage.size.height); 
UIImageView *dragger = [[Draggable alloc] initWithFrame:cellRectangle]; 
[dragger setImage:tmpImage]; 
[dragger setUserInteractionEnabled:YES]; 

[self.view addSubview:dragger]; 
[imageView release]; 
[tmpImage release]; 
+4

उपरोक्त कोड http://www.iphoneexamples.com/ –

+0

से पोस्ट करने के लिए धन्यवाद, लेकिन ऐसा करने के दौरान मुझे जिटर प्रभाव मिल रहा है, इसे कैसे टाला जा सकता है? – itsaboutcode

+0

धन्यवाद आदमी! एक आकर्षण की तरह काम कर रहा हूँ :) – soupdiver

1

आमतौर पर जब आप center बदलते हैं तो आपको एक निहित एनीमेशन मिलता है। क्या आप -contentMode के साथ गड़बड़ कर रहे हैं या किसी भी मौके से -setNeedsDisplay पर कॉल कर रहे हैं?

आप स्पष्ट रूप से एनीमेशन का अनुरोध हटाने से बचने के लिए और इस तरह से फिर से आकर्षित कर सकते हैं:

if (touch.view.tag > 0) { 
    [UIView beginAnimations:@"viewMove" context:touch.view]; 
    touch.view.center = location; 
    [UIView commitAnimations]; 
} 

कि NSLog() बहुत धीमी गति से (बहुत धीमी की तुलना में आप उम्मीद थी हो सकता है ध्यान दें करो, यह बहुत एक से अधिक जटिल है सरल printf), और इससे touchesMoved:withEvent: जितनी बार किसी चीज में परेशानी हो सकती है।

बीटीडब्ल्यू, आप tmpImage लीक कर रहे हैं।

+0

धन्यवाद कॉल करने के लिए । मैंने आपके द्वारा सुझाए गए प्रयासों की कोशिश की है और यह अभी भी होता है। मुझे लगता है कि यह छवि सेट करने के लिए उपयोग किए जा रहे कोड के साथ कुछ करना है? जब मैं इंटरफेस बिल्डर में दृश्य पर एक छवि डालता हूं और इसे .h फ़ाइल में एक आईबीओटलेट UIImageView के रूप में सेट करता हूं, जो पूरी तरह से घूमता है। क्या मैं अपनी प्रत्येक छवि को सेट करते समय कुछ याद कर रहा हूं ?? (पीएस) tmpImage टिप के लिए धन्यवाद - उसको याद किया! –

+0

मैंने सोचा कि यह टैग के साथ एक समस्या हो सकती है .. लेकिन अब मुझे लगता है कि यह विचारों के साथ एक मुद्दा हो सकता है। जब मैं कोड के पहले बिट का उपयोग कर छवि डालता हूं, तो यह 0,0 पर जाता है। ऐसा लगता है कि जब मैं इसे खींचता हूं तो यह हमेशा वहां वापस जाना चाहता है। तो यह झटके का कारण बन रहा है। वर्तमान स्थिति, फिर यह वहां वापस चली गई .... यह मुझे पागल कर रही है! –

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