एम्बेडेड नेविगेशन कंट्रोलर के साथ पॉपओवर बैक नेवी पर आकार का सम्मान नहीं करता है


89

मेरे पास एक UIPopoverController है जो UINavigationController की मेजबानी कर रही है, जिसमें व्यू कंट्रोलर्स का एक छोटा पदानुक्रम है।

मैंने डॉक्स का अनुसरण किया और प्रत्येक दृश्य नियंत्रक के लिए, मैंने दृश्य के पॉपओवर-संदर्भ आकार को इस तरह सेट किया:

[self setContentSizeForViewInPopover:CGSizeMake(320, 500)];

(प्रत्येक नियंत्रक के लिए अलग आकार)

यह अपेक्षा के अनुसार काम करता है क्योंकि मैं पदानुक्रम में आगे बढ़ता हूं - पॉपओवर स्वचालित रूप से धक्का नियंत्रक के अनुरूप आकार में परिवर्तन को एनिमेट करता है।

हालाँकि, जब मैं नेविगेशन बार के बैक बटन के माध्यम से व्यू स्टैक के माध्यम से "बैक" नेविगेट करता हूं, तो पॉपओवर आकार नहीं बदलता है - यह उतना ही बड़ा रहता है जितना कि सबसे गहरा दृश्य पहुंचता है। यह मुझे टूटा हुआ लगता है; मुझे उम्मीद है कि पॉपओवर उन आकारों का सम्मान करेगा जो दृश्य स्टैक के माध्यम से पॉप अप के रूप में स्थापित हैं।

क्या मैं कुछ भूल रहा हूँ?

धन्यवाद।


आप कहां पॉपओवर का आकार निर्धारित कर रहे हैं? क्या आप इसे हर बार रीसेट कर रहे हैं जब एक दृश्य नियंत्रक प्रदर्शित होता है (उदाहरण के लिए viewWillAppear:)?
ओले बेगमैन

आपके द्वारा अनुसरण किए गए दस्तावेज़ का क्या अर्थ है?
टॉम हैमिंग

जवाबों:


94

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

उस दर्द के लिए एक समाधान इस प्रकार है: आपको currentSetSizeForPopoverviewDidAppear में आकार रीसेट करना होगा । लेकिन आपको सावधान रहना होगा, जब आप उसी आकार को सेट करेंगे जो पहले से ही फ़ील्ड में सेट किया गया था currentSetSizeForPopoverतो पॉपओवर आकार को नहीं बदलेगा। ऐसा होने के लिए, आप सबसे पहले नकली आकार सेट कर सकते हैं (जो कि पहले सेट किए गए एक से भिन्न होगा) उचित आकार सेट करके। यह कंट्रोलर तब भी काम करेगा, जब आपका कंट्रोलर नैविगेशन कंट्रोलर के अंदर नेस्टेड हो और पॉपओवर अपने साइज के हिसाब से बदलेगा जब आप कंट्रोलर्स के बीच वापस नेविगेट करेंगे।

आप निम्न सहायक विधि के साथ आसानी से UIViewController पर श्रेणी बना सकते हैं जो आकार सेट करने के साथ चाल करेगा:


- (void) forcePopoverSize {
    CGSize currentSetSizeForPopover = self.contentSizeForViewInPopover;
    CGSize fakeMomentarySize = CGSizeMake(currentSetSizeForPopover.width - 1.0f, currentSetSizeForPopover.height - 1.0f);
    self.contentSizeForViewInPopover = fakeMomentarySize;
    self.contentSizeForViewInPopover = currentSetSizeForPopover;
}

फिर इसे -viewDidAppearवांछित नियंत्रक के लिए आमंत्रित करें ।


1
उपर्युक्त श्रेणी एकमात्र (समझदार) तरीका है जिससे मैं इसे काम कर सकता हूं। धन्यवाद।
रिकीगंज

