ios - पर्यवेक्षक के इशारे को आईओएस 7 में सबव्यू के इशारे को रद्द करना चाहिए?



ios7 uigesturerecognizer (1)

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

मैंने पहली बार इस समस्या को ऐसे बटन के रूप में अनुभव किया था जो कि UITapGestureRecognizer का उपयोग नहीं किया जा सकता ... फिर से, बहुत कम ही आमतौर पर बटन तब तक काम करते थे जब तक कि वे नहीं करते थे। आपने अपने विवेक के बारे में प्रश्न किया इसलिए मैंने अपना खुद का TapGestureRecognizer लुढ़का TapGestureRecognizer और पता चला कि TapGestureRecognizer नल एक बार अपने TapGestureRecognizer नल को रद्द कर रहे थे। यह आईओएस के किसी भी पिछले संस्करण में ऐसा कभी नहीं हुआ है, लेकिन मैं सोच रहा हूं कि यह व्यवहार केवल वादा नहीं किया गया था।

मैंने सोचा था कि उपव्यू के इशारे को इसे पर्यवेक्षण के इशारे को रद्द करना चाहिए था (जब तक कि किसी प्रतिनिधि द्वारा निर्दिष्ट नहीं किया गया हो)। क्या यह गलत है या क्या यह एक बग है?

कृपया ध्यान दें: मैं यह नहीं पूछ रहा हूं कि कैसे स्थिति को संभालना है। मैं पूछ रहा हूं कि क्या कोई जानता है कि मेरी धारणा गलत है या नहीं मैं पहले से ही विचारों को पुनर्व्यवस्थित कर रहा हूं, गतिशील रूप से जोड़ना / निकालने और इशारा के जटिल कार्यान्वयन का उपयोग कर रहा gestureRecognizer:shouldReceiveTouch: स्थिति का समाधान करना। यह मजेदार नहीं है, लेकिन मैं समस्या के आसपास काम कर सकता हूं।


बहुत सारे खोजों के बाद मुझे एप्पल के संदेश बोर्डों पर अन्य उपयोगकर्ताओं के साथ चर्चा हुई, जिनके पास यह समस्या हो रही है: यूआईटीएपी गैस्ट्रररेक्कीजर के साथ मुद्दे (डेवलपर खाता आवश्यक) मैं आगे चला गया और एक बग रिपोर्ट सबमिट की: 15331126 (क्या किसी को बग रिपोर्ट से लिंक करने का तरीका पता है?) । इस दौरान, मैंने इस समाधान को कार्यान्वित किया। अब तक यह काम कर रहा है, लेकिन चूंकि बग बहुत दुर्लभ है, मैं अभी तक इसे ट्रिगर नहीं कर सकता मैं इसे अपने बीटा उपयोगकर्ताओं को जारी कर रहा हूं और अगर मुझे उनसे कोई शिकायत नहीं मिली है (जो शिकायत कर रहे हैं) तो मैं इस समस्या को हल करता हूँ

अद्यतनः इस समाधान ने समस्या तय की है दर्जनों उपयोगकर्ताओं द्वारा उपयोग किए जाने वाले सप्ताहों के बाद मुझे इशारों के साथ कोई समस्या नहीं हुई है।

मेरे इशारों के अधिकांश कस्टम हैं मैंने उन्हें स्वयं के प्रतिनिधियों के रूप में परिवर्तित किया और कार्यान्वित किया:

- (BOOL) gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldBeRequiredToFailByGestureRecognizer:(UIGestureRecognizer *)otherGestureRecognizer{
    if (gestureRecognizer == self){
        if ([otherGestureRecognizer isMemberOfClass:self.class]){
            if ([self isGestureRecognizerInSuperviewHierarchy:otherGestureRecognizer]){
                return YES;
            } else if ([self isGestureRecognizerInSiblings:otherGestureRecognizer]){
                return YES;
            }
        }
    }
    return NO;
}

ध्यान दें कि मेरा कस्टम इशारेरकारकर्ता UIGestureRecognizerDelegate प्रोटोकॉल को कार्यान्वित करते हैं (सार्वजनिक रूप से, आपके कारण नीचे देखेंगे) मैंने कुछ श्रेणियों को भी यूआईजेस्टेररेक्ननाइज़र (ऊपर दिए गए कोड में) में जोड़ा है:

- (BOOL) isGestureRecognizerInSiblings:(UIGestureRecognizer *)recognizer{
    UIView *superview = self.view.superview;
    NSUInteger index = [superview.subviews indexOfObject:self.view];
    if (index != NSNotFound){
    for (int i = 0; i < index; i++){
            UIView *sibling = superview.subviews[i];
            for (UIGestureRecognizer *viewRecognizer in sibling.gestureRecognizers){
                if (recognizer == viewRecognizer){
                    return YES;
                }
            }
        }
    }
    return NO;
}
- (BOOL) isGestureRecognizerInSuperviewHierarchy:(UIGestureRecognizer *)recognizer{
    if (!recognizer) return NO;
    if (!self.view) return NO;
    //Check siblings
    UIView *superview = self.view;
    while (YES) {
        superview = superview.superview;
        if (!superview) return NO;
        for (UIGestureRecognizer *viewRecognizer in superview.gestureRecognizers){
            if (recognizer == viewRecognizer){
                return YES;
            }
        }
    }
}

मुझे पूरी तरह यकीन नहीं है कि मुझे भाई-बहनों की जांच करने की ज़रूरत है क्योंकि मैंने केवल देखा है कि पर्यवेक्षण इशारों के साथ यह समस्या सामने आई है। हालांकि, मैं यह मौका नहीं लेना चाहता था। ध्यान दें कि मैं केवल वर्तमान भाइयों के लिए "नीचे" की जांच करता हूं क्योंकि वर्तमान दृश्य में "उपरोक्त" दृश्य इशारों को रद्द नहीं करना चाहता।

मुझे ऐसे क्लासेस के लिए कार्यान्वयन जोड़ना पड़ा, जो स्वयं को कस्टम पहचानकर्ता के प्रतिनिधियों के रूप में स्थापित करते हैं, लेकिन वे बहुत ज्यादा सिर्फ इशारे पर वापस कॉल करते हैं।

- (BOOL) gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldBeRequiredToFailByGestureRecognizer:(UIGestureRecognizer *)otherGestureRecognizer{
    if ([gestureRecognizer respondsToSelector:@selector(gestureRecognizer:shouldBeRequiredToFailByGestureRecognizer:)]){
        return [(id <UIGestureRecognizerDelegate>)gestureRecognizer gestureRecognizer:gestureRecognizer shouldBeRequiredToFailByGestureRecognizer:otherGestureRecognizer];
    }
    return NO;
}

उम्मीद है कि इस समस्या से किसी और को मदद मिलेगी।





touch-event