2017-11-04 22 views
5

मैं एक ओवरले बना रहा हूं जिसमें स्क्रीन पर सभी प्रदर्शित दृश्य शामिल होंगे। यह ओवरले हमेशा rootViewController परिवर्तन, धक्का देने या प्रस्तुत करने के मामले में भी प्रकट होता है।एक ओवरले के साथ UIAppDelegate की विंडो को कवर करने से उपयोगकर्ता UIActivityViewController के एक्सटेंशन को स्पर्श नहीं कर सकता है जब यह प्रदर्शित होता है

मेरा विचार

  • CustomWindow जो UIWindow का एक उपवर्ग है बनाएं है। इसके बाद के साथ UIApplication के डिफ़ॉल्ट window को प्रतिस्थापित करने के बाद, मेरी नई विंडो के लिए एक नया rootViewController बनाएं।
  • CustomWindow में, मेरे पास overlay है (UIView है)। Overlay में अल्फा के साथ हल्के भूरे रंग का रंग है और overlay पर प्रत्येक ईवेंट नीचे देखने के लिए पारित किया जाएगा।
  • जब भी CustomWindow एक नया सबव्यू जोड़ें, तो मैं आगे overlay लाऊंगा। यह सुनिश्चित करता है कि हर मामले में overlay शीर्ष पर होगा।

CustomWindow

@implementation CustomWindow 

- (instancetype)initWithFrame:(CGRect)frame { 
    self = [super initWithFrame:frame]; 

    if (self) { 
    _overlay = [[UIView alloc] initWithFrame:self.bounds]; 
    _overlay.userInteractionEnabled = NO; 
    _overlay.backgroundColor = [UIColor lightGrayColor]; 
    _overlay.autoresizingMask = UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight; 
    [self addSubview:_overlay]; 
    } 

    return self; 
} 

- (void)didAddSubview:(UIView *)subview { 
    [super didAddSubview:subview]; 

    [self bringSubviewToFront:_overlay]; 
} 

@end 

सब कुछ, यहां तक ​​कि जब धक्का पेश या rootViewController बदलते हर मामले में ठीक काम करता है।

समस्या

लेकिन जब मैं एक UIActivityViewController दिखाने के लिए, मैं किसी भी एक्सटेंशन जो UIActivityViewController पर प्रदर्शित किए जाते हैं पर क्लिक नहीं कर सकते हैं।

जादुई ढंग से

  • जब मैं UIActivityViewController के बाहर क्लिक करें या Cancel Button पर क्लिक करें, UIActivityViewController सामान्य रूप से खारिज कर दिया है।

  • यदि मैं overlay से clearColor का रंग बदलता हूं, तो यह भी ठीक काम करता है।

मेरा प्रश्न

  • जब मैं खिड़की पर overlay है और overlay एक रंग है कैसे मैं एक्सटेंशन पर छू सकता है?

  • यदि मैं नहीं कर सकता, तो क्या कोई मुझे बता सकता है कि ऐसा क्यों होता है? यह सही है जब आप दस्तावेज़ से कारण उद्धृत कर सकते हैं।

मैं बहुत यकीन है कि यह मैं कैसे UIActivityViewController प्रारंभ या जिस तरह से मैं UIActivityViewController दिखाने के लिए संबंधित नहीं है हूँ।

अधिक जानकारी और आसान के लिए, मैंने यहां debug repo बनाया है। यदि आप चाहें तो इसे डिबग करने के लिए आप इसे देख सकते हैं।

अधिक

मैं एक problem काफी Android पर इस समस्या के समान पाया। लेकिन मुझे यकीन नहीं है क्योंकि मैंने ऐप्पल से इसके बारे में कोई आधिकारिक दस्तावेज नहीं देखा है। एक और बात यह है कि clearColor पर रंग बदलने पर स्पर्श प्रभावित हो सकता है। तो वास्तव में, मुझे नहीं लगता कि वे वही हैं।

+0

मैं अपने कोड का परीक्षण करने के लिए अपने मैक पर नहीं हूं लेकिन अभी एक विचार मिला है। क्या आपने setOpaque विधि को आजमाया है? –