यह काम। मुझे यह पता लगाने की आवश्यकता है कि कॉन्ट्रैक्टिंग क्षेत्र में "ब्लैक" बनने से टेबल व्यू को कैसे रखा जाए जब पॉपओवर सिकुड़ जाता है, लेकिन यह समाधान (आखिरकार!) वास्तव में प्रत्येक स्टैक स्तर के लिए सही आकार में ले जाने की अनुमति देता है। धन्यवाद!
बेन ज़ोट्टो

2
मैंने इसे [UIView startAnimations: nil संदर्भ: nil] में लपेटा; और [उविवि प्रतिबद्धताओं]; - यह कम मरोड़ देता है।
डस्टिन

2
मेरे लिए, self.contentSizeForViewInPopover = CGSizeZero का उपयोग करना; एक लाइन को बचाया और एक ही प्रभाव था। बहुत धन्यवाद!
रोब ५४०

यदि मुझे स्वयं जोड़ा जाता है, तो मैं केवल इस समाधान को प्राप्त कर सकता हूं। CcontizeZero = CGSizeZero; मेरे विचार में मैं कुलपति की वीसी के तरीके से संपर्क कर रहा था।
लाइटनिंगस्ट्रीक

18

यहाँ मैंने इसे iOS 7 और 8 के लिए कैसे हल किया:

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

वैसे भी, नेविगेशन कंट्रोलर स्टैक पर प्रस्तुत किए गए व्यू कंट्रोलर के लिए, जो सभी अपने स्वयं के आकार चाहते हैं, इन व्यू कंट्रोलर्स को इस कोड को कॉल करने के लिए गतिशील रूप से पसंदीदा सेट करने के लिए (iOS 8 के तहत) की आवश्यकता होती है:

self.presentingViewController.presentedViewController.preferredContentSize = CGSizeMake(320, heightOfTable);

अपनी गणना तालिका या दृश्य ऊंचाई के साथ ऊँचाई बदलें।

बहुत सारे डुप्लिकेट कोड से बचने के लिए और एक सामान्य iOS 7 और iOS 8 समाधान बनाने के लिए, मैंने UITableViewController पर एक श्रेणी बनाई है, जब यह कार्य देखने के लिए किया जाता है जब viewDidAppear को मेरे साक्षात्कारों में बुलाया जाता है:

- (void)viewDidAppear:(BOOL)animated 
{
    [super viewDidAppear:animated];
    [self setPopOverViewContentSize];
}

Category.h:

#import <UIKit/UIKit.h>

@interface UITableViewController (PreferredContentSize)

- (void) setPopOverViewContentSize;

@end

Category.m:

#import "Category.h"

@implementation UITableViewController (PreferredContentSize)

- (void) setPopOverViewContentSize
{
    [self.tableView layoutIfNeeded];
    int heightOfTable = [self.tableView contentSize].height;

    if (heightOfTable > 600)
        heightOfTable = 600;

    if (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad) {
        if ([[[UIDevice currentDevice] systemVersion] floatValue] < 8.0)
            self.preferredContentSize=CGSizeMake(320, heightOfTable);
        else
            self.presentingViewController.presentedViewController.preferredContentSize = CGSizeMake(320, heightOfTable);
    }
}

@end

presentingViewControllerकाम के साथ आपकी टिप । अगर मैं सेट preferredContentSizeमें viewDidLoadएक अजीब व्यवहार है वहाँ: एक गलत पॉपओवर आकार बदलने के लिए पॉपओवर सुराग में अन्य दृश्य नियंत्रक से नेविगेट वापस। ऐसा प्रतीत होता है कि शून्य का पॉपओवर आकार सेट किया गया था, लेकिन आकार सही है। ऐसे मामले में पॉपओवर पूरे स्क्रीन को ऊंचाई पर ले जाता है। क्या आप जानते हैं कि शायद ऐसा क्यों है? मेरे पास लागू 600 अंकों के साथ प्रतिबंध नहीं है क्योंकि मेरे अनुभव में ऑपरेटिंग सिस्टम आपको स्क्रीन आकार से अधिक आकार निर्दिष्ट करने की अनुमति नहीं देता है।
परीक्षण

