2013-05-24 4 views
5

Ich öffne UIPopoverController Popover mit UITableViewController als Content-View-Controller.Zusätzliche Höhe des Popover-Inhaltsansicht

Popover hat die richtige Größe, und es ist Content-View auf den ersten Blick passt richtig, aber wenn ich versuche, in Popover blättern, scrollt es, obwohl es nicht sollte. Scheint, dass die Inhaltsansicht nach - (void) viewDidAppear (Bild 1, 2) ungefähr 20 px höher wird. Was muss ich tun Größen zu überprüfen:

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

Ausgabe

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

An diesem Punkt ist die Größe richtig ist, und es ist auf die Größe des popover gleich. Nachdem das Popover geöffnet wurde, beträgt die innere Größe ohne Ränder 66 px (gemessen mit Hilfe der Lineal-App). Es scheint also, dass es genau auf die Größe der Inhaltsansicht passen sollte. Aber unerwartetes vertikales Scrollen erscheint irgendwie.

als, wenn ich hinzufügen 20 px auf die Höhe von popover, [mOptionPopoverController setPopoverContentSize:(CGSize){200, 86}]; als auch Inhalt Ansicht ist erhöht und wie erwartet passt, ohne Wechslern. Das einzige Problem ist, dass ich keine 20 Pixel am unteren Ende des Popover brauche (Bild 3).

Ich machte ein kleines Testprojekt, um mein Problem zu reproduzieren. Hier ist der wichtige Code:

@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 

Abb.1 enter image description here

Abb.2 enter image description here

Abb.3 enter image description here

Und hier ist das, was ich erwarten würde: enter image description here

UPD.

Ich habe weitere Untersuchungen gemacht. Ich verwendete KVO, um die Änderungen des Rahmens zu folgen. Ich habe erwartet, dass es helfen wird, etwas Nützliches zu finden. Und ich habe etwas gefunden, aber es hat die Dinge nicht klarer gemacht.

So fügte ich [self.view addObserver:self forKeyPath:@"frame" options:NSKeyValueObservingOptionNew context:nil]; im - (id)initWithStyle:(UITableViewStyle)style Methode der Tableviewcontroller, und das Beobachtungsverfahren ist

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

Und hier ausgegeben:

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}> 

(der letzte ist von - (void)viewDidAppear:(BOOL)animated).

Warum 84? Es ist 84-66=18, und das sind nicht die 20 px, nach denen ich suche. Darüber hinaus werden alle drei Aufrufe der Methode des Beobachters ausgeführt, bevor die Datenquellenmethode tableView aufgerufen wird. Wie kann der Frame erkannt werden, bevor tableView erstellt wird?

(Ich habe zu viele Fragen, die ich derzeit verwende, vorgeschlagen von @robmayoff tableView.scrollEnabled = NO; um unnötige Popovers zu unterdrücken.)

UPD. Selbst Apple Systemdruck Popover hat diese 20 px und unnötige Scroller in der Druckerauswahlliste.

+0

Haben Sie einfach versucht Einstellung 'popoverViewController.tableView.scrollEnabled = NO'? Ich weiß, es erklärt nicht, warum Sie Ihr Problem haben, aber es sollte es verhindern. –

+0

@robmayoff Vielen Dank für die Idee. Ich habe es versucht, es hat wirklich keinen Scroller mehr. Ich werde diese Problemumgehung verwenden, wenn es keine besseren Vorschläge gibt. – Anastasia

+0

Wie ist die Konfiguration Ihres UITableView? Es gibt keine 20px-Kopf- oder Fußzeile oder irgendetwas, das sich herumschlägt, ist da? –

Antwort

1

Dies ist offenbar der Apple Bug, wie diese Frage wurde Apple Ingenieure während der WWDC 2013 gefragt und bekam keine Antwort.

Die Abhilfe ist

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

versuchen Sie, die scroll-fähige Eigenschaft der Tabellenansicht wie folgt einzustellen.

tableView.scrollEnabled = NO; 
+0

Danke, ich habe es wie im ersten Kommentar zu meiner Frage vorgeschlagen, und es funktioniert, aber leider erklärt es nicht den Grund des Problems. – Anastasia