Warum wird UIViewController unter UINavigationBar erweitert, UITableViewController nicht?

ich habeUITabbarController mitUINavigationController drin. Ich habe eine Unterklasse vonUIView dass ich als die zuweisenview vonUIViewController in demnavController. Das ist ziemlich normal, oder? So mache ich es

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

Dieseview hat einUITableView wiesubView

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

Zum Debuggen setze ichself.backgroundColor = [UIColor blueColor] auf den blick.

Aus der obigen Initialisierung vontableView Man könnte denken, dass die Ansichten und Tabellenframe ist gleich. Allerdings, wenn ich reinlaufeiOS 7, der Ursprung der Ansicht liegt hinter demUINavigationBar. Das ist verständlich, weil ich einstelleself.navigationBar.translucent = YES; in meiner Unterklasse vonUINavigationController. Aber was ich nicht verstehe, ist, warum der Tisch direkt unter dem Tisch stehtnavBar? Sollte es nicht auch ab(0, 0) das ist hinter demnavBar? Siehe ScreenshotScenario 1 unten. Beachten Sie den blauen Farbton dahinternavBar

Jetzt ichpush Ein weitererviewController auf dem Navigationsstapel, einfach mit[self.navigationController pushViewController.....]. Wieder habe ich einen BrauchUIView mit einertableView drin. Ich habe aber auch eineUILabel über dieser Tabelle, und wieder zum Debuggen, gab ich es einredColor. Diesmal setze ich die Etikettenorigin fast so sein wie die Aussicht

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);

Nach der obigen Logik sollte das Etikett also sichtbar sein, oder? Aber diesmal ist es nicht. Diesmal steht das Label hinter demnavBar.

Beachten Sie den roten Farbton hinter der Navigationsleiste.

Ich möchte die Unteransicht unter der Navigationsleiste wirklich konsequent ausrichten. Meine Fragen sind

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?

Antworten auf die Frage(3)

Ihre Antwort auf die Frage