2013-02-01 12 views
7

पर प्रतिक्रिया नहीं देगा मैं आईफोन के लिए एक उद्देश्य-सी प्रोग्राम लिख रहा हूं।UILongPressGestureRecognizer स्पर्श और होल्ड

मैं UILongPressGestureRecognizer को लागू करने की कोशिश कर रहा हूं और इसे जिस तरीके से मैं चाहता हूं उसे व्यवहार करने के लिए नहीं मिल सकता।

मुझे क्या करनाचाहते सरल है: एक स्पर्श होने के

जवाब आयोजित स्क्रीन पर नीचे।

UILongPressGestureRecognizer जब भी स्पर्श चलता है और स्पर्श शुरू होता है तो ठीक काम करता है लेकिन यदि मैं उसी स्थान पर स्पर्श को दबाता हूं, तो कुछ नहीं होता है।

क्यों?

मैं एक स्पर्श शुरू करने, आगे बढ़ने, और एक ही स्थान पर रहने के लिए कैसे स्पर्श कर सकता हूं?

मेरा वर्तमान कोड यहां है।


// Configure the press and hold gesture recognizer 
touchAndHoldRecognizer = [[UILongPressGestureRecognizer alloc] initWithTarget:self action:@selector(touchAndHold:)]; 
touchAndHoldRecognizer.minimumPressDuration = 0.1; 
touchAndHoldRecognizer.allowableMovement = 600; 
[self.view addGestureRecognizer:touchAndHoldRecognizer]; 
+0

// प्रेस कॉन्फ़िगर करें और इशारा पहचानकर्ता स्पर्श करें &HoldRecognizer = [[UILongPressGestureRecognizer alloc] initWithTarget: self action: @selector (touchAndHold :)]; touchAndHoldRecognizer.minimumPressDuration = 0.1; touchAndHoldRecognizer.allowableMovement = 600; [self.view addGestureRecognizer: touchAndHoldRecognizer]; –

+0

मेरा बिंदु बिल्कुल। यदि आप हिलते नहीं हैं तो आपको बार-बार ईवेंट नहीं मिलते हैं। यही वह है जिसे मैं ठीक करने की कोशिश कर रहा हूं। क्या आप एक ऐसी विधि के बारे में जानते हैं जिसके साथ मैं स्थानांतरित नहीं करता हूं, यदि मैं नहीं चलता हूं? –

+2

इसे फिर से खोलना चाहिए क्योंकि यदि आप इस सवाल पर सावधानी से देखते हैं, तो यह नहीं पूछ रहा है कि "मैं एक लंबी प्रेस इशारा कैसे करूं", बल्कि "अब मुझे लंबे प्रेस इशारे के बीच में सूचनाएं मिलती हैं, यहां तक ​​कि हालांकि मैं हिल नहीं रहा हूं। " यह उस दूसरे प्रश्न का डुप्लिकेट नहीं है। – Rob

उत्तर

12

व्यवहार आप का वर्णन है, जहाँ आपके इशारे पहचानकर्ता अपने हैंडलर जब आप नहीं जा रहे करने के लिए आगे कॉल प्राप्त नहीं करता है मानक व्यवहार है। state आपके द्वारा चलाए जाने वाले इशारे के लिए संपत्ति UIGestureRecognizerStateChanged है, इसलिए यह समझ में आता है कि यदि चीजें नहीं बदली हैं, तो आपके हैंडलर को नहीं बुलाया जाएगा।

आप कर सकते थे

  • UIGestureRecognizerStateBegan एक दोहराई टाइमर प्रारंभ की state के साथ अपने इशारे पहचानकर्ता करने के लिए कॉल करने पर;
  • stateUIGestureRecognizerStateCancelled, UIGestureRecognizerStateFailed, या UIGestureRecognizerStateEnded, invalidate के साथ अपने इशारा पहचानकर्ता को कॉल पर और टाइमर जारी करें;
  • यकीन है कि इशारा पहचानकर्ता विधि की बचत है आप जो भी मान कुछ वर्ग संपत्ति में ढूँढ रहे हैं शायद कुछ की तरह (जैसे locationInView का मूल्य या जो कुछ भी)