ViewDidLoad के बजाय viewDidAppear आज़माएं ताकि जब आप स्टैक को वापस नेविगेट करें तो कोड निष्पादित हो।
वेस्ले फीलमैन 18

यही वह तरीका था जो मैंने लिया। लेकिन मुझे नहीं लगता कि अगर आप इसे सेट करते हैं तो यह काम क्यों नहीं करेगा viewDidLoad...
परीक्षण

1
दुर्भाग्य से यह सिर्फ ऐपल ने व्यू स्टैक नहीं लिखा है। ये कंटेंटसाइज़ वैल्यू वास्तव में तब तक कायम नहीं रहते हैं जब व्यू-कॉन्ट्रोलर व्यू से छिपा होता है। यही कारण है कि आपको हर बार किसी दृश्य को धक्का या पॉप द्वारा अग्रभूमि में "याद दिलाने" के लिए होता है। मेरी सलाह है कि अगर आपको लगता है कि इस जानकारी को बनाए रखना चाहिए तो आपको Apple के साथ एक बग रिपोर्ट दर्ज करनी होगी।
वेस्ले फेलमैन

12

यह krasnyk के उत्तर पर एक सुधार है ।
आपका समाधान बहुत अच्छा है, लेकिन यह आसानी से एनिमेटेड नहीं है।
थोड़ा सुधार अच्छा एनीमेशन देता है: विधि

में अंतिम पंक्ति निकालें - (void) forcePopoverSize:

- (void) forcePopoverSize {
    CGSize currentSetSizeForPopover = self.contentSizeForViewInPopover;
    CGSize fakeMomentarySize = CGSizeMake(currentSetSizeForPopover.width - 1.0f, currentSetSizeForPopover.height - 1.0f);
    self.contentSizeForViewInPopover = fakeMomentarySize;
}

- (void)viewWillAppear:(BOOL)animatedविधि में [आत्म ForcePopoverSize] रखो :

- (void)viewWillAppear:(BOOL)animated
{
    [super viewWillAppear:animated];

    [self forcePopoverSize];
}

और अंत में - - (void)viewDidAppear:(BOOL)animatedविधि में वांछित आकार सेट करें :

- (void)viewDidAppear:(BOOL)animated
{
    [super viewDidAppear:animated];

    CGSize currentSetSizeForPopover = self.contentSizeForViewInPopover;
    self.contentSizeForViewInPopover = currentSetSizeForPopover;
}

8

आपको सामग्री का आकार फिर से सेट करने की आवश्यकता है viewWillAppear। डेलिगेट पद्धति को कॉल करके जिसमें आप पॉपओवरकंट्रोलर का आकार निर्धारित करते हैं। मेरा भी यही मुद्दा था। लेकिन जब मैंने इसे जोड़ा तो समस्या हल हो गई।

एक और बात: यदि आप 5 से कम बीटा वर्जन का उपयोग कर रहे हैं, तो पॉपओवर को प्रबंधित करना अधिक कठिन है। वे बीटा संस्करण से अधिक अनुकूल प्रतीत होते हैं। 5. यह अच्छा है कि अंतिम संस्करण बाहर है। ;)

उम्मीद है की यह मदद करेगा।


मुझे इससे भी नफरत है। इसने मुझे भी पकड़ लिया। Apple: हम एक निर्दिष्ट आकार के लिए एक पॉपओवर को क्यों नहीं रोक सकते हैं?
Jann

2
viewWillAppearमेरे लिए काम नहीं किया सामग्री आकार निर्धारित करना । पॉपओवर का आकार निर्धारित करना स्पष्ट रूप से काम करता है, लेकिन यह यहूदी बस्ती है।
बेन ज़ोट्टो

@quixoto मैं नहीं जानता कि आपकी समस्या क्या थी लेकिन मैं अभी भी उसी चीज का उपयोग करता हूं और यह पूरी तरह से काम करता है।
मधुप सिंह यादव

