8

मैं आईफोन और आईपैड के लिए एक सार्वभौमिक ऐप पर कस्टम जीयूआई बना रहा हूं। आईपैड पर यह सामग्री के हेरफेर, विस्तार जानकारी और जैसे (उन्नत स्प्लिट व्यू के बारे में सोचने) जैसी उपयोगिताओं के लिए "साइड व्यू" पर भारी निर्भर करता है। एक दृश्य बिंदु से नया यूआईपी प्रस्तुति नियंत्रक मुझे इन "साइड व्यू" (और dimmedView का उपयोग नहीं करने) देने के लिए स्पॉट पर है और कार्यान्वयन को बनाए रखने और बनाए रखने के लिए सरल रहा है, जबकि स्टोरीबोर्ड के साथ अच्छी तरह से एकीकृत है। लेकिन प्रस्तुत प्रस्तुत दृश्य नियंत्रक दिखाई देने पर मुझे प्रस्तुत करने वाले दृश्य नियंत्रक की सामग्री में हेरफेर करने में सक्षम होना चाहिए। तो मेरा सवाल यह है कि, क्या मैं साइड व्यू प्रस्तुत करते समय प्रस्तुत करने वाले व्यू कंट्रोलर पर userInteractionEnabled (या समान) सेट कर सकता हूं?क्या मैं एक UIPresentationController को प्रस्तुत कर सकता हूं UserInteractionViewController पर सक्षम है?

उत्तर

11

UIPresentationController, पेश दृश्य के ऊपर एक खिड़की subview के रूप अपने कंटेनर दृश्य सम्मिलित करता है इस प्रकार प्रस्तुत दृश्य बाहर किसी भी छूता है कंटेनर दृश्य से फंस जाते हैं और यह कभी बनाना:

यहाँ कोड का टुकड़ा है पर प्रस्तुत करना।

फिक्स वर्तमान दृश्य में स्पर्श के माध्यम से कंटेनर दृश्य पर एक दृश्य डालने के लिए है। आप इसे एक मंद दृश्य के रूप में उपयोग कर सकते हैं या पूरी तरह से पारदर्शी दृश्य के लिए backgroundColor[UIColor clearColor] पर सेट कर सकते हैं। अपने प्रेजेंटेशन कंट्रोलर कोड में पासथ्रू दृश्य सेट करें।

@interface IVPasserView : UIView 

@property (strong, nonatomic) NSArray* passthroughViews; 

@end 

@implementation IVPasserView 

- (UIView*)hitTest:(CGPoint)point withEvent:(UIEvent *)event 
{ 
    UIView* hit = [super hitTest:point withEvent:event]; 
    if (hit == self) 
     for (UIView* passthroughView in _passthroughViews) 
     { 
      hit = [passthroughView hitTest:[self convertPoint:point toView:passthroughView] 
           withEvent:event]; 
      if (hit) 
       break; 
     } 
    return hit; 
} 

@end 

नोट: जबकि इस में है कि यह एक subview वापस नहीं करता है -[UIView hitTest:withEvent:] की भावना का उल्लंघन, इस तथ्य को कैसे प्रणाली मानक UIPopoverPresentationController यह संभालती है। यदि आप वहां passthroughViews संपत्ति सेट करते हैं, तो कंटेनर व्यू hitTest:withEvent: को पासथ्रू व्यू के साथ प्रतिसाद देता है, भले ही वे पर्यवेक्षण/सबव्यू नहीं हैं! इस प्रकार यह अगले आईओएस रिलीज से बचने की संभावना है।

+0

दिलचस्प समाधान। मुझे निश्चित रूप से यह एक कोशिश देने की जरूरत है। – jollyCocoa

+0

प्रश्न शीर्षक में बिल्कुल समस्या के लिए यह एक अच्छा समाधान है। –

+0

यह बहुत खूबसूरत है। –

2

ठीक है, तो ऐसा लगता है कि UIPresentationController का विचार इसे एक उन्नत स्प्लिट व्यू (या कम से कम यह मेरा वर्तमान निष्कर्ष) के रूप में उपयोग करने में सक्षम नहीं है। हालांकि मैं एक कामकाज बनाने में कामयाब रहा। अगर किसी को इसे संभालने का बेहतर तरीका मिल जाए, तो कृपया मुझे टिप्पणियों में बताएं।

तो मैं क्या कर रहा सूचकांक 0. पर transitionContexts containerView में PresentingViewController के दृश्य (UIPresentationControllers containerView के रूप में ही) पदानुक्रम सम्मिलित यह मैं पारदर्शी रूप से PresentingViewControllers ध्यान में रखते हुए touchEvents को संभालने में सक्षम बनाता है। लेकिन यह प्रेजेंटिंग व्यू कंट्रोलर को अपने मूल दृश्य पदानुक्रम से देखने को हटा देता है, इसलिए जब प्रेजेंटेशन को खारिज कर दिया जाता है तो मुझे इसे वापस स्थानांतरित करने की आवश्यकता होती है। इसका अर्थ यह है कि यदि दृश्य मौजूद है, तो दृश्य को वापस देखने के लिए पेरेंट व्यू कंट्रोलर के दृश्य पर डालें, या ऐप की विंडो, यदि प्रस्तुत हो रहा है तो व्यू कंट्रोलर ऐप का रूट व्यू कंट्रोलर है (अन्य परिदृश्य भी हो सकते हैं, लेकिन यह अभी के लिए करेगा)।