तो, बनाओ:

@interface ViewController() 

@property (nonatomic) CGPoint location; 
@property (nonatomic, strong) NSTimer *timer; 

@end 

@implementation ViewController 

- (void)viewDidLoad 
{ 
    [super viewDidLoad]; 

    UILongPressGestureRecognizer *gesture = [[UILongPressGestureRecognizer alloc] initWithTarget:self action:@selector(handleGesture:)]; 
    gesture.minimumPressDuration = 0.1; 
    gesture.allowableMovement = 600; 
    [self.view addGestureRecognizer:gesture]; 
} 

- (void)handleTimer:(NSTimer *)timer 
{ 
    [self someMethod:self.location]; 
} 

- (void)handleGesture:(UIGestureRecognizer *)gesture 
{ 
    self.location = [gesture locationInView:self.view]; 

    if (gesture.state == UIGestureRecognizerStateBegan) 
    { 
     self.timer = [NSTimer scheduledTimerWithTimeInterval:0.1 target:self selector:@selector(handleTimer:) userInfo:nil repeats:YES]; 
    } 
    else if (gesture.state == UIGestureRecognizerStateCancelled || 
      gesture.state == UIGestureRecognizerStateFailed || 
      gesture.state == UIGestureRecognizerStateEnded) 
    { 
     [self.timer invalidate]; 
     self.timer = nil; 
    } 

    [self someMethod:self.location]; 
} 

- (void)someMethod:(CGPoint)location 
{ 
    // move whatever you wanted to do in the gesture handler here. 

    NSLog(@"%s", __FUNCTION__); 
} 

@end 
+0

... मुझे लगता है कि मैं इसे प्राप्त करना शुरू कर रहा हूं। मेरी समस्या यह थी कि, मैं एप्पल की पद्धति को समझ नहीं पाया था कि वे स्पर्श से कैसे निपटते हैं। मुझे लगता है कि मैं जवाब के लिए इंटरनेट को 4 घंटे बिताता हूं और तेजी से निराश होने का कारण यह है कि मैं इस बिंदु को याद कर रहा था।आपने मुझे इस रोब को देखने में मदद की। कोको में "हैंडल टच्स रिमेन्टेडस्टेशनरी" जैसी कोई विधि नहीं है क्योंकि यदि कोई स्पर्श समाप्त नहीं हुआ है, और स्थानांतरित नहीं हुआ है ... तो __ जाहिर है यह यह वही बना रहा है। आप बस अपने निष्पादन पाश में पुनरावृत्ति जारी रख सकते हैं। धन्यवाद, रोब! –

+0

@ जे-रॉक कूल। आपका कार्यान्वयन भिन्न हो सकता है (उदाहरण के लिए, आप एक इशारा पर टाइमर रीसेट कर सकते हैं, इसलिए यदि आप आगे बढ़ रहे हैं तो आपको टाइमर कॉल नहीं मिलती हैं), लेकिन आपको विचार मिलता है। एफवाईआई, मैंने अपना कोड थोड़ा सा सरल बना दिया। – Rob

+0

@ जे-रॉक और एक अंतिम अवलोकन, जिसे मैंने पहले बताया था। यदि आप लगातार स्पर्श करना चाहते हैं जो स्क्रीन को छूने के बाद बहुत तेज़ी से शुरू होता है और जब आप घूमते हैं, तब भी जारी रहता है, तो आप 'UIPanGestureRecognizer' का उपयोग करना चाहेंगे। यदि यह आपके लिए काम करता है, तो यह अधिक समझ में आता है। अधिकांश प्रोग्रामर लंबे प्रेस इशारा पहचानकर्ता के उपयोग से गुमराह हो जाएंगे जो 600 अंकों के आंदोलन की अनुमति देता है। यदि आपको किसी कारण से लंबी प्रेस का उपयोग करना है (उदाहरण के लिए, शुरुआत में 0.1 की प्रतीक्षा करना महत्वपूर्ण है), इसका उपयोग अन्यथा, 'यूआईपीएनजेस्टर रिकॉग्नाइज़र' पर विचार करें। – Rob

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