5

में -(void)viewDidLoadआप नेविगेशन नियंत्रक में उपयोग कर रहे हैं सभी को ध्यान में रखते नियंत्रकों, जोड़ें:

[self setContentSizeForViewInPopover:CGSizeMake(320, 500)];

3

मैं दृश्य में आकार को रीसेट करता हूँ। वीडियो: (BOOL) एनिमेटेड कंट्रोलर का अनुप्राणित तरीका है जो पीछे से नेविगेट किया जा रहा है:

-(void)viewWillDisappear:(BOOL)animated {
    [super viewWillDisappear:animated];
    CGSize contentSize = [self contentSizeForViewInPopover];
    contentSize.height = 0.0;
    self.contentSizeForViewInPopover = contentSize;
}

फिर जब दृश्य को वापस नेविगेट किया जा रहा है, तो मैं आकार को उचित रूप से रीसेट करता हूं:

-(void)viewDidAppear:(BOOL)animated {
    [super viewDidAppear:animated];
    CGSize contentSize;
    contentSize.width = self.contentSizeForViewInPopover.width;
    contentSize.height = [[self.fetchedResultsController fetchedObjects] count] *  self.tableView.rowHeight;
    self.contentSizeForViewInPopover = contentSize;
}

हम्म .. रीसेट की आवश्यकता नहीं थी। मैं self.contentSizeForViewInPopover = self.view.frame.size को सभी व्यू कंट्रोलर के सभी viewWillAppear में डालता हूं।
alones

मैं fetchedResultsController fetchedObjects के लिए क्या रखूँगा? यह काम करने के लिए नहीं मिल सकता
जूल्स

2

IOS 8 के लिए निम्नलिखित कार्य हैं:

- (void) forcePopoverSize {
    CGSize currentSetSizeForPopover = self.preferredContentSize;
    CGSize fakeMomentarySize = CGSizeMake(currentSetSizeForPopover.width - 1.0f, currentSetSizeForPopover.height - 1.0f);
    self.preferredContentSize = fakeMomentarySize;
    self.navigationController.preferredContentSize = fakeMomentarySize;
    self.preferredContentSize = currentSetSizeForPopover;
    self.navigationController.preferredContentSize = currentSetSizeForPopover;
}

BTW मुझे लगता है, यह पिछले iOS संस्करणों के साथ संगत होना चाहिए ...


मेरे पास iOS8 sdk के साथ संकलित iOS8 में एक ऐप के साथ समस्या थी। यह काम किया, धन्यवाद।
14:11

रोटेशन बदलते समय साइजिंग को ठीक करने के लिए, इस पद्धति willTransitionToTraitCollectionको animateAlongsideTransitionपूर्ण ब्लॉक में कॉल करें ।
गेवा

2
Well i worked out. Have a look.


Made a ViewController in StoryBoard. Associated with PopOverViewController class.


import UIKit

class PopOverViewController: UIViewController {
    override func viewDidLoad() {
        super.viewDidLoad()

        self.preferredContentSize = CGSizeMake(200, 200)

        self.navigationItem.leftBarButtonItem = UIBarButtonItem(barButtonSystemItem: .Done, target: self, action: "dismiss:")

    }

    func dismiss(sender: AnyObject) {
        self.dismissViewControllerAnimated(true, completion: nil)
    }
}




See ViewController:


//
//  ViewController.swift
//  iOS8-PopOver
//
//  Created by Alvin George on 13.08.15.
//  Copyright (c) 2015 Fingent Technologies. All rights reserved.
//

import UIKit

class ViewController: UIViewController, UIPopoverPresentationControllerDelegate
{
    func showPopover(base: UIView)
    {
        if let viewController = self.storyboard?.instantiateViewControllerWithIdentifier("popover") as? PopOverViewController {


            let navController = UINavigationController(rootViewController: viewController)
            navController.modalPresentationStyle = .Popover

            if let pctrl = navController.popoverPresentationController {
                pctrl.delegate = self

                pctrl.sourceView = base
                pctrl.sourceRect = base.bounds

                self.presentViewController(navController, animated: true, completion: nil)
            }
        }
    }

