2013-05-24 20 views
5

Otwieram pop-up UIPopoverController z UITableViewController jako kontrolerem widoku treści.Dodatkowa wysokość widoku zawartości popover

Popover ma odpowiedni rozmiar, a jego wygląd na pierwszy rzut oka jest poprawny, ale jeśli spróbuję przewinąć wewnątrz popover, przewija się, ale nie powinien. Wydaje się, że widok zawartości staje się o około 20 pikseli wyższy po - (void) viewDidAppear (rys. 1, 2). Co mam zrobić, aby sprawdzić rozmiary:

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

Wyjście jest

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

W tym momencie wielkość jest poprawna i jest ona równa wielkości popover. Po otwarciu okna popover jego wewnętrzny rozmiar bez marginesów wynosi 66 px (mierzony za pomocą aplikacji Linijka). Wygląda więc na to, że powinien dokładnie pasować do rozmiaru widoku treści. Ale pojawia się nieoczekiwane przewijanie w pionie.

Niż gdybym dodać 20 px do wysokości popover, [mOptionPopoverController setPopoverContentSize:(CGSize){200, 86}]; niż to widok zawartość również zwiększa i pasuje jak oczekiwano, bez przewijacze. Jedynym problemem jest to, że nie potrzebuję pustego 20 px na dole popover (rys. 3).

Zrobiłem mały testowy projekt, aby odtworzyć mój problem. Oto ważny kod:

@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 

Rys.1 enter image description here

Rys.2 enter image description here

Rys.3 enter image description here

A oto co by się spodziewać: enter image description here

UPD.

Przeprowadziłem dalsze dochodzenie. Użyłem KVO, aby śledzić zmiany w ramce. Spodziewałem się, że pomoże to znaleźć coś pożytecznego. I znalazłem coś, ale to nie sprawiło, że sprawy stały się jaśniejsze.

Więc dodałem [self.view addObserver:self forKeyPath:@"frame" options:NSKeyValueObservingOptionNew context:nil]; w sposobie TableViewController - (id)initWithStyle:(UITableViewStyle)style, a metoda obserwacji jest

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

I tu jest wyjście:

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

(ostatnia jest z - (void)viewDidAppear:(BOOL)animated).

Dlaczego 84? Jest to 84-66=18 i nie są to te 20 pikseli, których szukam. Dodatkowo wszystkie trzy wywołania metody obserwatora mają miejsce przed wywołaniem metody tableView źródła danych. W jaki sposób ramka może być znana przed zbudowaniem tableView?

(Posiadanie zbyt wielu pytań, z których obecnie korzystam, zasugerowano przez @robmayoff tableView.scrollEnabled = NO; w celu powstrzymania niepotrzebnych przeskoków.)

UPD. Nawet popover do drukowania systemu Apple ma ten 20-procentowy i niepotrzebny przewijak na liście wyboru drukarki.

+0

Czy próbowali po prostu ustawienie 'popoverViewController.tableView.scrollEnabled = NO'? Wiem, że to nie wyjaśnia, dlaczego masz problem, ale powinno temu zapobiec. –

+0

@robmayoff Dziękujemy za pomysł. Próbowałem, to naprawdę nie ma już rolki. Zastosuję to obejście, jeśli nie będzie lepszych sugestii. – Anastasia

+0

Jaka jest konfiguracja twojego UITableView? Nie ma nagłówka ani stopki 20px, czy coś w tym stylu? –

Odpowiedz

1

To jest najwyraźniej Apple Bug, ponieważ to pytanie zostało zadane inżynierom Apple podczas WWDC 2013 i nie otrzymał odpowiedzi.

Rozwiązaniem jest

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

spróbuj ustawić właściwość przewijania z włączonym widokiem tabeli w następujący sposób.

+0

Dzięki, próbowałem go, jak zasugerowałem w pierwszym komentarzu do mojego pytania, i działa, ale niestety nie wyjaśnia przyczyny problemu. – Anastasia

Powiązane problemy