Dlaczego UIViewController rozszerza się w ramach UINavigationBar, podczas gdy UITableViewController nie?

mamUITabbarController zUINavigationController w tym. Mam podklasęUIView które przypisuję jakoview zUIViewController wnavController. To dość standardowe rzeczy, prawda? Tak to robię

_productCategoryView = [[ProductCategoryView alloc] initWithFrame:self.view.frame];
self.view = _productCategoryView;

Toview maUITableView tak jaksubView

_productCategoryTableView = [[UITableView alloc] initWithFrame:self.frame style:UITableViewStylePlain];
_productCategoryTableView.separatorStyle = UITableViewCellSeparatorStyleNone;
_productCategoryTableView.backgroundColor = [UIColor clearColor];
[self addSubview:_productCategoryTableView];

Ze względu na debugowanie ustawiamself.backgroundColor = [UIColor blueColor] na widoku.

Z powyższej inicjalizacjitableView można by pomyśleć, że widok i stółframe jest taki sam. Jednak kiedy wbiegamiOS 7, pochodzenie widoku jest ustawione zaUINavigationBar. Jest to zrozumiałe, ponieważ ustawiamself.navigationBar.translucent = YES; w mojej podklasieUINavigationController. Ale nie rozumiem, jak to się dzieje, że stolik siedzi tuż poniżejnavBar? Nie powinien też zaczynać(0, 0) który jest zanavBar? Zobacz zrzut ekranuScenario 1 poniżej. Zwróć uwagę na niebieski odcieńnavBar

Teraz japush inneviewController na stosie nawigacji, po prostu używając[self.navigationController pushViewController.....]. Znowu mam zwyczajUIView ztableView w tym. Jednak mam teżUILabel powyżej tej tabeli i ponownie do debugowania, dałem jejredColor. Tym razem ustawiam etykietęorigin być prawie taki sam jak widok

CGRect boundsInset = UIEdgeInsetsInsetRect(self.bounds, UIEdgeInsetsMake(10, 10, 10, 10));

CGSize textSize = [_titleLabel.text sizeWithFont:_titleLabel.font
                               constrainedToSize:CGSizeMake(boundsInset.size.width, MAXFLOAT)
                                   lineBreakMode:NSLineBreakByWordWrapping];
printSize(textSize);
_titleLabel.frame = CGRectMake(boundsInset.origin.x,
                               boundsInset.origin.y,
                               boundsInset.size.width,
                               textSize.height);

Tak więc, kierując się powyższą logiką, etykieta powinna być widoczna, prawda? Ale tym razem tak nie jest. Tym razem etykieta jest zanavBar.

Zwróć uwagę, czerwony odcień za navBar.

Naprawdę chciałbym konsekwentnie wyrównać subView pod navBar. Moje pytania są

1. How is the tableView offset by 64pixels (height of nav + status bar in iOS 7) automatically, even though it's frame is same as the view's?

2. Why does that not happen in the second view?

questionAnswers(3)

yourAnswerToTheQuestion