2013-05-24 12 views
5

मैं UIPopoverController पॉपओवर UITableViewController के साथ सामग्री दृश्य नियंत्रक के रूप में खोलता हूं।पॉपओवर की सामग्री दृश्य की अतिरिक्त ऊंचाई

पॉपओवर का उचित आकार है, और पहली नज़र में यह सामग्री दृश्य सही समायोजित करता है, लेकिन यदि मैं पॉपओवर के अंदर स्क्रॉल करने का प्रयास करता हूं, तो यह स्क्रॉल करता है, हालांकि यह नहीं होना चाहिए। ऐसा लगता है कि सामग्री दृश्य लगभग 20 पीएक्स उच्च हो जाता है - (शून्य) viewDidAppear (तस्वीर 1, 2)। मैं आकार की जाँच करने के क्या करते हैं:

- (void)viewDidAppear:(BOOL)animated 
{ 
    NSLog(@"%@", self.view); 
} 

आउटपुट

Popovers[3016:c07] <UITableView: 0x10b80600; frame = (0 0; 200 66); autoresize = W+H; gestureRecognizers = <NSArray: 0x1004cc20>; layer = <CALayer: 0x1004c4a0>; contentOffset: {0, 0}> 

इस बिंदु आकार सही है पर है, और यह पॉपओवर के आकार के बराबर है। पॉपओवर खोले जाने के बाद मार्जिन के बिना आंतरिक आकार 66 पीएक्स (शासक ऐप की मदद से मापा जाता है)। इसलिए, ऐसा लगता है कि यह सामग्री दृश्य के आकार के लिए बिल्कुल फिट होना चाहिए। लेकिन अप्रत्याशित लंबवत स्क्रॉलिंग किसी भी तरह प्रकट होता है।

से, मैं किसी भी scrollers बिना पॉपओवर की ऊंचाई तक 20 पिक्सल, [mOptionPopoverController setPopoverContentSize:(CGSize){200, 86}]; की तुलना में यह सामग्री दृश्य भी है बढ़ जाती है और अपेक्षा के अनुरूप फिट बैठता है, जोड़ते हैं। केवल मुद्दा यह है कि मुझे पॉपओवर के नीचे खाली 20 पीएक्स की आवश्यकता नहीं है (तस्वीर 3)।

मैंने अपनी समस्या को पुन: उत्पन्न करने के लिए एक छोटी परीक्षा परियोजना बनाई। यहाँ महत्वपूर्ण कोड है:

@implementation ViewController 

- (IBAction)buttonPressed:(id)sender 
{ 
    TableViewController *popoverViewController = [[TableViewController alloc] initWithStyle:UITableViewStyleGrouped]; 
    UIPopoverController* mOptionPopoverController = [[UIPopoverController alloc] initWithContentViewController:popoverViewController]; 
    [mOptionPopoverController setPopoverContentSize:(CGSize){200, 66}]; 
    CGRect popoverRect = [self.view convertRect:[sender frame] fromView:[sender superview]]; 
    [mOptionPopoverController presentPopoverFromRect:popoverRect inView:self.view permittedArrowDirections:UIPopoverArrowDirectionUp animated:YES]; 
} 

@end 

@implementation TableViewController 

- (id)initWithStyle:(UITableViewStyle)style 
{ 
    self = [super initWithStyle:style]; 
    if (self) { 
     self.tableView.bounces = NO; 
    } 
    return self; 
} 

- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView 
{ 
    return 1; 
} 

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section 
{ 
    return 1; 
} 

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    static NSString *CellIdentifier = @"Cell"; 
    UITableViewCell *cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier] autorelease]; 

    return cell; 
} 

- (void)viewDidAppear:(BOOL)animated 
{ 
    NSLog(@"%@", self.view); 
} 

@end 

pic.1 enter image description here

pic.2 enter image description here

pic.3 enter image description here

और यहाँ मैं क्या उम्मीद करेंगे है: enter image description here

यूपीडी।

