2011-12-15 11 views
26

मेरे पास UIViewController है जिसमें UITableView है। यह UIViewControllerUIPopoverController में प्रदर्शित किया जा रहा है।UIPopoverController की सामग्री को गतिशील रूप से बदलने के लिए कैसे करें?

अब, चीजें हैं जो tableView में आइटमों की संख्या स्थिर नहीं है है, और मैं पॉपओवर का आकार (जो है - popoverContentSize) चाहते हैं, tableView

में आइटमों की संख्या के अनुसार समायोजित करने के लिए

निष्क्रिय, मैं सोच रहा था कि viewDidLoad में में सेट करने के बाद मैं सभी आइटमों के साथ tableView लोड कर रहा हूं - यह कर देगा।

ऐसा नहीं हुआ।

तो इसे छोटा करें, मेरा सवाल है: मैंसे सीधे से कैसे बदल सकता हूं - इसे प्रस्तुत करने के बाद?

परिशिष्ट: enter image description here

उत्तर

46

मैं जवाब देने के लिए बहुत देर हो सकती है लेकिन iOS 7 से नए उपयोगकर्ता के लिए निम्न पंक्ति अपने UIViewController मैं, ई में contentViewController अपने UIPopOverViewConotroller की

-(void) viewDidAppear:(BOOL)animated{ 
    [super viewDidAppear:animated]; 
    self.preferredContentSize=myTableView.contentSize; 
} 

आशा इस वसीयत का इस्तेमाल करें आईओएस 7 उपयोगकर्ता के लिए मदद करें।

+8

यह ViewWillAppear में बेहतर काम कर सकता है, जैसा कि दृश्य प्रकट होने से पहले होता है। – nh32rg

+1

यदि आप पॉपओवर के अंदर नेविगेशन नियंत्रक का उपयोग कर रहे हैं और समस्या पसंदीदा सामग्री सेट करने के बाद भी हो रही है। कोशिश करें [self.parentPopOverController setPopoverContentSize: CGSizeMake (250, 400) एनिमेटेड: हाँ]; UIViewController – Hassy

+1

को धक्का देने से पहले अपने उत्तर को स्वीकार किया क्योंकि यह अधिक अद्यतित है। धन्यवाद! –

9

खैर, अंत मैं कुछ है कि मुझे यकीन है कि अगर यह करना सही बात है, लेकिन यह काम कर रहा है नहीं कर रहा हूँ किया है। तब

@property (nonatomic , assign) UIPopoverController *popoverControllerContainer; 

, मैं viewWillAppear और viewDidAppear को आकार बदलने कोड कहा::

मैं popoverController करने के लिए अपने contentViewController में एक संदर्भ जोड़ा

- (void)viewDidLoad 
{ 
    [super viewDidLoad]; 
    [self.tableView reloadData]; 
} 

-(void) viewWillAppear:(BOOL)animated 
{ 
    [super viewWillAppear:animated]; 
    self.contentSizeForViewInPopover = self.tableView.contentSize; 
} 

-(void) viewDidAppear:(BOOL)animated 
{ 
    [super viewDidAppear:animated]; 
    [self.popoverControllerContainer setPopoverContentSize:self.contentSizeForViewInPopover animated:YES]; 
} 

तो, करने के लिए पॉपओवर है एक संदर्भ रखते हुए हैक-आश की तरह, इसलिए मैं बेहतर विचार सुनने के लिए खुला हूं।

+0

मैं का उपयोग करना चाहिए: मेरी जड़ मेनू दृश्य नियंत्रक वर्ग, अन्य सभी मेनू दृश्य नियंत्रकों के वारिस, निम्नलिखित कोड जोड़ने जहाँ से में एक ही तंत्र मैं UIViewControllers को विधि 'createPopover' जोड़ रहा हूं जिसे पॉपओवर सामग्री के रूप में उपयोग किया जाता है। विधियां 'स्वयं' से पॉपओवर बनाती हैं और फिर आगे पहुंच के लिए पॉपओवर इंस्टेंस सहेजती हैं। – Sulthan

+0

हैलो @ अब्राहम आपका जवाब वह था जिसे मैंने उपयोग किया था और यह बहुत अच्छा काम कर रहा है। मेरे समाधान के बारे में आपके पास एक प्रश्न है: आपने दिखाई देने वाली विधि में दृश्य का सामग्रियों को क्यों सेट किया था और पॉपओवर आकार में दिखाई दिया था? यह दो तरीकों में से एक में क्यों नहीं किया जा सकता है, क्योंकि मैंने कोशिश की और यह काम नहीं किया? –

+0

दोनों कोड एक दूसरे का उपयोग करें और यह काम करेगा :) –

7

एक UIViewController वर्ग संपत्ति

self.contentSizeForViewInPopover 

जो w/बाहर यह करने के लिए एक संदर्भ जोड़ने के लिए की आवश्यकता होगी, के ऊपर पॉप आकार परिवर्तन नहीं करते है।

और समाधान पर विस्तार करने के लिए, मैंने अनुभाग का आकार प्राप्त करने के लिए rectForSection: विधि का उपयोग किया (मेरा केवल 1 अनुभाग है, इतना आसान है) और फिर नेविगेशन बार की ऊंचाई जोड़ दी गई (ऐसा लगता है कि यह नेविगेशन बार की ऊंचाई (ऐसा लगता है) 20)। तो मैं पॉपओवर समाप्त तालिका दृश्य के आकार बनाने में सक्षम हूँ:

CGRect sectionRect = [view.tableView rectForSection:0]; 

if (sectionRect.size.height + 20 < POPOVER_SIZE.height) 
    view.contentSizeForViewInPopover = CGSizeMake(POPOVER_SIZE.width, sectionRect.size.height + 20); 
