Pourquoi ne UIViewController étendre sous UINavigationBar, tandis que UITableViewController ne l'est pas?

J'ai UITabbarController avec UINavigationController en elle. J'ai une sous-classe de UIView que j'attribue le view de UIViewController dans le navController. C'est assez standard, non? C'est la façon dont je le fais

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

Ce view a un UITableView comme subView

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

Pour des raisons de débogage je suis en train de self.backgroundColor = [UIColor blueColor] sur la vue.

À partir du dessus de l'initialisation de tableView on pourrait penser que la vue et de la table de frame est le même. Cependant quand je lance en iOS 7, le point de vue de l'origine est située derrière le UINavigationBar. Cela est compréhensible parce que je suis en train de self.navigationBar.translucent = YES; dans mon sous-classe de UINavigationController. Mais ce que je ne comprends pas, c'est comment la table est assis juste en dessous de la navBar? Ne devrait-elle pas également démarrer à partir de (0, 0) qui est derrière le navBar? Voir la capture d'écran Scenario 1 ci-dessous. Avis de la teinte bleue derrière navBar

Pourquoi ne UIViewController étendre sous UINavigationBar, tandis que UITableViewController ne l'est pas?

Maintenant, je push un autre viewController sur la pile de navigation, en utilisant simplement [self.navigationController pushViewController.....]. De plus, j'ai une coutume UIView avec un tableView en elle. Cependant, j'ai un UILabel au-dessus de cette table, et, de nouveau, à des fins de débogage, je lui ai donné un redColor. Cette fois, je suis en train de l'étiquette du origin à être presque le même que le point de vue de l'

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

Donc, en allant par la logique ci-dessus, l'étiquette doit être visible, à droite? Mais cette fois, il ne l'est pas. Cette fois, le label est derrière le navBar.

Pourquoi ne UIViewController étendre sous UINavigationBar, tandis que UITableViewController ne l'est pas?

Avis, la teinte rouge derrière la barre de navigation.

Je tiens vraiment à aligner la sous-vue en dessous de la barre de navigation de manière cohérente. Mes questions sont les

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?

  • Vous construisez avec Xcode 5 et le iOS7 SDK?