+0

@ToughGuy आपके सुझाव के लिए धन्यवाद लेकिन 'SetOpaque' इस मामले में मेरी सहायता नहीं करता है। धीरे-धीरे, जब आप मेरे कोड का परीक्षण कर सकते हैं, तो मैं आपसे एक और प्रश्न का इंतजार कर सकता हूं। – trungduc

+0

मैंने ग्रे बॉक्स को ऊंचाई में छोटे बनाने की कोशिश की ताकि बटन आधे दिखाई दे सकें। गतिविधि दृश्य कंट्रोलर के अलावा किसी भी दृश्य को मूल रूप से स्पर्श करना एक प्रतिक्रियाकर्ता घटना देता है। –

उत्तर

3

यह पदानुक्रम में UIRemoveView (निजी) के कारण है। सबसे अच्छा मैं निर्धारित कर सकता हूं, आपका ऐप घटनाओं को सीधे दूरस्थ दृश्यों तक नहीं भेज सकता है। मुझे संदेह है कि यह एक सुरक्षा उपाय है जो आपको शेयर संवाद पेश करने से रोकने के लिए और उपयोगकर्ता द्वारा अनुरोध नहीं की गई बाहरी कार्रवाई करने के लिए स्वचालित रूप से एक स्पर्श ईवेंट भेज रहा है। रिमोट व्यू आपके एप्लिकेशन की प्रक्रिया में नहीं चलते हैं। एक "एक्सपीसी लिंक" के साथ "कॉपी" बटन पर बातचीत की जाती है।

इसका मतलब यह है कि यदि रिमोट व्यू आपके विचारों में से एक द्वारा कवर किया गया है, तो इसके साथ बातचीत करने के लिए कोई रास्ता नहीं है (कम से कम मुझे मिला है)। आपको यह सुनिश्चित करना होगा कि आप इसे कवर नहीं कर रहे हैं।

असल में ऐसा करना आसान है। रिमोट व्यू रखने वाली चीज़ को UITransitionView कहा जाता है और अन्य ओएस-स्तरीय चीजों के लिए उपयोग किया जाता है जिसे आपको शायद कवर नहीं किया जाना चाहिए। तो नहीं है:

- (void)didAddSubview:(UIView *)subview { 
    [super didAddSubview:subview]; 

    if ([subview isKindOfClass:NSClassFromString(@"UITransitionView")]) { 
     // To raise it above your overlay; 
     // otherwise it's immediately above the view controller (below the overlay) 
     [self bringSubviewToFront:subview]; 
    } else { 
     [self bringSubviewToFront:self.overlay]; 
    } 
} 

लेकिन .... यह अपने कोड में UITransitionView बारे में बात करने की आवश्यकता है। यह नाजुक, और संभवतः निजी एपीआई का एक वर्जित उपयोग है।

अन्यथा आपको कुछ यूआईटीटीविटीव्यू कंट्रोलर अनुरोधों को कुछ कॉल/अधिसूचना के साथ लपेटना होगा जो विंडो को बताएंगे कि जब तक हम पूरा नहीं कर लेते हैं (जिसे आपको पूरा करने वाले हैंडलर में साफ़ करना होगा)।

+0

जैसा कि आपने कहा था ** यदि रिमोट व्यू आपके विचारों में से एक है, तो इसके साथ बातचीत करने के लिए कोई रास्ता नहीं है (कम से कम मुझे मिला है) **, लेकिन जब मैं बदलता हूं 'ओवरले' का रंग 'clearcolor' के लिए। मैं सामान्य रूप से एक्सटेंशन आइटम को स्पर्श कर सकता हूं। क्या आपको लगता है कि हमारे पास कुछ गड़बड़ है? – trungduc

+0

आपके स्पष्ट उत्तर के लिए बहुत बहुत धन्यवाद! – trungduc

+0

चूंकि अदृश्य दृश्य स्पर्श घटनाओं को कैप्चर नहीं करते हैं, इसलिए मुझे संदेह है कि स्पर्श को आपके दृश्य के माध्यम से सीधे दूरस्थ दृश्य में अग्रेषित किया जा रहा है। –

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

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