सवाल UIModalPresentationFormSheet का आकार कैसे बदलें?


मैं एक मॉड्यूल व्यू कंट्रोलर को UIPresentationFormSheet के रूप में प्रदर्शित करने का प्रयास कर रहा हूं। दृश्य प्रकट होता है, लेकिन मैं इसे आकार देने के लिए प्रतीत नहीं कर सकता। मेरी एक्सआईबी की उचित ऊंचाई और चौड़ाई है, लेकिन जब मैं इसे इस तरह कहता हूं तो यह ओवरराइड हो जाता है:

composeTweetController = [[ComposeTweet alloc] initWithNibName:@"ComposeTweet" bundle:nil];
composeTweetController.modalPresentationStyle = UIModalPresentationFormSheet;
[self presentModalViewController:composeTweetController animated:TRUE];

कोई विचार? मैं आईफोन एसडीके 3.2 बीटा 4 का उपयोग कर रहा हूं


44
2018-03-16 20:39


मूल


बीटा एनडीए के तहत है, इसलिए मुझे संदेह है कि आपको यहां कई जवाब मिलेंगे। मैं ऐप्पल के एसडीके 3.2 बीटा मंचों का उपयोग करने की सलाह देता हूं devforums.apple.com - Martin Gordon


जवाब:


आप इसे पेश करने के बाद एक मोडल व्यू के फ्रेम को समायोजित करने में सक्षम हैं:

आईओएस 5.1 - 7.1 में परीक्षण किया गया

MyModalViewController *targetController = [[[MyModalViewController alloc] init] autorelease];
targetController.modalPresentationStyle = UIModalPresentationFormSheet;
targetController.modalTransitionStyle = UIModalTransitionStyleFlipHorizontal;  //transition shouldn't matter
[self presentViewController:targetController animated:YES completion:nil];

if(floor(NSFoundationVersionNumber) <= NSFoundationVersionNumber_iOS_6_1){
     targetController.view.superview.frame = CGRectInset(targetController.view.superview.frame, 100, 50);
}else{
     targetController.view.frame = CGRectInset(targetController.view.frame, 100, 50);
     targetController.view.superview.backgroundColor = [UIColor clearColor];
}

91
2017-11-24 20:42



यह आईपैड पर भी मेरे लिए काम करता है, लेकिन ... अगर मैं डिवाइस को घुमाता हूं, तो दृश्य केंद्रित नहीं होता है - Mauro Delrio
@MauroDelrio इसे परिदृश्य से सही ढंग से काम करने के लिए आपको केंद्र निर्देशांक को फ़्लिप करने की आवश्यकता है। पूर्व: CGPoint केंद्र = self.view.center; targetController.view.superview.center = {isPortrait}? केंद्र: CGPointMake (center.y, center.x); - Nate Weiner
इस दृष्टिकोण के लिए सावधान, यह स्केलिंग के परिणामस्वरूप दृश्य नियंत्रक के विचारों में कुछ विरूपण का कारण बनता है। - Ralphleon
अच्छा समाधान मैं इस तरह की सीमाओं को बदलना पसंद करता हूं targetController.view.superview.frame = CGRectInset(targetController.view.superview.frame, 110, 70); - stigi
IOS7 के लिए समाधान की आवश्यकता है - Codesen


यहां एक विधि है जो काम करती है आईओएस 7 साथ ही आईओएस 5 और आईओएस 6: (आर्क)

-(void)presentController:(UIViewController*)controller fromRootController:(UIViewController*)rootController withSize:(CGSize)size
{
    UINavigationController* nav = [[UINavigationController alloc] initWithRootViewController:controller];
    nav.modalTransitionStyle = UIModalTransitionStyleCoverVertical;
    nav.modalPresentationStyle = UIModalPresentationFormSheet;
    [rootController presentModalViewController:nav animated:YES];
    if ([[[UIDevice currentDevice] systemVersion] floatValue] >= 7.0)
    {
        nav.view.superview.backgroundColor = [UIColor clearColor];
        nav.view.bounds = CGRectMake(0, 0, size.width, size.height);
    }
    else
    {
        nav.view.superview.bounds = CGRectMake(0, 0, size.width, size.height);
    }
}

13
2017-12-10 17:49



यह आईओएस 7 पर मेरे लिए काम करता है, धन्यवाद। मुझे एक बहिष्करण चेतावनी मिल रही है [rootController presentModalViewController:nav animated:YES]; ये कहते हुए presentModalViewController अब आईओएस 6 के रूप में समर्थित नहीं है। मुझे लगता है कि नई विधि है presentViewController। फिर से धन्यवाद, अच्छा काम है। - Clifton Labrum
आईओएस संस्करणों के तहत आकार बदलने के लिए कार्य समाधान। - Nikolay Spassov
महान। यह एक आकर्षण की तरह काम कर रहा है। :) - Afnan
यदि पुराने आकार की तुलना में नया आकार बड़ा है और मेरे पास उस क्षेत्र में क्लिक करने योग्य आइटम हैं, तो वे अब क्लिक करने योग्य नहीं होंगे ... मैं इसे कैसे हल करूं? - Nava Carmon