यह सब UIViewControllerAnimatedTransitioning में एनिमेट ट्रांजिशन में किया गया है।

UIView.animateWithDuration(transitionDuration(transitionContext), 
     delay: 0.0, 
     usingSpringWithDamping: 1.0, 
     initialSpringVelocity: 0.5, 
     options: UIViewAnimationOptions.BeginFromCurrentState|UIViewAnimationOptions.AllowUserInteraction, 
     animations: {() -> Void in 
      animatingView.frame = finalFrame 
     }) { (finished:Bool) -> Void in 
      if !self.isPresentation { 
       if let parentViewController = backgroundVC.parentViewController { 
        parentViewController.view.addSubview(backgroundVC.view) 
       } 
       else if let window = (UIApplication.sharedApplication().delegate as! AppDelegate).window { 
        window.addSubview(backgroundVC.view) 
       } 
       fromView.removeFromSuperview() 
      } 
      else { 
       containerView.insertSubview(backgroundVC.view, atIndex: 0) 
      } 
      transitionContext.completeTransition(true) 
    } 
+1

आप सही हैं कि प्रस्तुति नियंत्रक कस्टम विभाजन दृश्य बनाने के लिए उपयुक्त नहीं हैं। इसके लिए, नियंत्रक रोकथाम देखें शायद एक बेहतर विकल्प है। –

1

मॉडल प्रस्तुति आपकी स्थिति के लिए उपयुक्त नहीं है। कस्टम कंटेनर व्यू कंट्रोलर के साथ अपने परिदृश्य को कार्यान्वित करना बेहतर है और अतिरिक्त दृश्य नियंत्रकों की प्रस्तुति को संभालने के लिए showDetailViewController:sender: विधि ओवरराइड करें। आप आईफोन पर दृश्य नियंत्रक मोडल और उदाहरण के लिए आईपैड पर दाईं ओर दिखाने के लिए इस विधि को अनुकूलित कर सकते हैं।

यहाँ Apple Documentation से एक अंश है:

एक दृश्य नियंत्रक दिखा बनाम पेश

UIViewController वर्ग एक दृश्य नियंत्रक प्रदर्शित करने के लिए दो तरीके प्रदान करता है:

showViewController: इस: और showDetailViewController: प्रेषक: विधियां नियंत्रकों को प्रदर्शित करने के लिए सबसे अनुकूली और लचीला तरीका प्रदान करती हैं। ये विधियां प्रस्तुत करने वाले व्यू नियंत्रक को प्रस्तुति को संभालने का सर्वोत्तम तरीका तय करने दें। उदाहरण के लिए, एक कंटेनर व्यू नियंत्रक दृश्य नियंत्रक को के बजाय इसे सामान्य रूप से प्रस्तुत करने के बजाय बच्चे के रूप में शामिल कर सकता है। डिफ़ॉल्ट व्यवहार दृश्य नियंत्रक को सामान्य रूप से प्रस्तुत करता है। वर्तमान दृश्य नियंत्रक: एनिमेटेड: समापन: विधि हमेशा दृश्य नियंत्रक को सामान्य रूप से प्रदर्शित करता है। दृश्य नियंत्रक जो इस विधि को कॉल करता है वह अंततः प्रस्तुति को संभाल नहीं सकता है लेकिन प्रस्तुति हमेशा मोडल होती है। यह विधि क्षैतिज रूप से कॉम्पैक्ट वातावरण के लिए प्रस्तुति शैली अनुकूलन करती है। showViewController: प्रेषक: और showDetailViewController: प्रेषक: प्रस्तुतियां शुरू करने के लिए विधियां पसंदीदा तरीका हैं। एक दृश्य नियंत्रक उन पदानुक्रम में शेष दृश्य नियंत्रक पदानुक्रम या वर्तमान दृश्य नियंत्रक की स्थिति के बारे में कुछ भी जानने के बिना उन्हें कॉल कर सकता है। सशर्त कोड पथ लिखने के बिना इन तरीकों से अपने ऐप के विभिन्न हिस्सों में कंट्रोलर को फिर से उपयोग करना आसान हो जाता है।

+0

अरे अलेक्जेंडर! आपके उत्तर के लिए धन्यवाद, और देर से प्रतिक्रिया के लिए मेरी माफ़ी। यह निश्चित रूप से एक दिलचस्प समाधान की तरह लगता है। मैं देखूंगा कि यह मेरी समस्या हल करता है और यदि ऐसा है तो आप इसके लिए श्रेय देते हैं। एक अच्छे विचार के लिए अब के लिए उपरोक्त। – jollyCocoa

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

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