2010-11-20 8 views
29

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

संपादित करें: मेरे पास मोडल व्यू कंट्रोलर में निम्न है। यह मदद नहीं कर रहा है।

- (void)viewDidLoad { 
    TestResultView *trv = [[TestResultView alloc]initWithTest: [Model m].currentTest]; 
    self.view = trv; 
    trv.frame = CGRectMake(0, 320, 320, 160); 
    [trv release]; 
    [super viewDidLoad]; 
} 

उत्तर

38

आप दृश्य नियंत्रक के फ्रेम को संशोधित कर सकते हैं, लेकिन आप UIViewController के -presentModalViewController उपयोग कर रहे हैं: एनिमेटेड: विधि, दृश्य के पीछे एक बार अपने मॉडल को देखने के स्क्रीन पर एनिमेट समाप्त हो गया है उतार दिया जाएगा (यह मान लिया गया है आप एक आईफोन पर हैं) और आपको एक सफेद स्क्रीन दिखाई देगी जहां आपका पृष्ठभूमि दृश्य होना चाहिए। आईओएस मानता है कि आपका मोडल व्यू कंट्रोलर एक पूर्ण-स्क्रीन दृश्य नियंत्रक होगा, और स्मृति को सहेजने के लिए अन्य दृश्य को डंप करेगा।

यदि आप वास्तव में स्क्रीन के हिस्से पर एक दृश्य दिखाना चाहते हैं, तो आपको इसके बजाय UIView (कोई UIViewController) को अपने वर्तमान UIViewController के दृश्य में सबव्यूव के रूप में जोड़ना चाहिए, और उसके बाद इसे स्वयं स्क्रीन पर एनिमेट करें। मुझे लगता है कि कुछ इस तरह अपने UIViewController वर्ग में काम करेगा उस दृश्य पेश करेंगे: UIView एनीमेशन ब्लॉक से पहले

myHalfView.alpha = 0.0; 

की स्थापना करके

// Add the view as a subview and position it offscreen just below the current view 
UIView *myHalfView = [[UIView alloc] initWithFrame:someAppropriateFrame]; 
[self.view addSubview:myHalfView]; 
CGRect offScreenFrame = myHalfView.bounds; 
offScreenFrame.origin = CGPointMake(0.0, CGRectGetMaxY(self.view.frame)); 

// Now animate the view upwards 
[UIView beginAnimations:nil context:nil]; 
// Move the view upwards the height of your sliding view so it's entirely onscreen 
myHalfView.center = CGPointMake(myHalfView.center.x, myHalfView.center.y - myHalfView.bounds.size.height); 
[UIView commitAnimations]; 
[myHalfView release]; 

बोनस अंक के लिए, आप दृश्य फीका कर सकता है, और सेटिंग

myHalfView.alpha = 1.0; 

केंद्र संपत्ति को एनिमेट करने के बाद ब्लॉक के अंदर।

जब आप पूरा कर लेंगे, तो आप कुछ ऐसा कर सकते हैं लेकिन दृश्य ऑफस्क्रीन को स्लाइड करने के विपरीत में। जब आप दृश्य को स्क्रीन से ढलते हैं तो आप UIView एनीमेशन ब्लॉक में एनीमेशनडिडस्टॉप चयनकर्ता को अधिसूचित कर सकते हैं ताकि आप इसे दृश्य पदानुक्रम से हटा सकें।

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

+1

इससे यह आईपैड पर काम करता है। –

+1

+1, अच्छा समाधान! बस एक त्वरित: आखिरी पंक्ति में बाएं ब्रैकेट "[" गायब है। – pille

+1

अच्छी पकड़, धन्यवाद! – atticus

26

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

आईपैड के मामले में, मुझे नहीं लगता कि नीचे के दृश्य को अनलोड किया जाएगा। (क्योंकि ऐसे विकल्प हैं जहां हम आईपैड पर मोडल व्यू पेश कर सकते हैं, जो पूरी स्क्रीन को कवर नहीं करता है)

अंत में मोडल व्यू कंट्रोलर एक नियंत्रक है, और किसी अन्य नियंत्रक की तरह रूट व्यू है, जिनकी गुणों को संपादित किया जा सकता है, अगर हम इसे पकड़ सकते हैं।

MyViewController *viewController = [[MyViewController alloc] init]; 
viewConroller.modalPresentationStyle = UIModalPresentationFormSheet; 
[self presentModalViewController:viewController animated:YES]; 
    //superView of viewController's view is modalViewController's view, which we were after 
viewController.view.superview.frame = CGRectMake(x,y,w,h); 
    //x y w h - can have desired values. 
20

मैं @ DSAW के जवाब में जोड़ने के लिए होता है कि मॉडल को देखने के superview लैंडस्केप मोड में अपनी समन्वय प्रणाली को घुमाने के लिए प्रतीत नहीं होता:

यहाँ तुम क्या एक कस्टम ModalView के फ्रेम दे देंगे।यहाँ कोड है कि मैं अपने खुद के अनुप्रयोग में प्रयोग किया जाता है:

MyViewController* modalVC = [[MyViewController alloc] init];   
modalVC.modalPresentationStyle = UIModalPresentationFormSheet; 
[self presentModalViewController:modalVC animated:NO]; 
CGRect r = CGRectMake(self.view.bounds.size.width/2 - 236, 
         self.view.bounds.size.height/2 - 130, 
         472, 260); 
r = [self.view convertRect:r toView:modalVC.view.superview.superview]; 
modalVC.view.superview.frame = r; 

superview iPad के साथ ही बारी बारी से नहीं हो सकता है, यह अगर मैं आईपैड के बाद बारी बारी से सही काम और केंद्रित मोडल दृश्य रखने के लिए प्रतीत होता है मोडल व्यू दिखा रहा है।

+1

बढ़िया है, लेकिन इस तरह के दृश्य को खारिज करते समय अभिभावक के किस तरीके को बुलाया जाता है? उदाहरण के लिए माता-पिता का दृश्य दृश्यदर्शी दिखाई नहीं देगा .. – user944351

+0

यह मेरे लिए अच्छा काम करता है। कस्टम साइज्ड मोडल विचारों के लिए मैंने देखा सबसे अच्छा समाधान। बहुत बुरा आप इसे segues के साथ नहीं कर सकते (जहां तक ​​मैं इकट्ठा कर सकता हूं। मैंने कुछ प्रयोग किया)। –

+0

हाय bugloaf, मैंने वही किया और यह अकेले ViewControllers के लिए ठीक काम करता है लेकिन नेविगेशन के साथ ViewControllers के लिए ऐसा नहीं है। कृपया मेरे प्रश्न का उत्तर दें @ http://stackoverflow.com/questions/15802633/presenting-a-view-controller-of-custom-size-with-navigation – satheeshwaran

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