composeTweetController = [[ComposeTweet alloc] initWithNibName:@"ComposeTweet" bundle:nil];
composeTweetController.modalPresentationStyle = UIModalPresentationFormSheet;
[self presentModalViewController:composeTweetController animated:TRUE];
//if you want to change its size but the view will remain centerd on the screen in both portrait and landscape then:
composeTweetViewController.view.superview.bounds = CGRectMake(0, 0, 320, 480);
//or if you want to change it's position also, then:
composeTweetViewController.view.superview.frame = CGRectMake(0, 0, 320, 480);


12
2018-02-17 16:30



मुझे लगता है कि आप बस सेट कर सकते हैं frame  या  bounds और center - nielsbot


आईओएस 7 के रूप में आप बस कर सकते हैं

composeTweetController.preferredContentSize = CGSizeMake(380.0, 550.0);

8
2018-04-01 10:36



सही - सादगी जो काम करता है। - BonanzaDriver


XCode 4.5 का उपयोग करके आईओएस 6 के लिए परीक्षण और काम करता है


4
2017-10-02 22:49



इस समाधान के साथ समस्या यह है कि संक्रमण के बाद शीट अपना केंद्र बदल रहा है स्टाइल पूरा हो गया है - Fede Cugliandolo
@FedeCugliandolo - आप सही हैं। उपर्युक्त विधि केवल तभी काम करती है जब आप क्रॉस फेड संक्रमण शैली का उपयोग करते हैं, या बिल्कुल एनिमेट नहीं करते हैं। मैं अपनी एनीमेशन का उपयोग करके, कोई एनीमेशन के साथ प्रस्तुत करना समाप्त हो गया। - Jon
मेरे लिए काम नहीं करता है :( फॉर्म शीट अभी भी वही आकार है - Petr Peller
आईओएस 7 पर UIModalTransitionStyleCover वर्टिकल भी बग किया गया है! लेकिन UIModalTransitionStyleCrossDissolve का उपयोग ठीक काम करता है - Carlos Ricardo
UIModalTransitionStyleCrossDissolve के लिए +1 - mgauthier


यह किसी के साथ काम करेगा UIModalTransitionStyle

@interface BaseDialog ()

@property(nonatomic,assign) CGRect origFrame;

@end

@implementation BaseDialog

-(void)viewDidLoad{
    [super viewDidLoad];
    self.origFrame=self.view.frame;
}
-(CGSize)formSheetSize{
    return self.origFrame.size;
}

4
2017-10-08 11:10



बहुत खुबस! बहुत बढ़िया! मुझे यह जानना अच्छा लगेगा कि यह क्यों काम करता है! :) - iOSProgrammingIsFun
लेआउट गणना में सेब का उपयोग _formSheetSize। मैं असली आकार के लिए ओवरराइड हूँ; असली आकार मैं लोड समय पर xib फ्रेम से लेता हूं; - john07
धन्यवाद! क्लास विधि / प्रॉपर्टी फॉर्म शीटसाइज कैसे मिला? निजी हेडर? - iOSProgrammingIsFun
वर्तमान पर रहें व्यू कंट्रोलर: एनिमेटेड: डीबगर में UIViewController को सम्मिलित करें और निरीक्षण करें। मैं अंतर्ज्ञान विधि का उपयोग कर रहा हूँ :) - john07
वाह, यह कुछ स्मार्ट 'हैकिंग' कुडोस है! मुझे यह भी नहीं पता था कि आप ऐसा कर सकते हैं! एक ट्यूटोरियल ब्लॉग पोस्ट लिखें ??? :) - iOSProgrammingIsFun


पहले कोड के बाद अपने मॉडल व्यू कंट्रोलर को पेश करना है

 composeTweetController = [[ComposeTweet alloc] initWithNibName:@"ComposeTweet" bundle:nil];
    composeTweetController.modalPresentationStyle = UIModalPresentationFormSheet;
    UINavigationController *navigationController = [[UINavigationController alloc] initWithRootViewController:composeTweetController];
    navigationController.delegate = self;   
    [self presentModalViewController:navigationController animated:YES];

और आपके कंपोज़िट कंट्रोलर क्लास में

-(void)viewWillAppear:(BOOL)animated
{
 [super viewWillAppear:animated];
 self.navigationController.view.superview.frame = CGRectMake(0, 0,500,400);
}

