2013-05-24 15 views
5

Apro il pop-up UIPopoverController con UITableViewController come controller della vista del contenuto.Altezza extra della visualizzazione contenuto del popover

Il popover ha le dimensioni corrette e la vista del contenuto a prima vista è corretta, ma se provo a scorrere all'interno del popover, scorre, anche se non dovrebbe. Sembra che la vista del contenuto diventi circa 20 px più in alto dopo - (void) viewDidAppear (foto 1, 2). cosa devo fare per controllare i formati:

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

uscita è

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

A questo punto la dimensione è giusta, ed è pari alla dimensione di popover. Dopo che il popover è aperto, la sua dimensione interna senza margini è di 66 px (misurata con l'aiuto dell'app Ruler). Quindi, sembra che dovrebbe adattarsi esattamente alle dimensioni della visualizzazione del contenuto. Ma lo scorrimento verticale inaspettato appare in qualche modo.

Che, se aggiungo 20 px all'altezza del popover, [mOptionPopoverController setPopoverContentSize:(CGSize){200, 86}]; di quanto è vista dei contenuti aumenta anche e si adatta come previsto, senza alcun scroller. L'unico problema è che non ho bisogno di 20 px vuoti nella parte inferiore del popover (immagine 3).

Ho realizzato un piccolo progetto di prova per riprodurre il mio problema. Ecco il codice importante:

@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 

fig.1 enter image description here

fig.2 enter image description here

fig.3 enter image description here

e qui è quello che mi aspetterei: enter image description here

UPD.

Ho fatto ulteriori indagini. Ho usato KVO per seguire i cambiamenti del frame. Mi aspettavo che avrebbe aiutato a trovare qualcosa di utile. E ho trovato qualcosa, ma non ha chiarito le cose.

Così, ho aggiunto [self.view addObserver:self forKeyPath:@"frame" options:NSKeyValueObservingOptionNew context:nil]; nel metodo di TableViewController - (id)initWithStyle:(UITableViewStyle)style, e il metodo di osservazione è

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

E qui viene emesso:

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

(l'ultima da - (void)viewDidAppear:(BOOL)animated).

Perché 84? È 84-66=18, e questi non sono quei 20 px che sto cercando. Inoltre, tutte e tre le chiamate del metodo observer si verificano prima che vengano chiamati il ​​metodo di origine dati tableView. Come può essere conosciuto il frame prima che tableView sia compilato?

(Avere troppe domande che uso attualmente suggerito da @robmayoff tableView.scrollEnabled = NO; sopprime i popover non necessari.)

UPD. Anche il popover di stampa del sistema Apple dispone di 20 px e di uno scroller non necessario nell'elenco di selezione della stampante.

+0

Hai provato semplicemente impostando 'popoverViewController.tableView.scrollEnabled = NO'? So che non spiega perché stai avendo il tuo problema, ma dovrebbe prevenirlo. –

+0

@robmayoff Grazie per l'idea. L'ho provato, non ha più lo scroller. Userò questa soluzione se non ci saranno suggerimenti migliori. – Anastasia

+0

Qual è la configurazione del tuo UITableView? Non c'è un'intestazione o un piè di pagina 20px o c'è qualcosa che non va? –

risposta

1

Questo è apparentemente il bug di Apple, poiché questa domanda è stata richiesta agli ingegneri della mela durante il WWDC 2013 e non ha avuto risposta.

La soluzione è

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

provare a impostare la proprietà di scorrimento della visualizzazione tabella come segue.

tableView.scrollEnabled = NO; 
+0

Grazie, l'ho provato come suggerito nel primo commento alla mia domanda, e funziona, ma sfortunatamente non spiega il motivo del problema. – Anastasia

Problemi correlati