    override func viewDidLoad(){
        super.viewDidLoad()
    }

    @IBAction func onShow(sender: UIButton)
    {
        self.showPopover(sender)
    }

    func adaptivePresentationStyleForPresentationController(controller: UIPresentationController) -> UIModalPresentationStyle {
        return .None
    }
}


Note: The func showPopover(base: UIView) method should be placed before ViewDidLoad. Hope it helps !

1

मेरे लिए यह समाधान काम करता है। यह मेरे दृश्य नियंत्रक से एक विधि है जो UITableViewController का विस्तार करती है और UINavigationController के लिए रूट नियंत्रक है।

-(void)viewDidAppear:(BOOL)animated {
     [super viewDidAppear:animated];
     self.contentSizeForViewInPopover = self.tableView.bounds.size;
}

और व्यू कंट्रोलर के लिए कंटेंट साइज सेट करना न भूलें, जिसे आप नेविगेशन स्टैक में धकेलेंगे

- (void)tableView:(UITableView *)tableView accessoryButtonTappedForRowWithIndexPath:(NSIndexPath *)indexPath{
    dc = [[DetailsController alloc] initWithBookmark:[[bookmarksArray objectAtIndex:indexPath.row] retain] bookmarkIsNew:NO];
    dc.detailsDelegate = self;
    dc.contentSizeForViewInPopover = self.contentSizeForViewInPopover;
    [self.navigationController pushViewController:dc animated:YES]; 
 }

1

यदि आप उस हत्यारे की कल्पना कर सकते हैं, तो मुझे लगता है कि यह थोड़ा बेहतर है:

- (शून्य) forcePopoverSize {
    CGSize currentSetSizeForPopover = self.contentSizeForViewInPopover;
    self.contentSizeForViewInPopover = CGSizeMake (0, 0);
    self.contentSizeForViewInPopover = currentSetSizeForPopover;
}

2
इससे भी बेहतर होगा CGSizeZeroकि आप इसे स्वयं बनाकर इस्तेमाल करेंCGSizeMake(0,0)
जूलियन क्राल

1

स्वीकार किए जाते हैं जवाब आईओएस 8. मैं अपने खुद के उपवर्ग बनाने किए जाने पर क्या किया था के साथ ठीक काम नहीं कर रहा UINavigationControllerहै कि पॉपओवर में इस्तेमाल के लिए और विधि ओवरराइड preferredContentSizeइस तरह से:

- (CGSize)preferredContentSize {
    return [[self.viewControllers lastObject] preferredContentSize];
}

इसके अलावा, कॉल करने के बजाय forcePopoverSize(@krasnyk द्वारा कार्यान्वित की गई विधि) viewDidAppearI में पहले से उल्लेख किए गए नेविगेशन के लिए एक प्रतिनिधि के रूप में एक व्यू-कंट्रोलर (जो पॉपओवर दिखाता है) सेट करने का फैसला किया और (क्या फोर्स मेथड करता है) में:

-(void)navigationController:(UINavigationController *)navigationController
      didShowViewController:(UIViewController *)viewController 
                   animated:(BOOL)animated  

उत्तीर्ण के लिए प्रतिनिधि विधि viewController। एक महत्वपूर्ण बात, forcePopoverSizeएक UINavigationControllerDelegateविधि में करना ठीक है यदि आपको उस एनीमेशन को चिकना करने की आवश्यकता नहीं है यदि ऐसा है तो उसे छोड़ दें viewDidAppear


वोटिंग में कमी क्यों? हो सकता है कि कुछ मतभेद सिर्फ असहमति से अलग हों :)
जूलियन क्राल

hello @ JulianKról, क्या आप इस stackoverflow.com/questions/28112617/… पर नज़र डाल सकते हैं , मुझे भी यही समस्या है।
रंजीत