else 
    view.contentSizeForViewInPopover = POPOVER_SIZE; 

एकाधिक अनुभागों के साथ और अधिक मुश्किल साबित हो सकता है, मैं इसे कोशिश नहीं की। केवल अनुभाग ऊंचाइयों को पूरा करने में सक्षम होना चाहिए, लेकिन कुछ अंतरण समस्याएं हो सकती हैं जिन्हें मैं नहीं जानता।

+2

इसके बहिष्कृत, आईओएस 7 और बाद में "पसंदीदा सामग्री" का उपयोग करें। – Satyam

0

मुझे यह वही समस्या थी और मुझे कोई जवाब नहीं मिला। मैं एक साथ cobbled कि मुझे लगता है कि अच्छी तरह से काम करता है।

मेरे पास मेरे initWithCoder में एक सरणी है जो मेरे मान रखती है। मैं बस यह कोड चलाता हूं:

- (id)initWithCoder:(NSCoder *)aDecoder 
{ 
//Popover Choices 

_importantChoices = [NSMutableArray array]; 
[_importantChoices addObject:@"Bakery"]; 
[_importantChoices addObject:@"Beverage Dry Mix"]; 
[_importantChoices addObject:@"Beverage RTD"]; 
[_importantChoices addObject:@"Crisps"]; 
[_importantChoices addObject:@"Meat"]; 
[_importantChoices addObject:@"Supplements"]; 


//Calculate size of Popover 
self.clearsSelectionOnViewWillAppear = NO; 
NSInteger rowsCount = [_importantChoices count]; 
NSInteger singleRowHeight = [self.tableView.delegate tableView:self.tableView 
             heightForRowAtIndexPath:[NSIndexPath indexPathForRow:0 inSection:0]]; 
NSInteger totalRowsHeight = rowsCount * singleRowHeight; 
CGFloat largestLabelWidth = 0; 
for (NSString *tmp in _importantChoices) { 
    CGSize labelSize = [tmp sizeWithAttributes:@{NSFontAttributeName:[UIFont systemFontOfSize:20.0f]}]; 
    if (labelSize.width > largestLabelWidth) { 
     largestLabelWidth = labelSize.width; 
    } 
} 
CGFloat popoverWidth = largestLabelWidth + 100;  //Add a little padding to the width 
self.preferredContentSize = CGSizeMake(popoverWidth, totalRowsHeight); 
return self; 
} 
7

आईओएस 7 या उससे ऊपर के लिए।

- (CGSize)preferredContentSize { 
    return CGSizeMake(320, 550); 
} 

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

- (CGSize)preferredContentSize { 
    return self.topViewController.preferredContentSize; 
} 
+0

रॉबर्ट के दृष्टिकोण की कोशिश करने वाले अन्य लोगों के लिए बस एक नोट। यह बहुत साफ है और इस सवाल के लिए काम करता है। हालांकि, यदि आप UINavigationController के अंदर UITableView प्रस्तुत कर रहे हैं तो यह आपके लिए काम नहीं कर सकता है। अविनाश उस मामले में काम करने लगता है। – DenVog

+0

@DenVog - अच्छी जगह। मैं अभी भी इसके शीर्ष दृश्य नियंत्रक से अपनी पसंदीदा स्टेटस बार प्राप्त करने के लिए 'UINavigationController' को उपclass करना पसंद करूंगा। आम तौर पर मुझे यह निर्धारित करने का दृष्टिकोण मिलता है कि आपको मूल्य निर्धारित करने से बेहतर क्या चाहिए क्योंकि यह बग को रोकता है जहां 2 अलग-अलग वर्ग एक ही संपत्ति पर अलग-अलग मूल्यों के साथ टंपल कर सकते हैं जो आपके द्वारा किए गए आदेश के आधार पर विभिन्न परिणामों का कारण बन सकता है। यह इसी तरह है कि 'पसंदीदाStatusBarStyle' आईओएस 7 में क्यों बनाया गया था। – Robert

+0

यह एकमात्र समाधान था जो मेरे लिए काम करता था। Self.preferredContentSize को सेट करना कोई प्रभाव नहीं पड़ा। – pls

0

iOS8/9 समाधान - बस preferredContentSize ओवरराइड और लौटने यह contentSize है से पहले लेआउट करने के लिए तालिका दृश्य बाध्य करते हैं। >TopMenuViewController - ->SubMenuViewController XN

- (CGSize)preferredContentSize { 
    [self.tableView layoutIfNeeded]; 
    return self.tableView.contentSize; 
} 
+0

यह दृश्य बढ़ता है लेकिन 'UINavigationController' पदानुक्रम में एम्बेड किए जाने पर इसे कभी भी कम नहीं करता है। – Mojo66

1

मेरा ऐप उप-मेनू UINavigationController की तरह एक पॉपओवर से होने वाले और एक नेविगेशन नियंत्रक में एम्बेडेड है, यानी कुछ के साथ एक मेनू है।

उपर्युक्त समाधानों में से कोई भी मेरे लिए काम नहीं करता है।

मेरे समाधान:

- (void)viewDidLoad { 
    [super viewDidLoad]; 
    self.navigationController.preferredContentSize = CGSizeMake(450.0f, 0.0f);// increase standard width (320.0) 
} 


- (void)viewDidAppear:(BOOL)animated { 
    [super viewDidAppear:animated]; 
    self.navigationController.preferredContentSize = self.tableView.contentSize; 
} 
0

यह चाल

override func viewWillLayoutSubviews() { 
    super.viewWillLayoutSubviews() 

    self.preferredContentSize = CGSizeMake(0, self.tableView.contentSize.height)} 
संबंधित मुद्दे