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
Rys.2
Rys.3
A oto co by się spodziewać:
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.
Czy próbowali po prostu ustawienie 'popoverViewController.tableView.scrollEnabled = NO'? Wiem, że to nie wyjaśnia, dlaczego masz problem, ale powinno temu zapobiec. –
@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
Jaka jest konfiguracja twojego UITableView? Nie ma nagłówka ani stopki 20px, czy coś w tym stylu? –