धन्यवाद, इससे मुझे मदद मिली। अपनी टिप्पणी के शीर्ष पर यह स्पष्ट करना चाहते हैं कि समस्या यह है कि आपको नेविगेशन को अपडेट करने की आवश्यकता है इसलिए दोनों को सेट करना भी सीधे काम करता है।
माइकल कर्नाहन

0

मैं एक ही समस्या का सामना कर रहा था, लेकिन आप viewWillAppear या viewWillDisappear विधि में सामग्री सेट नहीं करना चाहते हैं।

AirPrintController *airPrintController = [[AirPrintController alloc] initWithNibName:@"AirPrintController" bundle:nil];
airPrintController.view.frame = [self.view frame];
airPrintController.contentSizeForViewInPopover = self.contentSizeForViewInPopover;
[self.navigationController pushViewController:airPrintController animated:YES];
[airPrintController release];

उस नियंत्रक के लिए नेविगेशनकंट्रोलर को धक्का देने से पहले उस नियंत्रक के लिए contentSizeForViewInPopover संपत्ति सेट करें


0

मैं निम्नलिखित दृश्य में डालकर भाग्य था:

[self.popoverController setPopoverContentSize:self.contentSizeForViewInPopover animated:NO];

हालाँकि यह उस स्थिति में अच्छी तरह से चेतन नहीं हो सकता है जब आप अलग-अलग आकार के पॉपअप को पुश / पॉप कर रहे हों। लेकिन मेरे मामले में, पूरी तरह से काम करता है!


0

आपको बस इतना करना है:

-पॉपओवर कंटेंट व्यू के व्यूप्लेयर विधि में, नीचे दिए गए स्निपेट को जोड़ें। लोड होने पर आपको पहली बार पॉपओवर के आकार को निर्दिष्ट करना होगा।

CGSize size = CGSizeMake(width,height);
self.contentSizeForViewInPopover = size;

0

मेरे पास यह समस्या थी एक पॉपओवर कंट्रोलर के साथ, जिसका popoverContentSize = CGSizeMake (320, 600) शुरू में, लेकिन इसके ContentViewController (एक UINavigationController) के माध्यम से नेविगेट करने पर बड़ा होगा।

नौसेना नियंत्रक केवल कस्टम UITableViewControllers को पुश और पॉपिंग कर रहा था, इसलिए मेरे कस्टम टेबल व्यू कंट्रोलर क्लास के व्यूडलडैड में मैंने self.contentSizeForViewInPopover = CGSizeMake (320, 556) सेट किया।

44 कम पिक्सेल नव नियंत्रक के बार के खाते में हैं, और अब मेरे पास कोई मुद्दा नहीं है।


0

इसे सभी दृश्य नियंत्रकों में रखें जिन्हें आप पॉपओवर के अंदर धकेल रहे हैं

CGSize currentSetSizeForPopover = CGSizeMake(260, 390);
CGSize fakeMomentarySize = CGSizeMake(currentSetSizeForPopover.width - 1.0f,
                                      currentSetSizeForPopover.height - 1.0f);
self.contentSizeForViewInPopover = fakeMomentarySize;
self.contentSizeForViewInPopover = currentSetSizeForPopover;

viewwillAppear मेथड में। और currentSetSizeForPopover अपना इच्छित आकार सेट करें।
अलोक

0

एक ही समस्या का सामना किया और इसे UIPopoverController के init से पहले नेविगेशन कंट्रोलर और व्यू कंट्रोलर के लिए कंटेंट व्यू साइज सेट करके तय किया।

     CGSize size = CGSizeMake(320.0, _options.count * 44.0);
    [self setContentSizeForViewInPopover:size];
    [self.view setFrame:CGRectMake(0.0, 0.0, size.width, size.height)];
    [navi setContentSizeForViewInPopover:size];

    _popoverController = [[UIPopoverController alloc] initWithContentViewController:navi];

0