मैंने आगे की जांच की है। मैंने फ्रेम के परिवर्तनों का पालन करने के लिए केवीओ का उपयोग किया। मैं उम्मीद कर रहा था कि यह कुछ उपयोगी खोजने में मदद करेगा। और मुझे कुछ मिला, लेकिन इससे चीजों को स्पष्ट नहीं किया गया।

तो, मैं TableViewController की - (id)initWithStyle:(UITableViewStyle)style विधि में [self.view addObserver:self forKeyPath:@"frame" options:NSKeyValueObservingOptionNew context:nil]; जोड़ा, और अवलोकन विधि

- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context 
{ 
    NSLog(@"%@", [object valueForKeyPath:keyPath]); 
} 

है और यहाँ आउटपुट है:

2013-05-27 15:52:12.755 Popovers[1547:c07] NSRect: {{0, 0}, {200, 84}} 
2013-05-27 15:52:12.756 Popovers[1547:c07] NSRect: {{0, 0}, {200, 84}} 
2013-05-27 15:52:12.756 Popovers[1547:c07] NSRect: {{0, 0}, {200, 66}} 
2013-05-27 15:52:12.759 Popovers[1547:c07] <UITableView: 0x9337600; frame = (0 0; 200 66); autoresize = W+H; gestureRecognizers = <NSArray: 0x8949760>; layer = <CALayer: 0x8944690>; contentOffset: {0, 0}> 

(पिछले एक - (void)viewDidAppear:(BOOL)animated से है)।

क्यों 84? यह 84-66=18 है, और ये वे 20 पीएक्स नहीं हैं जिन्हें मैं ढूंढ रहा हूं। इसके अतिरिक्त, पर्यवेक्षक की विधि की तीनों कॉल तालिका से पहले होती हैं डेटा स्रोत विधि कहा जाता है। तालिका दृश्य से पहले फ्रेम को कैसे जाना जा सकता है?

(अनावश्यक पॉपओवर को दबाने के लिए वर्तमान में @robmayoff tableView.scrollEnabled = NO द्वारा सुझाए गए बहुत सारे प्रश्न होने के कारण।)

यूपीडी। यहां तक ​​कि ऐप्पल सिस्टम प्रिंटिंग पॉपओवर में प्रिंटर चयन सूची में 20 पीएक्स और अनावश्यक स्क्रोलर है।

+0

आप बस स्थापित करने की कोशिश की 'popoverViewController.tableView.scrollEnabled = NO' है है? मुझे पता है कि यह समझ में नहीं आता है कि आपको अपनी समस्या क्यों है, लेकिन इसे रोकना चाहिए। –

+0

@robmayoff इस विचार के लिए धन्यवाद। मैंने कोशिश की, वास्तव में अब स्क्रोलर नहीं है। यदि कोई बेहतर सुझाव नहीं होगा तो मैं इस कार्यवाही का उपयोग करूंगा। – Anastasia

+0

आपके UITableView की कॉन्फ़िगरेशन क्या है? वहाँ कोई 20px हेडर या पाद लेख नहीं है या कुछ भी लात मार रहा है? –

उत्तर

1

जाहिरा तौर पर एप्पल बग, के रूप में इस सवाल का WWDC 2013 के दौरान सेब इंजीनियरों कहा गया है और कोई जवाब नहीं मिला है।

वैकल्पिक हल

- (CGFloat)tableView:(UITableView *)tableView heightForFooterInSection:(NSInteger)section 
{ 
    return 0.1f; 
} 
0

निम्नानुसार तालिका दृश्य की स्क्रॉल सक्षम प्रॉपर्टी सेट करने का प्रयास करें।

tableView.scrollEnabled = NO; 
+0

धन्यवाद, मैंने इसे अपने प्रश्न पर पहली टिप्पणी में सुझाए गए अनुसार प्रयास किया, और यह काम करता है, लेकिन दुर्भाग्यवश यह समस्या के कारण की व्याख्या नहीं करता है। – Anastasia

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