2010-06-30 16 views
5

पर ड्रैग-एन-ड्रॉप UIPopoverController से पीछे UIView में UIView को खींचने और छोड़ने के बारे में मैं कैसे जाउंगा।UIPopoverController से अन्य UIView

यह कार्यक्षमता है कि पृष्ठ उनके सम्मिलित मीडिया पॉपओवर में प्रदान करते हैं, जहां आप UIPopoverController से एक आकृति खींच सकते हैं और इसे मुख्य दस्तावेज़ में छोड़ सकते हैं।

मैं वास्तव में पैन UIGestureRecognizers पैन से उलझन में हूं और जहां उन्हें लागू किया जाएगा।

धन्यवाद,

उमर

+0

दोस्त मैं उलझन में हूं .. UIPopoverController और UIGestureRecognizers क्या हैं? निश्चित रूप से UIKit घटक नहीं। क्या आप कुछ कस्टम विचारों का जिक्र कर रहे हैं ... या किसी प्रकार की कार्यक्षमता जो आप चाहते हैं ..? – lukya

+1

@lukya UIPopovercontroller और UIGestureRecognizers आईपैड के लिए UIKit का सभी हिस्सा हैं (Uigesturerecognizer भी आईफोन के लिए है) – Daniel

+0

@ डैनियल इस बात पर कोई विचार है कि वस्तुओं को कैसे संरचित किया जाएगा? – umerh

उत्तर

6

आप दो दृश्य नियंत्रक एक पृष्ठभूमि mainController एक है कि एक UIPopoverViewController popoverController कहा जाता है का उपयोग कर प्रस्तुत कहा जाता है में है कि के साथ सौदा है। आपका पॉपओवर नियंत्रक विचारों में UIPanGestureRecognizer जोड़ सकता है, जिसे उपयोगकर्ता खींच सकता है। जेस्चर रिकॉन्नाइज़र का एक्शन लक्ष्य पॉपओवर कंट्रोलर पर एक विधि हो सकता है।

एक बार जब उपयोगकर्ता ड्रैगिंग ऑपरेशन शुरू करता है तो आपकी क्रिया विधि को जेस्चर रिकॉग्नाइज़र के साथ तर्क के रूप में बुलाया जाता है, इशारा की स्थिति रिकॉग्नाइज़र UIGestureRecognizerStateBegan है। जब आप ड्रॉप विफल हो जाते हैं, तो आप इसे वापस एनिमेट करने में सक्षम होने के लिए दृश्य के वर्तमान फ्रेम को सहेजने से बचा सकते हैं। दृश्य को किसी अन्य पर्यवेक्षण (उदाहरण के लिए विंडो) पर ले जाना आवश्यक हो सकता है, क्योंकि मुझे यकीन नहीं है कि UIPopoverViewController क्लिप इसके दृश्य को देखता है।

उपयोगकर्ता ड्रैग के रूप में, आपकी क्रिया विधि को UIGestureRecognizerStateChanged में जेस्चर रिकॉग्नाइज़र के साथ ओवर और ओवर कहा जाता है। यह निर्धारित करने के लिए translationInView: विधि UIPanGestureRecognizer पर उपयोग करें कि उपयोगकर्ता ड्रैग किए गए दृश्य केंद्र/फ्रेम/तदनुसार रूपांतरण को कितना खींचता है और अपडेट करता है।

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

मुझे उम्मीद है कि यह किसी भी तरह से समझदार और सहायक है।

+0

विस्तृत उत्तर के लिए बहुत बहुत धन्यवाद। मुझे लगता है कि मैं इसे समझता हूं। UIGestureRecognizerStateBegan पर मैं विंडो में एक नया UIView जोड़ूंगा और अंततः UIGestureRecognizerStateEnded में सबकुछ समायोजित करूँगा और विंडो से UIView को हटाने का तरीका मेरे लिए जाने का तरीका होगा। फिर से धन्यवाद। – umerh

7

यूआईपीओवर कंट्रोलर पर प्रलेखन के अनुसार, जब पॉपओवर प्रस्तुत किया जाता है, तो इसे एक विशेष "विंडो" पर प्रस्तुत किया जाता है। इस वजह से, पॉपओवर व्यू कंट्रोलर के कंटेंट व्यू कंट्रोलर को बस एक सबव्यू जोड़ना पॉपओवर व्यू कंट्रोलर के व्यू के बाहर एक दृश्य खींचने में सक्षम नहीं है।

सबसे आसान समाधान यहां अपनी खिड़की बनाने के लिए है, खींचने पर खिड़की पर अपना ड्रैग-सक्षम दृश्य जोड़ें। ड्रैग/ड्रॉप की अवधि के लिए विंडो को दृश्यमान बनाएं, और फिर पूर्ण होने पर अपनी विंडो को छोड़ दें।

ऊपर वर्णित अनुसार, इशारा पहचानकर्ता (जीआर) ड्रैग/ड्रॉप कार्यक्षमता के लिए सबसे उपयुक्त हैं।एक बार जब जीआर की स्थिति बदल गई है तो जीआर "समाप्त" या "रद्द" राज्य तक पहुंचने तक सभी स्पर्शों को नियंत्रित करेगा, जो दृश्य नियंत्रकों के साथ-साथ खिड़कियों के बीच विचार खींचने के लिए आदर्श बनाता है :)

उदाहरण:

@interface MySplitViewController : UISplitViewController { 

    UIView *dragView; 
    UIWindow *dragWindow; 
} 

कार्यान्वयन: नोट हम अपने विंडो पर "makeKeyAndVisible" कॉल करने के लिए की जरूरत नहीं है। हमें अपनी "छिपी हुई" संपत्ति

मेकअप और दृश्य विधि के संबंध में ऐप्पल से: // सुविधा सेट करने की आवश्यकता है। अधिकांश ऐप्स मुख्य विंडो दिखाने के लिए इसे कॉल करते हैं और इसे कुंजी भी बनाते हैं। अन्यथा दृश्य छुपा संपत्ति

-(void)dragBegan{ 

    self.dragWindow = [[UIWindow alloc] initWithFrame:self.view.window.frame]; 
    [self.dragWindow addSubview:self.dragView]; 
    [self.dragWindow setHidden:NO]; 
} 

यहां हम जेस्चर रिकॉग्नाइज़र के "एंडेड" या "रद्द" स्थिति को संभालते हैं। नोट: खींचें/ड्रॉप पूर्ण होने पर विंडो को हटाना महत्वपूर्ण है या आप नीचे दिए गए विचारों के साथ उपयोगकर्ता इंटरैक्टिवता खो देंगे।

-(void)dragEnded{ 

    [self.dragView removeFromSuperview]; 

    [self.dragWindow setHidden:YES]; 
    [self.dragWindow release]; 

    [self.view addSubview:self.dragView]; 
}