मैं बस एक और समाधान की पेशकश करना चाहूंगा, क्योंकि इनमें से कोई भी मेरे लिए काम नहीं करता ...

मैं वास्तव में इस https://github.com/nicolaschengdev/WYPopoverController के साथ इसका उपयोग कर रहा हूं

जब आप पहली बार अपने पॉपअप का उपयोग कहते हैं।

if ([sortTVC respondsToSelector:@selector(setPreferredContentSize:)]) {
   sortTVC.preferredContentSize = CGSizeMake(popoverContentSortWidth,
        popoverContentSortHeight);
}
else 
{
   sortTVC.contentSizeForViewInPopover = CGSizeMake(popoverContentSortWidth, 
        popoverContentSortHeight);
}

फिर उस पॉपअप में इस का उपयोग करें।

-(void)viewWillAppear:(BOOL)animated {
  [super viewWillAppear:YES];

  if ([self respondsToSelector:@selector(setPreferredContentSize:)]) {
    self.preferredContentSize = CGSizeMake(popoverContentMainWidth, 
        popoverContentMainheight);
  }
  else 
  {
    self.contentSizeForViewInPopover = CGSizeMake(popoverContentMainWidth, 
        popoverContentMainheight);
  }
}

-(void)viewDidDisappear:(BOOL)animated {
 [super viewDidDisappear:YES];

self.contentSizeForViewInPopover = CGSizeZero;

}

फिर बच्चे के विचारों के लिए दोहराएं ...


0

यह करने के लिए iOS7 में सही तरीका है, नेविगेशन स्टैक में प्रत्येक दृश्य नियंत्रक में व्यूडीडलड में पसंदीदा सामग्री का आकार सेट करें (केवल एक बार किया जाता है)। तब viewWillAppear में पॉपओवर कंट्रोलर का संदर्भ मिलता है और सामग्री को अपडेट करें।

-(void)viewDidLoad:(BOOL)animated
{
    ...

    self.popoverSize = CGSizeMake(420, height);
    [self setPreferredContentSize:self.popoverSize];
}

-(void)viewWillAppear:(BOOL)animated
{
    ...

    UIPopoverController *popoverControllerReference = ***GET REFERENCE TO IT FROM SOMEWHERE***;
    [popoverControllerReference setPopoverContentSize:self.popoverSize];
}

0

@krasnyk समाधान ने पिछले iOS संस्करणों में अच्छा काम किया लेकिन iOS8 में काम नहीं किया। निम्नलिखित समाधान ने मेरे लिए काम किया।

    - (void) forcePopoverSize {
        CGSize currentSetSizeForPopover = self.preferredContentSize;
       //Yes, there are coupling. We need to access the popovercontroller. In my case, the popover controller is a weak property in the app's rootVC.
        id mainVC = [MyAppDelegate appDelegate].myRootVC;
        if ([mainVC valueForKey:@"_myPopoverController"]) {
            UIPopoverController *popover = [mainVC valueForKey:@"_myPopoverController"];
            [popover setPopoverContentSize:currentSetSizeForPopover animated:YES];
        }
    }

यह सबसे अच्छा समाधान नहीं है, लेकिन यह काम करता है।

नए UIPopoverPresentationController का आकार बदलने वाला मुद्दा भी है :(।


1
शायद AppDelegate संपत्ति से दृश्य नियंत्रक तक पहुंचने के बजाय मेरे समाधान पर विचार करें (क्लीनर होना प्रतीत होता है)
जूलियन क्राल

हां, यह मेरे किसी मौजूदा कोडबेस को संशोधित किए बिना सबसे तेज समाधान था। Btw vl try ur solution
क्लेमेंट प्रेम

0

आपको preferredContentSizeनेविगेशनकंट्रोलर की संपत्ति निर्धारित करने की आवश्यकता है viewWillAppear:

-(void)viewWillAppear:(BOOL)animated {
[super viewWillAppear:animated];
self.navigationController.preferredContentSize = CGSizeMake(320, 500);}
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.