4
2017-10-09 08:57



+1 - यह एकमात्र समाधान है जो मुझे मिल सकता है जो आपके द्वारा निर्धारित एक्स, वाई निर्देशांक का सम्मान करेगा। - Lizza


आईओएस 7

तो पर्यवेक्षक के फ्रेम या सीमाओं को स्थापित करने का दृष्टिकोण अब आईओएस 7 (यूआईमोडालट्रांसशन स्टाइल कॉवर वर्टिकल के लिए) पर काम नहीं करता है। हालांकि, अब आप पर्यवेक्षण के पृष्ठभूमि रंग को साफ़ करने के लिए सेट कर सकते हैं और फिर मोडल व्यू कंट्रोलर के फ्रेम को बदल सकते हैं, जिसे आप फिट देखते हैं।

तो आईओएस 7 में आप यह करना चाहते हैं:

  1. दृश्य नियंत्रक प्रस्तुत करें (प्रस्तुति मोड: UIModalPresentationFormSheet)
  2. साफ़ करने के लिए दृश्य नियंत्रक पर्यवेक्षण पृष्ठभूमि रंग सेट करें
  3. दृश्य नियंत्रक के फ्रेम को वांछित के रूप में बदलें (शायद इसे छोटा कर दें और फिर इसे पर्यवेक्षण में केंद्रित करें)

3
2017-09-21 18:57



पर्यवेक्षण के भीतर दृश्य को केंद्रित करना आवश्यक नहीं है। बस सीमा निर्धारित करें (बाद में -presentViewController:animated:completionHandler) सेवा मेरे (0, 0, width, height) यह स्वचालित रूप से खुद को केंद्रित करने का कारण बनता है। - colincameron
बाउंड सेट करना पृष्ठभूमि रंग का उपयोग किए बिना मेरे लिए ठीक काम करता है। (मेरा व्यू कंट्रोलर एक नेविगेशन नियंत्रक में है। सुनिश्चित नहीं है कि यह यहां मायने रखता है।) - arsenius


मुझे एक पूर्ण स्क्रीन मोडल दृश्य मिला UIPresentationFormSheet बस इस पंक्ति के साथ:

modalViewController.view.superview.bounds = CGRectMake(0, 0, 1024, 748);

2
2018-06-20 10:23





@bdrobert दुख की बात है कि आपका अच्छा समाधान अब और काम नहीं करता है iOS6 - नया व्यू कंट्रोलर कस्टम आकार के साथ एम्बेडेड होने के बावजूद कंटेनर मूल आकार रखता है।

आपको शायद प्रस्तुति एपीआई में पेश करने की आवश्यकता है iOS5, लेकिन आपको उस क्षेत्र के लिए सभी स्पर्श ईवेंट लाने, अपने आप पर एक मंद पृष्ठभूमि जोड़ने की जरूरत है।


2
2017-09-24 09:51



क्या आपने पुष्टि की है कि यह काम करता है? - Austin Henley
@Austin: मैंने हाल ही में कंटेंटमेंट एपीआई का उपयोग किया है, लेकिन इस उद्देश्य के लिए नहीं। मेरे लिए मूल आकार पर वापस जाने के लिए स्वीकार्य है। - Oliver Michalak
यह सबसे अच्छा समाधान है जो मैं यहां देखता हूं। दृश्य के पर्यवेक्षण के आकार को संशोधित करना, चाहे वह सीमाएं या फ्रेम बदलकर हो, बस परेशानी के लिए पूछ रहा है। यह दृश्य पदानुक्रम के बिट्स के कार्यान्वयन-विशिष्ट ज्ञान को मानता है जिसे आप नियंत्रित नहीं करते हैं। - jdc


अभिविन्यास के परिवर्तन पर, यह कोड सही काम करता है ....

सेटिंगViewController.modalPresentationStyle = UIModalPresentationFormSheet;

    [self presentViewController:settingViewController animated:YES completion:nil];

    settingViewController.view.superview.frame = CGRectMake(0, 0, 700, 700);

    UIInterfaceOrientation currentOrientation = [self getDeviceOrientation];

    if(currentOrientation == UIInterfaceOrientationPortrait || currentOrientation == UIInterfaceOrientationPortraitUpsideDown)
    {
            CGPoint centerPoint = CGPointMake([[UIScreen mainScreen] bounds].size.width/2, [[UIScreen mainScreen] bounds].size.height/2);
            settingViewController.view.superview.center = centerPoint;
    }
    else
    {
        CGPoint centerPoint = CGPointMake([[UIScreen mainScreen] bounds].size.height/2, [[UIScreen mainScreen] bounds].size.width/2);
        settingViewController.view.superview.center = centerPoint;
    }

0
2018-05-01 12:24